diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-03-23 10:28:42 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-03-23 10:28:42 +0000 |
commit | 2eacc99cd1d398b5b70ee4b14ab52fa3dac52bb9 (patch) | |
tree | fe3ef451ad4f3911987d245d9e74c8ece1415a0e | |
parent | 169f883baa8d69c44f8fa8d9cad6883daf9f8031 (diff) | |
parent | 48c4ec1e9e5613dd0bb12ba43298c92a213a4ccd (diff) |
Snap for 9798568 from 48c4ec1e9e5613dd0bb12ba43298c92a213a4ccd to t-keystone-qcom-release
Change-Id: Iaec91b71c3a43c46c917930318a5b72627cb6fcf
-rw-r--r-- | debuggerd/Android.bp | 6 | ||||
-rw-r--r-- | debuggerd/include/debuggerd/handler.h | 7 | ||||
-rw-r--r-- | healthd/healthd_draw.cpp | 7 | ||||
-rw-r--r-- | healthd/healthd_draw.h | 3 | ||||
-rw-r--r-- | healthd/healthd_mode_charger.cpp | 15 | ||||
-rw-r--r-- | healthd/include_charger/charger/healthd_mode_charger.h | 2 | ||||
-rw-r--r-- | init/reboot.cpp | 6 | ||||
-rw-r--r-- | init/reboot_utils.cpp | 9 | ||||
-rw-r--r-- | init/reboot_utils.h | 3 | ||||
-rw-r--r-- | rootdir/init.rc | 10 | ||||
-rw-r--r-- | trusty/storage/proxy/Android.bp | 2 | ||||
-rw-r--r-- | trusty/storage/proxy/storage.c | 27 |
12 files changed, 83 insertions, 14 deletions
diff --git a/debuggerd/Android.bp b/debuggerd/Android.bp index b6e08fd94..5b9936748 100644 --- a/debuggerd/Android.bp +++ b/debuggerd/Android.bp @@ -13,9 +13,15 @@ cc_defaults { "-Wno-nullability-completeness", "-Os", "-fno-finite-loops", + "-DANDROID_DEBUGGABLE=0", ], local_include_dirs: ["include"], + product_variables: { + debuggable: { + cflags: ["-UANDROID_DEBUGGABLE", "-DANDROID_DEBUGGABLE=1"], + } + }, } cc_library_headers { diff --git a/debuggerd/include/debuggerd/handler.h b/debuggerd/include/debuggerd/handler.h index bc08327a1..68b2e678b 100644 --- a/debuggerd/include/debuggerd/handler.h +++ b/debuggerd/include/debuggerd/handler.h @@ -62,10 +62,11 @@ void debuggerd_init(debuggerd_callbacks_t* callbacks); #define DEBUGGER_SIGNAL BIONIC_SIGNAL_DEBUGGER static void __attribute__((__unused__)) debuggerd_register_handlers(struct sigaction* action) { + bool enabled = true; +#if ANDROID_DEBUGGABLE char value[PROP_VALUE_MAX] = ""; - bool enabled = - !(__system_property_get("ro.debuggable", value) > 0 && !strcmp(value, "1") && - __system_property_get("debug.debuggerd.disable", value) > 0 && !strcmp(value, "1")); + enabled = !(__system_property_get("debug.debuggerd.disable", value) > 0 && !strcmp(value, "1")); +#endif if (enabled) { sigaction(SIGABRT, action, nullptr); sigaction(SIGBUS, action, nullptr); diff --git a/healthd/healthd_draw.cpp b/healthd/healthd_draw.cpp index 3e73fcd08..7c7931944 100644 --- a/healthd/healthd_draw.cpp +++ b/healthd/healthd_draw.cpp @@ -99,7 +99,7 @@ void HealthdDraw::blank_screen(bool blank, int drm) { gr_fb_blank(blank, drm); } -/* support screen rotation for foldable phone */ +// support screen rotation for foldable phone void HealthdDraw::rotate_screen(int drm) { if (!graphics_available) return; if (drm == 0) @@ -108,6 +108,11 @@ void HealthdDraw::rotate_screen(int drm) { gr_rotate(GRRotation::NONE /* Portrait mode */); } +// detect dual display +bool HealthdDraw::has_multiple_connectors() { + return graphics_available && gr_has_multiple_connectors(); +} + void HealthdDraw::clear_screen(void) { if (!graphics_available) return; gr_color(0, 0, 0, 255); diff --git a/healthd/healthd_draw.h b/healthd/healthd_draw.h index 3d4abbdda..016db8e07 100644 --- a/healthd/healthd_draw.h +++ b/healthd/healthd_draw.h @@ -38,6 +38,9 @@ class HealthdDraw { // Rotate screen. virtual void rotate_screen(int drm); + // Detect dual display + virtual bool has_multiple_connectors(); + static std::unique_ptr<HealthdDraw> Create(animation *anim); protected: diff --git a/healthd/healthd_mode_charger.cpp b/healthd/healthd_mode_charger.cpp index aa98d4817..4aae27948 100644 --- a/healthd/healthd_mode_charger.cpp +++ b/healthd/healthd_mode_charger.cpp @@ -289,6 +289,18 @@ static void reset_animation(animation* anim) { anim->run = false; } +void Charger::BlankSecScreen() { + int drm = drm_ == DRM_INNER ? 1 : 0; + + if (!init_screen_) { + /* blank the secondary screen */ + healthd_draw_->blank_screen(false, drm); + healthd_draw_->redraw_screen(&batt_anim_, surf_unknown_); + healthd_draw_->blank_screen(true, drm); + init_screen_ = true; + } +} + void Charger::UpdateScreenState(int64_t now) { int disp_time; @@ -338,6 +350,9 @@ void Charger::UpdateScreenState(int64_t now) { reset_animation(&batt_anim_); next_screen_transition_ = -1; healthd_draw_->blank_screen(true, static_cast<int>(drm_)); + if (healthd_draw_->has_multiple_connectors()) { + BlankSecScreen(); + } screen_blanked_ = true; LOGV("[%" PRId64 "] animation done\n", now); if (configuration_->ChargerIsOnline()) { diff --git a/healthd/include_charger/charger/healthd_mode_charger.h b/healthd/include_charger/charger/healthd_mode_charger.h index 28e1fb531..8957a7b22 100644 --- a/healthd/include_charger/charger/healthd_mode_charger.h +++ b/healthd/include_charger/charger/healthd_mode_charger.h @@ -107,9 +107,11 @@ class Charger { void InitAnimation(); int RequestEnableSuspend(); int RequestDisableSuspend(); + void BlankSecScreen(); bool have_battery_state_ = false; bool screen_blanked_ = false; + bool init_screen_ = false; int64_t next_screen_transition_ = 0; int64_t next_key_check_ = 0; int64_t next_pwr_check_ = 0; diff --git a/init/reboot.cpp b/init/reboot.cpp index 75e4faf60..c008f74bd 100644 --- a/init/reboot.cpp +++ b/init/reboot.cpp @@ -616,7 +616,7 @@ static void DoReboot(unsigned int cmd, const std::string& reason, const std::str if (sem_init(&reboot_semaphore, false, 0) == -1) { // These should never fail, but if they do, skip the graceful reboot and reboot immediately. LOG(ERROR) << "sem_init() fail and RebootSystem() return!"; - RebootSystem(cmd, reboot_target); + RebootSystem(cmd, reboot_target, reason); } // Start a thread to monitor init shutdown process @@ -644,7 +644,7 @@ static void DoReboot(unsigned int cmd, const std::string& reason, const std::str // worry about unmounting it. if (!IsDataMounted("*")) { sync(); - RebootSystem(cmd, reboot_target); + RebootSystem(cmd, reboot_target, reason); abort(); } @@ -777,7 +777,7 @@ static void DoReboot(unsigned int cmd, const std::string& reason, const std::str LOG(INFO) << "Shutdown /data"; } } - RebootSystem(cmd, reboot_target); + RebootSystem(cmd, reboot_target, reason); abort(); } diff --git a/init/reboot_utils.cpp b/init/reboot_utils.cpp index b3fa9fd3b..1f411636c 100644 --- a/init/reboot_utils.cpp +++ b/init/reboot_utils.cpp @@ -106,7 +106,8 @@ bool IsRebootCapable() { return value == CAP_SET; } -void __attribute__((noreturn)) RebootSystem(unsigned int cmd, const std::string& rebootTarget) { +void __attribute__((noreturn)) +RebootSystem(unsigned int cmd, const std::string& rebootTarget, const std::string& reboot_reason) { LOG(INFO) << "Reboot ending, jumping to kernel"; if (!IsRebootCapable()) { @@ -127,10 +128,12 @@ void __attribute__((noreturn)) RebootSystem(unsigned int cmd, const std::string& case ANDROID_RB_THERMOFF: if (android::base::GetBoolProperty("ro.thermal_warmreset", false)) { + std::string reason = "shutdown,thermal"; + if (!reboot_reason.empty()) reason = reboot_reason; + LOG(INFO) << "Try to trigger a warm reset for thermal shutdown"; - static constexpr const char kThermalShutdownTarget[] = "shutdown,thermal"; syscall(__NR_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, - LINUX_REBOOT_CMD_RESTART2, kThermalShutdownTarget); + LINUX_REBOOT_CMD_RESTART2, reason.c_str()); } else { reboot(RB_POWER_OFF); } diff --git a/init/reboot_utils.h b/init/reboot_utils.h index a0023b9bb..09e87ef67 100644 --- a/init/reboot_utils.h +++ b/init/reboot_utils.h @@ -29,7 +29,8 @@ void SetFatalRebootTarget(const std::optional<std::string>& reboot_target = std: // so if any of the attempts to determine this fail, it will still return true. bool IsRebootCapable(); // This is a wrapper around the actual reboot calls. -void __attribute__((noreturn)) RebootSystem(unsigned int cmd, const std::string& reboot_target); +void __attribute__((noreturn)) RebootSystem(unsigned int cmd, const std::string& reboot_target, + const std::string& reboot_reason = ""); void __attribute__((noreturn)) InitFatalReboot(int signal_number); void InstallRebootSignalHandlers(); diff --git a/rootdir/init.rc b/rootdir/init.rc index b45abb9ab..c264ebb0e 100644 --- a/rootdir/init.rc +++ b/rootdir/init.rc @@ -930,20 +930,26 @@ on post-fs-data mkdir /data/user/0 0700 system system encryption=None mount none /data/data /data/user/0 bind rec - # A tmpfs directory, which will contain all apps CE DE data directory that - # bind mount from the original source. + # A tmpfs directory, which will contain all apps and sdk sandbox CE and DE + # data directory that bind mount from the original source. mount tmpfs tmpfs /data_mirror nodev noexec nosuid mode=0700,uid=0,gid=1000 restorecon /data_mirror mkdir /data_mirror/data_ce 0700 root root mkdir /data_mirror/data_de 0700 root root + mkdir /data_mirror/misc_ce 0700 root root + mkdir /data_mirror/misc_de 0700 root root # Create CE and DE data directory for default volume mkdir /data_mirror/data_ce/null 0700 root root mkdir /data_mirror/data_de/null 0700 root root + mkdir /data_mirror/misc_ce/null 0700 root root + mkdir /data_mirror/misc_de/null 0700 root root # Bind mount CE and DE data directory to mirror's default volume directory mount none /data/user /data_mirror/data_ce/null bind rec mount none /data/user_de /data_mirror/data_de/null bind rec + mount none /data/misc_ce /data_mirror/misc_ce/null bind rec + mount none /data/misc_de /data_mirror/misc_de/null bind rec # Create mirror directory for jit profiles mkdir /data_mirror/cur_profiles 0700 root root diff --git a/trusty/storage/proxy/Android.bp b/trusty/storage/proxy/Android.bp index 94f26d8a6..e952ee0bc 100644 --- a/trusty/storage/proxy/Android.bp +++ b/trusty/storage/proxy/Android.bp @@ -32,11 +32,11 @@ cc_binary { shared_libs: [ "libbase", + "libcutils", "liblog", "libhardware_legacy", ], header_libs: [ - "libcutils_headers", "libgsi_headers", ], diff --git a/trusty/storage/proxy/storage.c b/trusty/storage/proxy/storage.c index c531cfd13..033dc2117 100644 --- a/trusty/storage/proxy/storage.c +++ b/trusty/storage/proxy/storage.c @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#include <cutils/properties.h> #include <errno.h> #include <fcntl.h> #include <inttypes.h> @@ -43,6 +44,22 @@ enum sync_state { static const char *ssdir_name; +/* + * Property set to 1 after we have opened a file under ssdir_name. The backing + * files for both TD and TDP are currently located under /data/vendor/ss and can + * only be opened once userdata is mounted. This storageproxyd service is + * restarted when userdata is available, which causes the Trusty storage service + * to reconnect and attempt to open the backing files for TD and TDP. Once we + * set this property, other users can expect that the Trusty storage service + * ports will be available (although they may block if still being initialized), + * and connections will not be reset after this point (assuming the + * storageproxyd service stays running). + */ +#define FS_READY_PROPERTY "ro.vendor.trusty.storage.fs_ready" + +/* has FS_READY_PROPERTY been set? */ +static bool fs_ready_initialized = false; + static enum sync_state fs_state; static enum sync_state fd_state[FD_TBL_SIZE]; @@ -336,6 +353,16 @@ int storage_file_open(struct storage_msg* msg, const void* r, size_t req_len) { ALOGV("%s: \"%s\": fd = %u: handle = %d\n", __func__, path, rc, resp.handle); + /* a backing file has been opened, notify any waiting init steps */ + if (!fs_ready_initialized) { + rc = property_set(FS_READY_PROPERTY, "1"); + if (rc == 0) { + fs_ready_initialized = true; + } else { + ALOGE("Could not set property %s, rc: %d\n", FS_READY_PROPERTY, rc); + } + } + return ipc_respond(msg, &resp, sizeof(resp)); err_response: |