From 1dba6a8129672af9fffcbda45c9c7bc3cbc69aa1 Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Fri, 16 Feb 2024 22:32:43 +0000 Subject: [PATCH] intro misctrl Generic binary for managing the /misc partition. This CL only uses it to do a basic health check for the /misc partition, but the idea is this is a single place that can manage misc partition operations for the Android platform, rather than having to write a new tool each time. Bug: 317262681 Test: boot, check bugreport Change-Id: I29a4189e2e9aee57cf66520207297d39d666f7a4 --- bootloader_message/Android.bp | 11 ++++ bootloader_message/bootloader_message.cpp | 18 ++++++ .../bootloader_message/bootloader_message.h | 4 ++ bootloader_message/misctrl.rc | 4 ++ bootloader_message/misctrl_main.cpp | 61 +++++++++++++++++++ 5 files changed, 98 insertions(+) create mode 100644 bootloader_message/misctrl.rc create mode 100644 bootloader_message/misctrl_main.cpp 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..734ead12 100644 --- a/bootloader_message/bootloader_message.cpp +++ b/bootloader_message/bootloader_message.cpp @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -324,6 +325,23 @@ bool WriteMiscKcmdlineMessage(const misc_kcmdline_message& message, std::string* offsetof(misc_system_space_layout, kcmdline_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..39d3da9c 100644 --- a/bootloader_message/include/bootloader_message/bootloader_message.h +++ b/bootloader_message/include/bootloader_message/bootloader_message.h @@ -216,6 +216,10 @@ 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); + +// Check reserved system space. +bool CheckReservedSystemSpaceEmpty(bool* empty, std::string* err); + #else #include 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..ddaa999a --- /dev/null +++ b/bootloader_message/misctrl_main.cpp @@ -0,0 +1,61 @@ +/* + * 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 +#include + +#include + +#include + +static void log(const char* fmt, ...) __attribute__((format(printf, 1, 2))); +static void log(const char* fmt, ...) { + va_list va; + va_start(va, fmt); + + va_list vb; + va_copy(vb, va); + + __android_log_vprint(ANDROID_LOG_ERROR, "misctrl", fmt, va); + va_end(va); + + vfprintf(stderr, fmt, vb); + fprintf(stderr, "\n"); + va_end(vb); +} + +static int check_reserved_space() { + bool empty; + std::string err; + bool success = CheckReservedSystemSpaceEmpty(&empty, &err); + if (!success) { + log("Could not read reserved space: %s", err.c_str()); + return 1; + } + log("System reserved space empty? %d.", empty); + + if (!err.empty()) { + constexpr size_t kPrintChunkSize = 256; + for (size_t i = 0; i < err.size(); i += kPrintChunkSize) { + log("DATA: %s", err.substr(i, kPrintChunkSize).c_str()); + } + } + + return empty ? 0 : 1; +} + +int main() { + return check_reserved_space(); +}