From df8436b51ae92449c5b45141d344b14b439bc42b Mon Sep 17 00:00:00 2001 From: bigbiff Date: Sun, 30 Aug 2020 16:22:34 -0400 Subject: [PATCH] fastboot: implement fastbootd in twrp fastbootd is a userspace daemon that runs in the recovery ramdisk. It allows writing single partitions to the super partition via fastboot CLI. When TWRP sees the fastboot option in the misc partition during startup, it will start with the fastbootd page and fastbootd running. Otherwise it will run recovery normally. Change-Id: Id7b12d29ef21dbd5950dc884dd1cd788f25357f0 --- Android.mk | 16 +- bootloader_message/bootloader_message.cpp | 2 + bootloader_message_twrp/Android.mk | 40 -- .../bootloader_message.cpp | 399 ----------------- .../bootloader_message.h | 221 ---------- data.cpp | 5 + gui/action.cpp | 16 + gui/console.cpp | 2 +- gui/gui.cpp | 3 +- gui/objects.hpp | 3 +- gui/theme/common/landscape.xml | 400 ++++++++++++++---- gui/theme/common/languages/en.xml | 4 + gui/theme/common/portrait.xml | 382 ++++++++++++----- gui/theme/landscape_hdpi/ui.xml | 3 +- gui/theme/landscape_mdpi/ui.xml | 3 +- gui/theme/portrait_hdpi/ui.xml | 2 +- gui/theme/portrait_mdpi/ui.xml | 2 +- install/get_args.cpp | 91 ++++ install/include/install/get_args.h | 17 + openrecoveryscript.cpp | 4 - partitionmanager.cpp | 8 +- prebuilt/Android.mk | 5 +- startupArgs.cpp | 81 ++++ startupArgs.hpp | 53 +++ twrp-functions.cpp | 46 +- twrp-functions.hpp | 4 +- twrp.cpp | 260 +++++------- variables.h | 1 + 28 files changed, 1011 insertions(+), 1062 deletions(-) mode change 100644 => 100755 bootloader_message/bootloader_message.cpp delete mode 100644 bootloader_message_twrp/Android.mk delete mode 100644 bootloader_message_twrp/bootloader_message.cpp delete mode 100644 bootloader_message_twrp/include/bootloader_message_twrp/bootloader_message.h mode change 100644 => 100755 gui/console.cpp mode change 100644 => 100755 gui/objects.hpp mode change 100644 => 100755 gui/theme/portrait_hdpi/ui.xml create mode 100755 install/get_args.cpp create mode 100755 install/include/install/get_args.h create mode 100755 startupArgs.cpp create mode 100755 startupArgs.hpp diff --git a/Android.mk b/Android.mk index f536f1a7..56f49263 100755 --- a/Android.mk +++ b/Android.mk @@ -68,6 +68,7 @@ LOCAL_SRC_FILES := \ partition.cpp \ partitionmanager.cpp \ progresstracking.cpp \ + startupArgs.cpp \ twinstall.cpp \ twrp-functions.cpp \ twrpDigestDriver.cpp \ @@ -119,7 +120,6 @@ LOCAL_C_INCLUDES += \ external/boringssl/include \ external/libcxx/include \ external/libselinux/include \ - $(LOCAL_PATH)/bootloader_message_twrp/include \ $(LOCAL_PATH)/recovery_ui/include \ $(LOCAL_PATH)/otautil/include \ $(LOCAL_PATH)/install/include \ @@ -128,7 +128,7 @@ LOCAL_C_INCLUDES += \ $(LOCAL_PATH)/verifier28/ LOCAL_STATIC_LIBRARIES += libguitwrp -LOCAL_SHARED_LIBRARIES += libz libc libcutils libstdc++ libtar libblkid libminuitwrp libminadbd libmtdutils libtwadbbu libbootloader_message_twrp +LOCAL_SHARED_LIBRARIES += libz libc libcutils libstdc++ libtar libblkid libminuitwrp libminadbd libmtdutils libtwadbbu libbootloader_message LOCAL_SHARED_LIBRARIES += libcrecovery libtwadbbu libtwrpdigest libc++ libaosprecovery libinit libcrypto libbase libziparchive libselinux LOCAL_CFLAGS += -DUSE_28_VERIFIER @@ -377,7 +377,7 @@ TWRP_REQUIRED_MODULES += \ mkfs.fat \ permissive.sh \ simg2img_twrp \ - libbootloader_message_twrp \ + libbootloader_message \ init.recovery.hlthchrg.rc \ init.recovery.service.rc \ init.recovery.ldconfig.rc \ @@ -386,7 +386,8 @@ TWRP_REQUIRED_MODULES += \ awk \ toybox \ toolbox \ - mkshrc_twrp + mkshrc_twrp \ + android.hardware.health@2.0-service ifneq ($(TW_INCLUDE_CRYPTO),) TWRP_REQUIRED_MODULES += \ @@ -558,8 +559,8 @@ include $(CLEAR_VARS) LOCAL_MODULE := libaosprecovery LOCAL_MODULE_TAGS := optional -LOCAL_SRC_FILES := install/adb_install.cpp install/asn1_decoder.cpp install/fuse_sdcard_install.cpp\ - install/install.cpp install/installcommand.cpp install/legacy_property_service.cpp \ +LOCAL_SRC_FILES := install/adb_install.cpp install/asn1_decoder.cpp install/fuse_sdcard_install.cpp \ + install/get_args.cpp install/install.cpp install/installcommand.cpp install/legacy_property_service.cpp \ install/package.cpp install/verifier.cpp install/wipe_data.cpp install/tw_atomic.cpp \ install/set_metadata.cpp verifier28/verifier.cpp install/zipwrap.cpp install/ZipUtil.cpp LOCAL_SHARED_LIBRARIES += libbase libbootloader_message libcrypto libext4_utils \ @@ -607,8 +608,7 @@ commands_recovery_local_path := $(LOCAL_PATH) # $(commands_TWRP_local_path)/boot_control/Android.bp # $(commands_TWRP_local_path)/update_verifier/Android.mk include \ - $(commands_TWRP_local_path)/updater/Android.mk \ - $(commands_TWRP_local_path)/bootloader_message_twrp/Android.mk + $(commands_TWRP_local_path)/updater/Android.mk include $(commands_TWRP_local_path)/mtp/ffs/Android.mk diff --git a/bootloader_message/bootloader_message.cpp b/bootloader_message/bootloader_message.cpp old mode 100644 new mode 100755 index c1ebeaa8..3328233b --- a/bootloader_message/bootloader_message.cpp +++ b/bootloader_message/bootloader_message.cpp @@ -46,6 +46,7 @@ static std::string get_misc_blk_device(std::string* err) { } Fstab fstab; if (!ReadDefaultFstab(&fstab)) { + printf("failed to read default fstab\n"); *err = "failed to read default fstab"; return ""; } @@ -56,6 +57,7 @@ static std::string get_misc_blk_device(std::string* err) { } *err = "failed to find /misc partition"; + printf("failed to find misc partition\n"); return ""; } diff --git a/bootloader_message_twrp/Android.mk b/bootloader_message_twrp/Android.mk deleted file mode 100644 index 932cd040..00000000 --- a/bootloader_message_twrp/Android.mk +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright (C) 2016 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. - -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) -LOCAL_CLANG := true -LOCAL_SRC_FILES := bootloader_message.cpp -LOCAL_MODULE := libbootloader_message_twrp -LOCAL_C_INCLUDES += bionic $(LOCAL_PATH)/include -ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 21; echo $$?),0) - LOCAL_C_INCLUDES += external/stlport/stlport - LOCAL_SHARED_LIBRARIES += libstlport -else - LOCAL_C_INCLUDES += external/libcxx/include - LOCAL_SHARED_LIBRARIES += libc++ -endif -LOCAL_CFLAGS := -Werror -std=c++11 -# ignore bootloader's factory reset command even when written to /misc -ifeq ($(TW_IGNORE_MISC_WIPE_DATA), true) - LOCAL_CFLAGS += -DIGNORE_MISC_WIPE_DATA -endif -ifeq ($(BOOTLOADER_MESSAGE_OFFSET),) - LOCAL_CFLAGS += -DBOARD_RECOVERY_BLDRMSG_OFFSET=0 -else - LOCAL_CFLAGS += -DBOARD_RECOVERY_BLDRMSG_OFFSET=$(BOOTLOADER_MESSAGE_OFFSET) -endif -LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include -include $(BUILD_SHARED_LIBRARY) diff --git a/bootloader_message_twrp/bootloader_message.cpp b/bootloader_message_twrp/bootloader_message.cpp deleted file mode 100644 index db8c5ce5..00000000 --- a/bootloader_message_twrp/bootloader_message.cpp +++ /dev/null @@ -1,399 +0,0 @@ -/* - * Copyright (C) 2016 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 -#include -#include -#include -#include -#include - -#include -#include - -// Spaces used by misc partition are as below: -// 0 - 2K For bootloader_message -// 2K - 16K Used by Vendor's bootloader (the 2K - 4K range may be optionally used -// as bootloader_message_ab struct) -// 16K - 64K Used by uncrypt and recovery to store wipe_package for A/B devices -// Note that these offsets are admitted by bootloader,recovery and uncrypt, so they -// are not configurable without changing all of them. -static const size_t BOOTLOADER_MESSAGE_OFFSET_IN_MISC = BOARD_RECOVERY_BLDRMSG_OFFSET; -static const size_t WIPE_PACKAGE_OFFSET_IN_MISC = 16 * 1024 + BOOTLOADER_MESSAGE_OFFSET_IN_MISC; - -static std::string misc_blkdev; - -void set_misc_device(const char* name) { - misc_blkdev = name; -} - -static std::string get_misc_blk_device(std::string* err) { - *err = ""; - return misc_blkdev; -} - -// In recovery mode, recovery can get started and try to access the misc -// device before the kernel has actually created it. -static bool wait_for_device(const std::string& blk_device, std::string* err) { - int tries = 0; - int ret; - err->clear(); - do { - ++tries; - struct stat buf; - ret = stat(blk_device.c_str(), &buf); - if (ret == -1) { - char buffer[2048]; - sprintf(buffer, "failed to stat %s try %d: %s\n", - blk_device.c_str(), tries, strerror(errno)); - *err += buffer; - /* - *err += android::base::StringPrintf("failed to stat %s try %d: %s\n", - blk_device.c_str(), tries, strerror(errno)); - */ - sleep(1); - } - } while (ret && tries < 10); - - if (ret) { - *err += "failed to stat " + blk_device + "\n"; - /* - *err += android::base::StringPrintf("failed to stat %s\n", blk_device.c_str()); - */ - } - return ret == 0; -} - -static bool read_misc_partition(void* p, size_t size, const std::string& misc_blk_device, - size_t offset, std::string* err) { - if (!wait_for_device(misc_blk_device, err)) { - return false; - } - - int fd(open(misc_blk_device.c_str(), O_RDONLY)); - if (fd < 0) { - *err = "failed to open " + misc_blk_device + ": "; - *err += strerror(errno); - /* - android::base::unique_fd fd(open(misc_blk_device.c_str(), O_RDONLY)); - if (fd == -1) { - *err = android::base::StringPrintf("failed to open %s: %s", misc_blk_device.c_str(), - strerror(errno)); - */ - return false; - } - if (lseek(fd, static_cast(offset), SEEK_SET) != static_cast(offset)) { - *err = "failed to lseek " + misc_blk_device + ": "; - *err += strerror(errno); - close(fd); - /* - - *err = android::base::StringPrintf("failed to lseek %s: %s", misc_blk_device.c_str(), - strerror(errno)); - */ - return false; - } - - if ((size_t)read(fd, p, size) != size) { - *err = "failed to read " + misc_blk_device + ": "; - *err += strerror(errno); - close(fd); - /* - if (!android::base::ReadFully(fd, p, size)) { - *err = android::base::StringPrintf("failed to read %s: %s", misc_blk_device.c_str(), - strerror(errno)); - */ - return false; - } - close(fd); - return true; -} - -static bool write_misc_partition(const void* p, size_t size, size_t offset, std::string* err) { - std::string misc_blk_device = get_misc_blk_device(err); - if (misc_blk_device.empty()) { - *err = "no misc device set"; - return false; - } - int fd = (open(misc_blk_device.c_str(), O_WRONLY | O_SYNC)); - if (fd == -1) { - *err = "failed to open " + misc_blk_device + ": "; - *err += strerror(errno); - /* -static bool write_misc_partition(const void* p, size_t size, const std::string& misc_blk_device, - size_t offset, std::string* err) { - android::base::unique_fd fd(open(misc_blk_device.c_str(), O_WRONLY)); - if (fd == -1) { - *err = android::base::StringPrintf("failed to open %s: %s", misc_blk_device.c_str(), - strerror(errno)); - */ - return false; - } - if (lseek(fd, static_cast(offset), SEEK_SET) != static_cast(offset)) { - *err = "failed to lseek " + misc_blk_device + ": "; - *err += strerror(errno); - close(fd); - /* - *err = android::base::StringPrintf("failed to lseek %s: %s", misc_blk_device.c_str(), - strerror(errno)); - */ - return false; - } - if ((size_t)write(fd, p, size) != size) { - *err = "failed to write " + misc_blk_device + ": "; - *err += strerror(errno); - close(fd); - /* - if (!android::base::WriteFully(fd, p, size)) { - *err = android::base::StringPrintf("failed to write %s: %s", misc_blk_device.c_str(), - strerror(errno)); - */ - return false; - } - - // TODO: O_SYNC and fsync duplicates each other? - if (fsync(fd) == -1) { - *err = "failed to fsync " + misc_blk_device + ": "; - *err += strerror(errno); - close(fd); - /* - if (fsync(fd) == -1) { - *err = android::base::StringPrintf("failed to fsync %s: %s", misc_blk_device.c_str(), - strerror(errno)); - */ - return false; - } - close(fd); - return true; -} - -bool read_bootloader_message_from(bootloader_message* boot, const std::string& misc_blk_device, - std::string* err) { - return read_misc_partition(boot, sizeof(*boot), misc_blk_device, - BOOTLOADER_MESSAGE_OFFSET_IN_MISC, err); -} - -bool read_bootloader_message(bootloader_message* boot, std::string* err) { - std::string misc_blk_device = get_misc_blk_device(err); - if (misc_blk_device.empty()) { - return false; - } - return read_bootloader_message_from(boot, misc_blk_device, err); -} - -bool write_bootloader_message_to(const bootloader_message& boot, __unused const std::string& misc_blk_device, - std::string* err) { - return write_misc_partition(&boot, sizeof(boot), - BOOTLOADER_MESSAGE_OFFSET_IN_MISC, err); -} - -bool write_bootloader_message(const bootloader_message& boot, std::string* err) { - std::string misc_blk_device = get_misc_blk_device(err); - if (misc_blk_device.empty()) { - return false; - } - return write_bootloader_message_to(boot, misc_blk_device, err); -} - -// libc++ in 5.1 does not know how to handle a std::string* so this craziness is needed -bool clear_bootloader_message(void* err) { - std::string &s = *(static_cast(err)); - return clear_bootloader_message(&s); -} - -bool clear_bootloader_message(std::string* err) { - bootloader_message boot = {}; - if (BOOTLOADER_MESSAGE_OFFSET_IN_MISC < sizeof(bootloader_message)) { - return write_misc_partition(&boot, sizeof(boot), 0 /* offset */, err); - } - return write_bootloader_message(boot, err); -} - -bool write_bootloader_message(const std::vector& options, std::string* err) { - bootloader_message boot = {}; - strlcpy(boot.command, "boot-recovery", sizeof(boot.command)); - strlcpy(boot.recovery, "recovery\n", sizeof(boot.recovery)); - for (const auto& s : options) { - strlcat(boot.recovery, s.c_str(), sizeof(boot.recovery)); - if (s.substr(s.size() - 1) != "\n") { - strlcat(boot.recovery, "\n", sizeof(boot.recovery)); - } - } - return write_bootloader_message(boot, err); -} - -bool update_bootloader_message(const std::vector& options, std::string* err) { - bootloader_message boot; - if (!read_bootloader_message(&boot, err)) { - return false; - } - - // Zero out the entire fields. - memset(boot.command, 0, sizeof(boot.command)); - memset(boot.recovery, 0, sizeof(boot.recovery)); - - strlcpy(boot.command, "boot-recovery", sizeof(boot.command)); - strlcpy(boot.recovery, "recovery\n", sizeof(boot.recovery)); - for (const auto& s : options) { - strlcat(boot.recovery, s.c_str(), sizeof(boot.recovery)); - if (s.back() != '\n') { - strlcat(boot.recovery, "\n", sizeof(boot.recovery)); - } - } - return write_bootloader_message(boot, err); -} - -bool write_reboot_bootloader(std::string* err) { - bootloader_message boot; - if (!read_bootloader_message(&boot, err)) { - return false; - } - if (boot.command[0] != '\0') { - *err = "Bootloader command pending."; - return false; - } - strlcpy(boot.command, "bootonce-bootloader", sizeof(boot.command)); - return write_bootloader_message(boot, err); -} - -bool read_wipe_package(std::string* package_data, size_t size, std::string* err) { - std::string misc_blk_device = get_misc_blk_device(err); - if (misc_blk_device.empty()) { - return false; - } - package_data->resize(size); - return read_misc_partition(&(*package_data)[0], size, misc_blk_device, - WIPE_PACKAGE_OFFSET_IN_MISC, err); -} - -bool write_wipe_package(const std::string& package_data, std::string* err) { - std::string misc_blk_device = get_misc_blk_device(err); - if (misc_blk_device.empty()) { - return false; - } - return write_misc_partition(package_data.data(), package_data.size(), - WIPE_PACKAGE_OFFSET_IN_MISC, err); -} - -extern "C" bool write_reboot_bootloader(void) { - std::string err; - return write_reboot_bootloader(&err); -} - -extern "C" bool write_bootloader_message(const char* options) { - std::string err; - bootloader_message boot = {}; - memcpy(&boot, options, sizeof(boot)); - return write_bootloader_message(boot, &err); -} - -static const char *COMMAND_FILE = "/cache/recovery/command"; -static const int MAX_ARG_LENGTH = 4096; -static const int MAX_ARGS = 100; - -// command line args come from, in decreasing precedence: -// - the actual command line -// - the bootloader control block (one per line, after "recovery") -// - the contents of COMMAND_FILE (one per line) -void -get_args(int *argc, char ***argv) { - bootloader_message boot = {}; - std::string err; - if (!read_bootloader_message(&boot, &err)) { - printf("%s\n", err.c_str()); - // If fails, leave a zeroed bootloader_message. - memset(&boot, 0, sizeof(boot)); - } - //stage = strndup(boot.stage, sizeof(boot.stage)); - - if (boot.command[0] != 0 && boot.command[0] != (char)255) { - printf("Boot command: %.*s\n", (int)sizeof(boot.command), boot.command); - } - - if (boot.status[0] != 0 && boot.status[0] != (char)255) { - printf("Boot status: %.*s\n", (int)sizeof(boot.status), boot.status); - } - - // --- if arguments weren't supplied, look in the bootloader control block - if (*argc <= 1) { - boot.recovery[sizeof(boot.recovery) - 1] = '\0'; // Ensure termination - const char *arg = strtok(boot.recovery, "\n"); - if (arg != NULL && !strcmp(arg, "recovery")) { - *argv = (char **) malloc(sizeof(char *) * MAX_ARGS); - (*argv)[0] = strdup(arg); - for (*argc = 1; *argc < MAX_ARGS; ++*argc) { - if ((arg = strtok(NULL, "\n")) == NULL) break; - -// if the device does not have an own recovery key combo we just want to open TWRP after -// walking through the factory reset screen - without actually doing a factory reset -#ifdef IGNORE_MISC_WIPE_DATA - if (!strcmp(arg, "--wipe_data")) { - (*argv)[*argc] = NULL; - *argc = *argc -1; - printf("Bootloader arg \"%s\" ignored because TWRP was compiled with TW_IGNORE_MISC_WIPE_DATA\n", arg); - continue; - } -#endif - (*argv)[*argc] = strdup(arg); - } - printf("Got arguments from boot message\n"); - } else if (boot.recovery[0] != 0 && boot.recovery[0] != (char)255) { - printf("Bad boot message\n\"%.20s\"\n", boot.recovery); - } - } - - // --- if that doesn't work, try the command file (if we have /cache). - if (*argc <= 1/* && has_cache*/) { - FILE *fp = fopen(COMMAND_FILE, "r"); - if (fp != NULL) { - char *token; - char *argv0 = (*argv)[0]; - *argv = (char **) malloc(sizeof(char *) * MAX_ARGS); - (*argv)[0] = argv0; // use the same program name - - char buf[MAX_ARG_LENGTH]; - for (*argc = 1; *argc < MAX_ARGS; ++*argc) { - if (!fgets(buf, sizeof(buf), fp)) break; - token = strtok(buf, "\r\n"); - if (token != NULL) { - (*argv)[*argc] = strdup(token); // Strip newline. - } else { - --*argc; - } - } - - fclose(fp); - printf("Got arguments from %s\n", COMMAND_FILE); - } - } - - // --> write the arguments we have back into the bootloader control block - // always boot into recovery after this (until finish_recovery() is called) - strlcpy(boot.command, "boot-recovery", sizeof(boot.command)); - strlcpy(boot.recovery, "recovery\n", sizeof(boot.recovery)); - int i; - for (i = 1; i < *argc; ++i) { - strlcat(boot.recovery, (*argv)[i], sizeof(boot.recovery)); - strlcat(boot.recovery, "\n", sizeof(boot.recovery)); - } - if (!write_bootloader_message(boot, &err)) { - printf("%s\n", err.c_str()); - } -} diff --git a/bootloader_message_twrp/include/bootloader_message_twrp/bootloader_message.h b/bootloader_message_twrp/include/bootloader_message_twrp/bootloader_message.h deleted file mode 100644 index d8d955e7..00000000 --- a/bootloader_message_twrp/include/bootloader_message_twrp/bootloader_message.h +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright (C) 2008 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. - */ - -#ifndef _BOOTLOADER_MESSAGE_TWRP_H -#define _BOOTLOADER_MESSAGE_TWRP_H - -#include -#include -#include - -/* Bootloader Message (2-KiB) - * - * This structure describes the content of a block in flash - * that is used for recovery and the bootloader to talk to - * each other. - * - * The command field is updated by linux when it wants to - * reboot into recovery or to update radio or bootloader firmware. - * It is also updated by the bootloader when firmware update - * is complete (to boot into recovery for any final cleanup) - * - * The status field was used by the bootloader after the completion - * of an "update-radio" or "update-hboot" command, which has been - * deprecated since Froyo. - * - * The recovery field is only written by linux and used - * for the system to send a message to recovery or the - * other way around. - * - * The stage field is written by packages which restart themselves - * multiple times, so that the UI can reflect which invocation of the - * package it is. If the value is of the format "#/#" (eg, "1/3"), - * the UI will add a simple indicator of that status. - * - * We used to have slot_suffix field for A/B boot control metadata in - * this struct, which gets unintentionally cleared by recovery or - * uncrypt. Move it into struct bootloader_message_ab to avoid the - * issue. - */ -struct bootloader_message { - char command[32]; - char status[32]; - char recovery[768]; - - // The 'recovery' field used to be 1024 bytes. It has only ever - // been used to store the recovery command line, so 768 bytes - // should be plenty. We carve off the last 256 bytes to store the - // stage string (for multistage packages) and possible future - // expansion. - char stage[32]; - - // The 'reserved' field used to be 224 bytes when it was initially - // carved off from the 1024-byte recovery field. Bump it up to - // 1184-byte so that the entire bootloader_message struct rounds up - // to 2048-byte. - char reserved[1184]; -}; - -/** - * We must be cautious when changing the bootloader_message struct size, - * because A/B-specific fields may end up with different offsets. - */ -/*#if (__STDC_VERSION__ >= 201112L) || defined(__cplusplus) -static_assert(sizeof(struct bootloader_message) == 2048, - "struct bootloader_message size changes, which may break A/B devices"); -#endif*/ - -/** - * The A/B-specific bootloader message structure (4-KiB). - * - * We separate A/B boot control metadata from the regular bootloader - * message struct and keep it here. Everything that's A/B-specific - * stays after struct bootloader_message, which should be managed by - * the A/B-bootloader or boot control HAL. - * - * The slot_suffix field is used for A/B implementations where the - * bootloader does not set the androidboot.ro.boot.slot_suffix kernel - * commandline parameter. This is used by fs_mgr to mount /system and - * other partitions with the slotselect flag set in fstab. A/B - * implementations are free to use all 32 bytes and may store private - * data past the first NUL-byte in this field. It is encouraged, but - * not mandatory, to use 'struct bootloader_control' described below. - */ -struct bootloader_message_ab { - struct bootloader_message message; - char slot_suffix[32]; - - // Round up the entire struct to 4096-byte. - char reserved[2016]; -}; - -/** - * Be cautious about the struct size change, in case we put anything post - * bootloader_message_ab struct (b/29159185). - */ -/*#if (__STDC_VERSION__ >= 201112L) || defined(__cplusplus) -static_assert(sizeof(struct bootloader_message_ab) == 4096, - "struct bootloader_message_ab size changes"); -#endif*/ - -#define BOOT_CTRL_MAGIC 0x42414342 /* Bootloader Control AB */ -#define BOOT_CTRL_VERSION 1 - -struct slot_metadata { - // Slot priority with 15 meaning highest priority, 1 lowest - // priority and 0 the slot is unbootable. - uint8_t priority : 4; - // Number of times left attempting to boot this slot. - uint8_t tries_remaining : 3; - // 1 if this slot has booted successfully, 0 otherwise. - uint8_t successful_boot : 1; - // 1 if this slot is corrupted from a dm-verity corruption, 0 - // otherwise. - uint8_t verity_corrupted : 1; - // Reserved for further use. - uint8_t reserved : 7; -} __attribute__((packed)); - -/* Bootloader Control AB - * - * This struct can be used to manage A/B metadata. It is designed to - * be put in the 'slot_suffix' field of the 'bootloader_message' - * structure described above. It is encouraged to use the - * 'bootloader_control' structure to store the A/B metadata, but not - * mandatory. - */ -struct bootloader_control { - // NUL terminated active slot suffix. - char slot_suffix[4]; - // Bootloader Control AB magic number (see BOOT_CTRL_MAGIC). - uint32_t magic; - // Version of struct being used (see BOOT_CTRL_VERSION). - uint8_t version; - // Number of slots being managed. - uint8_t nb_slot : 3; - // Number of times left attempting to boot recovery. - uint8_t recovery_tries_remaining : 3; - // Ensure 4-bytes alignment for slot_info field. - uint8_t reserved0[2]; - // Per-slot information. Up to 4 slots. - struct slot_metadata slot_info[4]; - // Reserved for further use. - uint8_t reserved1[8]; - // CRC32 of all 28 bytes preceding this field (little endian - // format). - uint32_t crc32_le; -} __attribute__((packed)); - -/*#if (__STDC_VERSION__ >= 201112L) || defined(__cplusplus) -static_assert(sizeof(struct bootloader_control) == - sizeof(((struct bootloader_message_ab *)0)->slot_suffix), - "struct bootloader_control has wrong size"); -#endif*/ - -#ifdef __cplusplus - -#include -#include - -// Read bootloader message into boot. Error message will be set in err. -bool read_bootloader_message(bootloader_message* boot, std::string* err); - -// Read bootloader message from the specified misc device into boot. -bool read_bootloader_message_from(bootloader_message* boot, const std::string& misc_blk_device, - std::string* err); - -// Write bootloader message to BCB. -bool write_bootloader_message(const bootloader_message& boot, std::string* err); - -// Write bootloader message to the specified BCB device. -bool write_bootloader_message_to(const bootloader_message& boot, - const std::string& misc_blk_device, std::string* err); - -// Write bootloader message (boots into recovery with the options) to BCB. Will -// set the command and recovery fields, and reset the rest. -bool write_bootloader_message(const std::vector& options, std::string* err); - -// Update bootloader message (boots into recovery with the options) to BCB. Will -// only update the command and recovery fields. -bool update_bootloader_message(const std::vector& options, std::string* err); - -// Clear BCB. -bool clear_bootloader_message(void* err); -bool clear_bootloader_message(std::string* err); - -// Writes the reboot-bootloader reboot reason to the bootloader_message. -bool write_reboot_bootloader(std::string* err); - -// Read the wipe package from BCB (from offset WIPE_PACKAGE_OFFSET_IN_MISC). -bool read_wipe_package(std::string* package_data, size_t size, std::string* err); - -void set_misc_device(const char* name); -void get_args(int *argc, char ***argv); - -// Write the wipe package into BCB (to offset WIPE_PACKAGE_OFFSET_IN_MISC). -bool write_wipe_package(const std::string& package_data, std::string* err); - -#else - -#include - -// C Interface. -bool write_bootloader_message(const char* options); -bool write_reboot_bootloader(void); - -#endif // ifdef __cplusplus - -#endif // _BOOTLOADER_MESSAGE_TWRP_H diff --git a/data.cpp b/data.cpp index a13fbe79..571def68 100755 --- a/data.cpp +++ b/data.cpp @@ -717,6 +717,10 @@ void DataManager::SetDefaultValues() printf("TW_HAS_EDL_MODE := true\n"); mConst.SetValue(TW_EDL_MODE, "1"); #endif +#ifdef PRODUCT_USE_DYNAMIC_PARTITIONS + printf("PRODUCT_USE_DYNAMIC_PARTITIONS := true\n"); + mConst.SetValue(TW_FASTBOOT_MODE, "1"); +#endif #ifdef TW_INCLUDE_CRYPTO mConst.SetValue(TW_HAS_CRYPTO, "1"); printf("TW_INCLUDE_CRYPTO := true\n"); @@ -792,6 +796,7 @@ void DataManager::SetDefaultValues() mData.SetValue("tw_encrypt_backup", "0"); mData.SetValue("tw_sleep_total", "5"); mData.SetValue("tw_sleep", "5"); + mData.SetValue("tw_enable_fastboot", "0"); // Brightness handling string findbright; diff --git a/gui/action.cpp b/gui/action.cpp index 5e842d50..19c3d093 100755 --- a/gui/action.cpp +++ b/gui/action.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -201,6 +202,8 @@ GUIAction::GUIAction(xml_node<>* node) ADD_ACTION(setlanguage); ADD_ACTION(checkforapp); ADD_ACTION(togglebacklight); + ADD_ACTION(enableadb); + ADD_ACTION(enablefastboot); // remember actions that run in the caller thread for (mapFunc::const_iterator it = mf.begin(); it != mf.end(); ++it) @@ -2242,3 +2245,16 @@ exit: operation_end(op_status); return 0; } + + +int GUIAction::enableadb(std::string arg __unused) { + android::base::SetProperty("sys.usb.config", "none"); + android::base::SetProperty("sys.usb.config", "adb"); + return 0; +} + +int GUIAction::enablefastboot(std::string arg __unused) { + android::base::SetProperty("sys.usb.config", "none"); + android::base::SetProperty("sys.usb.config", "fastboot"); + return 0; +} diff --git a/gui/console.cpp b/gui/console.cpp old mode 100644 new mode 100755 index 03628ec3..77fdd967 --- a/gui/console.cpp +++ b/gui/console.cpp @@ -1,5 +1,5 @@ /* - Copyright 2015 bigbiff/Dees_Troy TeamWin + Copyright 2012 - 2020 TeamWin This file is part of TWRP/TeamWin Recovery Project. TWRP is free software: you can redistribute it and/or modify diff --git a/gui/gui.cpp b/gui/gui.cpp index 46286507..2a36fece 100755 --- a/gui/gui.cpp +++ b/gui/gui.cpp @@ -650,8 +650,9 @@ static int runPages(const char *page_name, const int stop_on_page_done) gui_changePage("main"); break; } - if (DataManager::GetIntValue("tw_gui_done") != 0) + if (DataManager::GetIntValue("tw_gui_done") != 0) { break; + } } if (ors_read_fd > 0) close(ors_read_fd); diff --git a/gui/objects.hpp b/gui/objects.hpp old mode 100644 new mode 100755 index 24e9d247..ccfc5221 --- a/gui/objects.hpp +++ b/gui/objects.hpp @@ -371,7 +371,8 @@ protected: int uninstalltwrpsystemapp(std::string arg); int repackimage(std::string arg); int fixabrecoverybootloop(std::string arg); - + int enableadb(std::string arg); + int enablefastboot(std::string arg); int simulate; }; diff --git a/gui/theme/common/landscape.xml b/gui/theme/common/landscape.xml index 67c8f911..3fbac9ee 100755 --- a/gui/theme/common/landscape.xml +++ b/gui/theme/common/landscape.xml @@ -2639,6 +2639,133 @@ + +