diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2024-02-28 21:21:35 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2024-02-28 21:21:35 +0000 |
commit | 6a488c42aa597e22cd9a6a025fe70225366c080b (patch) | |
tree | b29d412d88aaa339f5be76218e716a4c8cc896a0 | |
parent | 46ddddd8ba31d8f2c91d8d18200c8fbb32f3165d (diff) | |
parent | 88cf110898812c26d193385b8af9eccd55e9b9ec (diff) | |
download | recovery-6a488c42aa597e22cd9a6a025fe70225366c080b.tar.gz |
Merge "Snap for 11510257 from 564ad1756400212e79ed156d4bfa266a4fd4d4ec to simpleperf-release" into simpleperf-releasesimpleperf-release
-rw-r--r-- | bootloader_message/Android.bp | 11 | ||||
-rw-r--r-- | bootloader_message/bootloader_message.cpp | 28 | ||||
-rw-r--r-- | bootloader_message/include/bootloader_message/bootloader_message.h | 28 | ||||
-rw-r--r-- | bootloader_message/misctrl.rc | 4 | ||||
-rw-r--r-- | bootloader_message/misctrl_main.cpp | 91 |
5 files changed, 162 insertions, 0 deletions
diff --git a/bootloader_message/Android.bp b/bootloader_message/Android.bp index 76226773..dcb6c3c2 100644 --- a/bootloader_message/Android.bp +++ b/bootloader_message/Android.bp @@ -39,6 +39,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: [ diff --git a/bootloader_message/bootloader_message.cpp b/bootloader_message/bootloader_message.cpp index e9dd0d4d..2d743e73 100644 --- a/bootloader_message/bootloader_message.cpp +++ b/bootloader_message/bootloader_message.cpp @@ -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> @@ -324,6 +325,33 @@ bool WriteMiscKcmdlineMessage(const misc_kcmdline_message& message, std::string* 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); diff --git a/bootloader_message/include/bootloader_message/bootloader_message.h b/bootloader_message/include/bootloader_message/bootloader_message.h index 642f6533..7cb973e2 100644 --- a/bootloader_message/include/bootloader_message/bootloader_message.h +++ b/bootloader_message/include/bootloader_message/bootloader_message.h @@ -107,6 +107,14 @@ struct misc_kcmdline_message { 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 @@ -127,6 +135,10 @@ struct misc_kcmdline_message { #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"); @@ -134,6 +146,8 @@ 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 @@ -142,8 +156,14 @@ 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> @@ -216,6 +236,14 @@ 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> diff --git a/bootloader_message/misctrl.rc b/bootloader_message/misctrl.rc new file mode 100644 index 00000000..5293bf2d --- /dev/null +++ b/bootloader_message/misctrl.rc @@ -0,0 +1,4 @@ +service misctrl /system/bin/misctrl + user root # for misc partition access + class core + oneshot diff --git a/bootloader_message/misctrl_main.cpp b/bootloader_message/misctrl_main.cpp new file mode 100644 index 00000000..653b62de --- /dev/null +++ b/bootloader_message/misctrl_main.cpp @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include <android-base/logging.h> +#include <android-base/properties.h> +#include <bootloader_message/bootloader_message.h> +#include <log/log.h> + +#include <string> + +#include <cstdio> + +static int check_control_message() { + misc_control_message m; + std::string err; + if (!ReadMiscControlMessage(&m, &err)) { + LOG(ERROR) << "Could not read misctrl message: " << err.c_str(); + return 1; + } + + if (m.magic != MISC_CONTROL_MAGIC_HEADER || m.version != MISC_CONTROL_MESSAGE_VERSION) { + LOG(WARNING) << "misctrl message invalid, resetting it"; + m = { .version = MISC_CONTROL_MESSAGE_VERSION, + .magic = MISC_CONTROL_MAGIC_HEADER, + .misctrl_flags = 0 }; + } + + int res = 0; + + const size_t ps = getpagesize(); + + if (ps != 4096 && ps != 16384) { + LOG(ERROR) << "Unrecognized page size: " << ps; + res = 1; + } + + if (ps == 16384) { + m.misctrl_flags |= MISC_CONTROL_16KB_BEFORE; + } + + bool before_16kb = m.misctrl_flags & MISC_CONTROL_16KB_BEFORE; + res |= android::base::SetProperty("ro.misctrl.16kb_before", before_16kb ? "1" : "0"); + + if (!WriteMiscControlMessage(m, &err)) { + LOG(ERROR) << "Could not write misctrl message: " << err.c_str(); + res |= 1; + } + + return res; +} + +static int check_reserved_space() { + bool empty; + std::string err; + bool success = CheckReservedSystemSpaceEmpty(&empty, &err); + if (!success) { + LOG(ERROR) << "Could not read reserved space: " << err.c_str(); + return 1; + } + LOG(INFO) << "System reserved space empty? " << empty; + + if (!err.empty()) { + LOG(ERROR) << "Reserved misc space being used: " << err; + } + + return empty ? 0 : 1; +} + +int main(int argc, char** argv) { + { + using namespace android::base; + (void)argc; + InitLogging(argv, TeeLogger(LogdLogger(), &StderrLogger)); + } + int err = 0; + err |= check_control_message(); + err |= check_reserved_space(); + return err; +} |