Loading Android.mk +5 −0 Original line number Diff line number Diff line Loading @@ -73,6 +73,11 @@ LOCAL_REQUIRED_MODULES += \ dump.erofs.recovery \ fsck.erofs.recovery LOCAL_REQUIRED_MODULES += \ e2fsck.recovery \ resize2fs.recovery \ tune2fs.recovery # On A/B devices recovery-persist reads the recovery related file from the persist storage and # copies them into /data/misc/recovery. Then, for both A/B and non-A/B devices, recovery-persist # parses the last_install file and reports the embedded update metrics. Also, the last_install file Loading bootloader_message/Android.bp +11 −0 Original line number Diff line number Diff line Loading @@ -40,6 +40,17 @@ cc_defaults { export_include_dirs: ["include"], } cc_binary { name: "misctrl", shared_libs: [ "libbase", "libbootloader_message", "liblog", ], init_rc: ["misctrl.rc"], srcs: ["misctrl_main.cpp"], } cc_library { name: "libbootloader_message", defaults: [ Loading bootloader_message/bootloader_message.cpp +38 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ #include <vector> #include <android-base/file.h> #include <android-base/hex.h> #include <android-base/properties.h> #include <android-base/stringprintf.h> #include <android-base/unique_fd.h> Loading Loading @@ -319,6 +320,43 @@ bool WriteMiscMemtagMessage(const misc_memtag_message& message, std::string* err offsetof(misc_system_space_layout, memtag_message), err); } bool ReadMiscKcmdlineMessage(misc_kcmdline_message* message, std::string* err) { return ReadMiscPartitionSystemSpace(message, sizeof(*message), offsetof(misc_system_space_layout, kcmdline_message), err); } bool WriteMiscKcmdlineMessage(const misc_kcmdline_message& message, std::string* err) { return WriteMiscPartitionSystemSpace(&message, sizeof(message), offsetof(misc_system_space_layout, kcmdline_message), err); } bool ReadMiscControlMessage(misc_control_message* message, std::string* err) { return ReadMiscPartitionSystemSpace(message, sizeof(*message), offsetof(misc_system_space_layout, control_message), err); } bool WriteMiscControlMessage(const misc_control_message& message, std::string* err) { return WriteMiscPartitionSystemSpace(&message, sizeof(message), offsetof(misc_system_space_layout, control_message), err); } bool CheckReservedSystemSpaceEmpty(bool* empty, std::string* err) { constexpr size_t kReservedSize = SYSTEM_SPACE_SIZE_IN_MISC - sizeof(misc_system_space_layout); uint8_t space[kReservedSize]; if (!ReadMiscPartitionSystemSpace(&space, kReservedSize, sizeof(misc_system_space_layout), err)) { return false; } *empty = space[0] == 0 && 0 == memcmp(space, space + 1, kReservedSize - 1); if (!*empty) { *err = android::base::HexString(space, kReservedSize); } return true; } extern "C" bool write_reboot_bootloader(void) { std::string err; return write_reboot_bootloader(&err); Loading bootloader_message/include/bootloader_message/bootloader_message.h +46 −0 Original line number Diff line number Diff line Loading @@ -100,6 +100,21 @@ struct misc_memtag_message { uint8_t reserved[55]; } __attribute__((packed)); struct misc_kcmdline_message { uint8_t version; uint32_t magic; uint64_t kcmdline_flags; uint8_t reserved[51]; } __attribute__((packed)); // holds generic platform info, managed by misctrl struct misc_control_message { uint8_t version; uint32_t magic; uint64_t misctrl_flags; uint8_t reserved[51]; } __attribute__((packed)); #define MISC_VIRTUAL_AB_MESSAGE_VERSION 2 #define MISC_VIRTUAL_AB_MAGIC_HEADER 0x56740AB0 Loading @@ -116,11 +131,23 @@ struct misc_memtag_message { // See system/extras/mtectrl in AOSP for more information. #define MISC_MEMTAG_MODE_FORCED 0x20 #define MISC_KCMDLINE_MESSAGE_VERSION 1 #define MISC_KCMDLINE_MAGIC_HEADER 0x6ab5110c #define MISC_KCMDLINE_BINDER_RUST 0x1 #define MISC_CONTROL_MESSAGE_VERSION 1 #define MISC_CONTROL_MAGIC_HEADER 0x736d6f72 #define MISC_CONTROL_16KB_BEFORE 0x1 #if (__STDC_VERSION__ >= 201112L) || defined(__cplusplus) static_assert(sizeof(struct misc_virtual_ab_message) == 64, "struct misc_virtual_ab_message has wrong size"); static_assert(sizeof(struct misc_memtag_message) == 64, "struct misc_memtag_message has wrong size"); static_assert(sizeof(struct misc_kcmdline_message) == 64, "struct misc_kcmdline_message has wrong size"); static_assert(sizeof(struct misc_control_message) == 64, "struct misc_control_message has wrong size"); #endif // This struct is not meant to be used directly, rather, it is to make Loading @@ -128,8 +155,15 @@ static_assert(sizeof(struct misc_memtag_message) == 64, struct misc_system_space_layout { misc_virtual_ab_message virtual_ab_message; misc_memtag_message memtag_message; misc_kcmdline_message kcmdline_message; misc_control_message control_message; } __attribute__((packed)); #if (__STDC_VERSION__ >= 201112L) || defined(__cplusplus) static_assert(sizeof(struct misc_system_space_layout) % 64 == 0, "prefer to extend by 64 byte chunks, for consistency"); #endif #ifdef __cplusplus #include <string> Loading Loading @@ -198,6 +232,18 @@ bool WriteMiscVirtualAbMessage(const misc_virtual_ab_message& message, std::stri // Read or write the memtag message from system space in /misc. bool ReadMiscMemtagMessage(misc_memtag_message* message, std::string* err); bool WriteMiscMemtagMessage(const misc_memtag_message& message, std::string* err); // Read or write the kcmdline message from system space in /misc. bool ReadMiscKcmdlineMessage(misc_kcmdline_message* message, std::string* err); bool WriteMiscKcmdlineMessage(const misc_kcmdline_message& message, std::string* err); // Read or write the kcmdline message from system space in /misc. bool ReadMiscControlMessage(misc_control_message* message, std::string* err); bool WriteMiscControlMessage(const misc_control_message& message, std::string* err); // Check reserved system space. bool CheckReservedSystemSpaceEmpty(bool* empty, std::string* err); #else #include <stdbool.h> Loading bootloader_message/misctrl.rc 0 → 100644 +4 −0 Original line number Diff line number Diff line service misctrl /system/bin/misctrl user root # for misc partition access class core oneshot Loading
Android.mk +5 −0 Original line number Diff line number Diff line Loading @@ -73,6 +73,11 @@ LOCAL_REQUIRED_MODULES += \ dump.erofs.recovery \ fsck.erofs.recovery LOCAL_REQUIRED_MODULES += \ e2fsck.recovery \ resize2fs.recovery \ tune2fs.recovery # On A/B devices recovery-persist reads the recovery related file from the persist storage and # copies them into /data/misc/recovery. Then, for both A/B and non-A/B devices, recovery-persist # parses the last_install file and reports the embedded update metrics. Also, the last_install file Loading
bootloader_message/Android.bp +11 −0 Original line number Diff line number Diff line Loading @@ -40,6 +40,17 @@ cc_defaults { export_include_dirs: ["include"], } cc_binary { name: "misctrl", shared_libs: [ "libbase", "libbootloader_message", "liblog", ], init_rc: ["misctrl.rc"], srcs: ["misctrl_main.cpp"], } cc_library { name: "libbootloader_message", defaults: [ Loading
bootloader_message/bootloader_message.cpp +38 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ #include <vector> #include <android-base/file.h> #include <android-base/hex.h> #include <android-base/properties.h> #include <android-base/stringprintf.h> #include <android-base/unique_fd.h> Loading Loading @@ -319,6 +320,43 @@ bool WriteMiscMemtagMessage(const misc_memtag_message& message, std::string* err offsetof(misc_system_space_layout, memtag_message), err); } bool ReadMiscKcmdlineMessage(misc_kcmdline_message* message, std::string* err) { return ReadMiscPartitionSystemSpace(message, sizeof(*message), offsetof(misc_system_space_layout, kcmdline_message), err); } bool WriteMiscKcmdlineMessage(const misc_kcmdline_message& message, std::string* err) { return WriteMiscPartitionSystemSpace(&message, sizeof(message), offsetof(misc_system_space_layout, kcmdline_message), err); } bool ReadMiscControlMessage(misc_control_message* message, std::string* err) { return ReadMiscPartitionSystemSpace(message, sizeof(*message), offsetof(misc_system_space_layout, control_message), err); } bool WriteMiscControlMessage(const misc_control_message& message, std::string* err) { return WriteMiscPartitionSystemSpace(&message, sizeof(message), offsetof(misc_system_space_layout, control_message), err); } bool CheckReservedSystemSpaceEmpty(bool* empty, std::string* err) { constexpr size_t kReservedSize = SYSTEM_SPACE_SIZE_IN_MISC - sizeof(misc_system_space_layout); uint8_t space[kReservedSize]; if (!ReadMiscPartitionSystemSpace(&space, kReservedSize, sizeof(misc_system_space_layout), err)) { return false; } *empty = space[0] == 0 && 0 == memcmp(space, space + 1, kReservedSize - 1); if (!*empty) { *err = android::base::HexString(space, kReservedSize); } return true; } extern "C" bool write_reboot_bootloader(void) { std::string err; return write_reboot_bootloader(&err); Loading
bootloader_message/include/bootloader_message/bootloader_message.h +46 −0 Original line number Diff line number Diff line Loading @@ -100,6 +100,21 @@ struct misc_memtag_message { uint8_t reserved[55]; } __attribute__((packed)); struct misc_kcmdline_message { uint8_t version; uint32_t magic; uint64_t kcmdline_flags; uint8_t reserved[51]; } __attribute__((packed)); // holds generic platform info, managed by misctrl struct misc_control_message { uint8_t version; uint32_t magic; uint64_t misctrl_flags; uint8_t reserved[51]; } __attribute__((packed)); #define MISC_VIRTUAL_AB_MESSAGE_VERSION 2 #define MISC_VIRTUAL_AB_MAGIC_HEADER 0x56740AB0 Loading @@ -116,11 +131,23 @@ struct misc_memtag_message { // See system/extras/mtectrl in AOSP for more information. #define MISC_MEMTAG_MODE_FORCED 0x20 #define MISC_KCMDLINE_MESSAGE_VERSION 1 #define MISC_KCMDLINE_MAGIC_HEADER 0x6ab5110c #define MISC_KCMDLINE_BINDER_RUST 0x1 #define MISC_CONTROL_MESSAGE_VERSION 1 #define MISC_CONTROL_MAGIC_HEADER 0x736d6f72 #define MISC_CONTROL_16KB_BEFORE 0x1 #if (__STDC_VERSION__ >= 201112L) || defined(__cplusplus) static_assert(sizeof(struct misc_virtual_ab_message) == 64, "struct misc_virtual_ab_message has wrong size"); static_assert(sizeof(struct misc_memtag_message) == 64, "struct misc_memtag_message has wrong size"); static_assert(sizeof(struct misc_kcmdline_message) == 64, "struct misc_kcmdline_message has wrong size"); static_assert(sizeof(struct misc_control_message) == 64, "struct misc_control_message has wrong size"); #endif // This struct is not meant to be used directly, rather, it is to make Loading @@ -128,8 +155,15 @@ static_assert(sizeof(struct misc_memtag_message) == 64, struct misc_system_space_layout { misc_virtual_ab_message virtual_ab_message; misc_memtag_message memtag_message; misc_kcmdline_message kcmdline_message; misc_control_message control_message; } __attribute__((packed)); #if (__STDC_VERSION__ >= 201112L) || defined(__cplusplus) static_assert(sizeof(struct misc_system_space_layout) % 64 == 0, "prefer to extend by 64 byte chunks, for consistency"); #endif #ifdef __cplusplus #include <string> Loading Loading @@ -198,6 +232,18 @@ bool WriteMiscVirtualAbMessage(const misc_virtual_ab_message& message, std::stri // Read or write the memtag message from system space in /misc. bool ReadMiscMemtagMessage(misc_memtag_message* message, std::string* err); bool WriteMiscMemtagMessage(const misc_memtag_message& message, std::string* err); // Read or write the kcmdline message from system space in /misc. bool ReadMiscKcmdlineMessage(misc_kcmdline_message* message, std::string* err); bool WriteMiscKcmdlineMessage(const misc_kcmdline_message& message, std::string* err); // Read or write the kcmdline message from system space in /misc. bool ReadMiscControlMessage(misc_control_message* message, std::string* err); bool WriteMiscControlMessage(const misc_control_message& message, std::string* err); // Check reserved system space. bool CheckReservedSystemSpaceEmpty(bool* empty, std::string* err); #else #include <stdbool.h> Loading
bootloader_message/misctrl.rc 0 → 100644 +4 −0 Original line number Diff line number Diff line service misctrl /system/bin/misctrl user root # for misc partition access class core oneshot