From cf3234a093244f09a976b469ebfa2964f9ebe951 Mon Sep 17 00:00:00 2001 From: Florian Mayer Date: Wed, 8 Dec 2021 17:49:09 -0800 Subject: [MTE] Add interface to communicate MTE status to bootloader. We can use this interface to instruct the bootloader to either permanently or only for the next reboot enable MTE for userspace or kernel. Bug: 206895651 Change-Id: I7330e43b7c4f94fc5913a7bc0f667b6eab06e111 --- bootloader_message/bootloader_message.cpp | 10 ++++++++++ .../include/bootloader_message/bootloader_message.h | 20 ++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/bootloader_message/bootloader_message.cpp b/bootloader_message/bootloader_message.cpp index b70d54e5c..1ea56cd4e 100644 --- a/bootloader_message/bootloader_message.cpp +++ b/bootloader_message/bootloader_message.cpp @@ -304,6 +304,16 @@ bool WriteMiscVirtualAbMessage(const misc_virtual_ab_message& message, std::stri offsetof(misc_system_space_layout, virtual_ab_message), err); } +bool ReadMiscMemtagMessage(misc_memtag_message* message, std::string* err) { + return ReadMiscPartitionSystemSpace(message, sizeof(*message), + offsetof(misc_system_space_layout, memtag_message), err); +} + +bool WriteMiscMemtagMessage(const misc_memtag_message& message, std::string* err) { + return WriteMiscPartitionSystemSpace(&message, sizeof(message), + offsetof(misc_system_space_layout, memtag_message), err); +} + extern "C" bool write_reboot_bootloader(void) { std::string err; return write_reboot_bootloader(&err); diff --git a/bootloader_message/include/bootloader_message/bootloader_message.h b/bootloader_message/include/bootloader_message/bootloader_message.h index e4cf09b22..0d99273de 100644 --- a/bootloader_message/include/bootloader_message/bootloader_message.h +++ b/bootloader_message/include/bootloader_message/bootloader_message.h @@ -93,18 +93,35 @@ struct misc_virtual_ab_message { uint8_t reserved[57]; } __attribute__((packed)); +struct misc_memtag_message { + uint8_t version; + uint32_t magic; // magic string for treble compat + uint32_t memtag_mode; + uint8_t reserved[55]; +} __attribute__((packed)); + #define MISC_VIRTUAL_AB_MESSAGE_VERSION 2 #define MISC_VIRTUAL_AB_MAGIC_HEADER 0x56740AB0 +#define MISC_MEMTAG_MESSAGE_VERSION 1 +#define MISC_MEMTAG_MAGIC_HEADER 0x5afefe5a +#define MISC_MEMTAG_MODE_MEMTAG 0x1 +#define MISC_MEMTAG_MODE_MEMTAG_ONCE 0x2 +#define MISC_MEMTAG_MODE_MEMTAG_KERNEL 0x4 +#define MISC_MEMTAG_MODE_MEMTAG_KERNEL_ONCE 0x8 + #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_virtual_ab_message has wrong size"); #endif // This struct is not meant to be used directly, rather, it is to make // computation of offsets easier. New fields must be added to the end. struct misc_system_space_layout { misc_virtual_ab_message virtual_ab_message; + misc_memtag_message memtag_message; } __attribute__((packed)); #ifdef __cplusplus @@ -172,6 +189,9 @@ bool write_wipe_package(const std::string& package_data, std::string* err); bool ReadMiscVirtualAbMessage(misc_virtual_ab_message* message, std::string* err); bool WriteMiscVirtualAbMessage(const misc_virtual_ab_message& message, std::string* err); +// 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); #else #include -- cgit v1.2.3