1*e7c364b6SAndroid Build Coastguard Worker /*
2*e7c364b6SAndroid Build Coastguard Worker * Copyright (C) 2024 The Android Open Source Project
3*e7c364b6SAndroid Build Coastguard Worker *
4*e7c364b6SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*e7c364b6SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*e7c364b6SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*e7c364b6SAndroid Build Coastguard Worker *
8*e7c364b6SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*e7c364b6SAndroid Build Coastguard Worker *
10*e7c364b6SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*e7c364b6SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*e7c364b6SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e7c364b6SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*e7c364b6SAndroid Build Coastguard Worker * limitations under the License.
15*e7c364b6SAndroid Build Coastguard Worker */
16*e7c364b6SAndroid Build Coastguard Worker #include <android-base/logging.h>
17*e7c364b6SAndroid Build Coastguard Worker #include <android-base/properties.h>
18*e7c364b6SAndroid Build Coastguard Worker #include <bootloader_message/bootloader_message.h>
19*e7c364b6SAndroid Build Coastguard Worker #include <log/log.h>
20*e7c364b6SAndroid Build Coastguard Worker
21*e7c364b6SAndroid Build Coastguard Worker #include <string>
22*e7c364b6SAndroid Build Coastguard Worker
23*e7c364b6SAndroid Build Coastguard Worker #include <cstdio>
24*e7c364b6SAndroid Build Coastguard Worker
check_control_message()25*e7c364b6SAndroid Build Coastguard Worker static int check_control_message() {
26*e7c364b6SAndroid Build Coastguard Worker misc_control_message m;
27*e7c364b6SAndroid Build Coastguard Worker std::string err;
28*e7c364b6SAndroid Build Coastguard Worker if (!ReadMiscControlMessage(&m, &err)) {
29*e7c364b6SAndroid Build Coastguard Worker LOG(ERROR) << "Could not read misctrl message: " << err.c_str();
30*e7c364b6SAndroid Build Coastguard Worker return 1;
31*e7c364b6SAndroid Build Coastguard Worker }
32*e7c364b6SAndroid Build Coastguard Worker
33*e7c364b6SAndroid Build Coastguard Worker if (m.magic != MISC_CONTROL_MAGIC_HEADER || m.version != MISC_CONTROL_MESSAGE_VERSION) {
34*e7c364b6SAndroid Build Coastguard Worker LOG(WARNING) << "misctrl message invalid, resetting it";
35*e7c364b6SAndroid Build Coastguard Worker m = { .version = MISC_CONTROL_MESSAGE_VERSION,
36*e7c364b6SAndroid Build Coastguard Worker .magic = MISC_CONTROL_MAGIC_HEADER,
37*e7c364b6SAndroid Build Coastguard Worker .misctrl_flags = 0 };
38*e7c364b6SAndroid Build Coastguard Worker }
39*e7c364b6SAndroid Build Coastguard Worker
40*e7c364b6SAndroid Build Coastguard Worker int res = 0;
41*e7c364b6SAndroid Build Coastguard Worker
42*e7c364b6SAndroid Build Coastguard Worker const size_t ps = getpagesize();
43*e7c364b6SAndroid Build Coastguard Worker
44*e7c364b6SAndroid Build Coastguard Worker if (ps != 4096 && ps != 16384) {
45*e7c364b6SAndroid Build Coastguard Worker LOG(ERROR) << "Unrecognized page size: " << ps;
46*e7c364b6SAndroid Build Coastguard Worker res = 1;
47*e7c364b6SAndroid Build Coastguard Worker }
48*e7c364b6SAndroid Build Coastguard Worker
49*e7c364b6SAndroid Build Coastguard Worker if (ps == 16384) {
50*e7c364b6SAndroid Build Coastguard Worker m.misctrl_flags |= MISC_CONTROL_16KB_BEFORE;
51*e7c364b6SAndroid Build Coastguard Worker }
52*e7c364b6SAndroid Build Coastguard Worker
53*e7c364b6SAndroid Build Coastguard Worker bool before_16kb = m.misctrl_flags & MISC_CONTROL_16KB_BEFORE;
54*e7c364b6SAndroid Build Coastguard Worker res |= android::base::SetProperty("ro.misctrl.16kb_before", before_16kb ? "1" : "0");
55*e7c364b6SAndroid Build Coastguard Worker
56*e7c364b6SAndroid Build Coastguard Worker if (!WriteMiscControlMessage(m, &err)) {
57*e7c364b6SAndroid Build Coastguard Worker LOG(ERROR) << "Could not write misctrl message: " << err.c_str();
58*e7c364b6SAndroid Build Coastguard Worker res |= 1;
59*e7c364b6SAndroid Build Coastguard Worker }
60*e7c364b6SAndroid Build Coastguard Worker
61*e7c364b6SAndroid Build Coastguard Worker return res;
62*e7c364b6SAndroid Build Coastguard Worker }
63*e7c364b6SAndroid Build Coastguard Worker
check_reserved_space()64*e7c364b6SAndroid Build Coastguard Worker static int check_reserved_space() {
65*e7c364b6SAndroid Build Coastguard Worker bool empty;
66*e7c364b6SAndroid Build Coastguard Worker std::string err;
67*e7c364b6SAndroid Build Coastguard Worker bool success = CheckReservedSystemSpaceEmpty(&empty, &err);
68*e7c364b6SAndroid Build Coastguard Worker if (!success) {
69*e7c364b6SAndroid Build Coastguard Worker LOG(ERROR) << "Could not read reserved space: " << err.c_str();
70*e7c364b6SAndroid Build Coastguard Worker return 1;
71*e7c364b6SAndroid Build Coastguard Worker }
72*e7c364b6SAndroid Build Coastguard Worker LOG(INFO) << "System reserved space empty? " << empty;
73*e7c364b6SAndroid Build Coastguard Worker
74*e7c364b6SAndroid Build Coastguard Worker if (!err.empty()) {
75*e7c364b6SAndroid Build Coastguard Worker LOG(ERROR) << "Reserved misc space being used: " << err;
76*e7c364b6SAndroid Build Coastguard Worker }
77*e7c364b6SAndroid Build Coastguard Worker
78*e7c364b6SAndroid Build Coastguard Worker return empty ? 0 : 1;
79*e7c364b6SAndroid Build Coastguard Worker }
80*e7c364b6SAndroid Build Coastguard Worker
main(int argc,char ** argv)81*e7c364b6SAndroid Build Coastguard Worker int main(int argc, char** argv) {
82*e7c364b6SAndroid Build Coastguard Worker {
83*e7c364b6SAndroid Build Coastguard Worker using namespace android::base;
84*e7c364b6SAndroid Build Coastguard Worker (void)argc;
85*e7c364b6SAndroid Build Coastguard Worker InitLogging(argv, TeeLogger(LogdLogger(), &StderrLogger));
86*e7c364b6SAndroid Build Coastguard Worker }
87*e7c364b6SAndroid Build Coastguard Worker int err = 0;
88*e7c364b6SAndroid Build Coastguard Worker err |= check_control_message();
89*e7c364b6SAndroid Build Coastguard Worker err |= check_reserved_space();
90*e7c364b6SAndroid Build Coastguard Worker return err;
91*e7c364b6SAndroid Build Coastguard Worker }
92