From afb9f827ac774de1b9d0944b19711a100d1fd0aa Mon Sep 17 00:00:00 2001 From: Chaosmaster Date: Tue, 6 Jun 2023 17:56:45 +0200 Subject: [PATCH] FP3: Fix bootctrl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FP3: Build bootctrl using Soong This is required to build the recovery variant of the same to be used by fastbootd. Bug: 78793464 Test: make Bug: 34254109 Change-Id: I16eddcb853bda1a9969810f258884ebdbbfc1f5c Merged-In: I16eddcb853bda1a9969810f258884ebdbbfc1f5c (cherry picked from commit 805edb72d0bca42c59421440a896829e9a30c574) Signed-off-by: Sevenrock Signed-off-by: Joshua Blanchard FP3: gpt-utils: merge in LA.UM.8.6.2.r1-07600-89xx.0 * from https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/recovery-ext/log/?h=LA.UM.8.6.2.r1-07600-89xx.0 Change-Id: Ic703489d28f34514b38990a7fac879103ba49710 FP3: gpt-utils: Build libgptutils with Android.bp This is required to build bootctrl.msm8953 with Android.bp. Bug: 78793464 Test: make Change-Id: Iff4f50ad363cc003d60a5380addd79749b547514 Signed-off-by: Joshua Blanchard FP3: gpt-utils: Add debug messages and fix format warnings Bug: 30125830 Change-Id: Ic0965f7b516fadf2dee9fcc494a5868a979ac61b FP3: gpt-utils: Address the warnings [ 11% 2/18] target C++: libgptutils <= device/google/crosshatch/gpt-utils/gpt-utils.cpp In file included from device/google/crosshatch/gpt-utils/gpt-utils.cpp:54: system/core/libcutils/include_vndk/cutils/log.h:38:2: warning: "Deprecated: don't include cutils/log.h, use either android/log.h or log/log.h" [-W#warnings] ^ device/google/crosshatch/gpt-utils/gpt-utils.cpp:750:17: warning: unused variable 'ufs_dir_stat' [-Wunused-variable] struct stat ufs_dir_stat; ^ device/google/crosshatch/gpt-utils/gpt-utils.cpp:973:13: warning: unused variable 'r' [-Wunused-variable] int r, fd; ^ device/google/crosshatch/gpt-utils/gpt-utils.cpp:973:16: warning: unused variable 'fd' [-Wunused-variable] int r, fd; ^ 4 warnings generated. Test: lunch blueline-userdebug && m -j libgptutils Change-Id: Idd9174276d8a5b7b77c2ec48c745a78184f65fcf FP3: gpt-utils: Drop unnecessary include * When using generated_kernel_headers including asm/byteorder.h will cause a warning due to unused static functions. Change-Id: I2a74ec92487c13c4645048c96da8cb92b3cbd9f0 Co-authored-by: Hridya Valsaraju Co-authored-by: Sooraj Sizon Co-authored-by: Sivaram Vempati Co-authored-by: Tao Bao Co-authored-by: Ɓukasz Patron Change-Id: Ibfde2eaba49499ecf9a2032c6e58d71d9977fb1d --- bootctrl/Android.bp | 23 + bootctrl/Android.mk | 32 - bootctrl/NOTICE | 26 - bootctrl/boot_control.cpp | 681 ------------------ gpt-utils/Android.bp | 31 + .../gpt-utils => gpt-utils}/gpt-utils.cpp | 33 +- {recovery/gpt-utils => gpt-utils}/gpt-utils.h | 0 .../gpt-utils => gpt-utils}/scsi/ufs/ioctl.h | 0 .../gpt-utils => gpt-utils}/scsi/ufs/ufs.h | 0 recovery/Android.mk | 1 - recovery/gpt-utils/Android.mk | 46 -- recovery/root/init.recovery.qcom.rc | 1 + twrp_FP3.mk | 3 + 13 files changed, 84 insertions(+), 793 deletions(-) create mode 100644 bootctrl/Android.bp delete mode 100644 bootctrl/Android.mk delete mode 100644 bootctrl/NOTICE delete mode 100644 bootctrl/boot_control.cpp create mode 100644 gpt-utils/Android.bp rename {recovery/gpt-utils => gpt-utils}/gpt-utils.cpp (97%) rename {recovery/gpt-utils => gpt-utils}/gpt-utils.h (100%) rename {recovery/gpt-utils => gpt-utils}/scsi/ufs/ioctl.h (100%) rename {recovery/gpt-utils => gpt-utils}/scsi/ufs/ufs.h (100%) delete mode 100644 recovery/Android.mk delete mode 100644 recovery/gpt-utils/Android.mk diff --git a/bootctrl/Android.bp b/bootctrl/Android.bp new file mode 100644 index 0000000..2008915 --- /dev/null +++ b/bootctrl/Android.bp @@ -0,0 +1,23 @@ +// +// Copyright (C) 2018 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. +// +package { + //default_applicable_licenses: ["Android-Apache-2.0"], +} +cc_library { + name: "bootctrl.msm8953", + defaults: ["bootctrl_hal_defaults"], + static_libs: ["libgptutils.fp3"], +} diff --git a/bootctrl/Android.mk b/bootctrl/Android.mk deleted file mode 100644 index cefd468..0000000 --- a/bootctrl/Android.mk +++ /dev/null @@ -1,32 +0,0 @@ -ifeq ($(AB_OTA_UPDATER),true) -# TODO: Find a better way to separate build configs for ADP vs non-ADP devices -ifneq ($(BOARD_IS_AUTOMOTIVE),true) -ifneq ($(filter msm8953 msm8996 msm8998 sdm845,$(TARGET_BOARD_PLATFORM)),) -LOCAL_PATH := $(call my-dir) - -# HAL Shared library for the target. Used by libhardware. -include $(CLEAR_VARS) -LOCAL_C_INCLUDES += $(TARGET_OUT_HEADERS)/gpt-utils/inc -LOCAL_CFLAGS += -Wall -Werror -LOCAL_SHARED_LIBRARIES += liblog libgptutils libcutils -LOCAL_HEADER_LIBRARIES := libhardware_headers libsystem_headers -LOCAL_SRC_FILES := boot_control.cpp -LOCAL_MODULE_RELATIVE_PATH := hw -LOCAL_MODULE := bootctrl.$(TARGET_BOARD_PLATFORM) -LOCAL_MODULE_OWNER := qcom -LOCAL_PROPRIETARY_MODULE := true -include $(BUILD_SHARED_LIBRARY) - -# Static library for the target. Used by update_engine_sideload from recovery. -include $(CLEAR_VARS) -LOCAL_C_INCLUDES += $(TARGET_OUT_HEADERS)/gpt-utils/inc -LOCAL_CFLAGS += -Wall -Werror -LOCAL_SHARED_LIBRARIES += liblog libgptutils libcutils -LOCAL_HEADER_LIBRARIES := libhardware_headers libsystem_headers -LOCAL_SRC_FILES := boot_control.cpp -LOCAL_MODULE := bootctrl.$(TARGET_BOARD_PLATFORM) -include $(BUILD_STATIC_LIBRARY) - -endif -endif -endif diff --git a/bootctrl/NOTICE b/bootctrl/NOTICE deleted file mode 100644 index 820d40c..0000000 --- a/bootctrl/NOTICE +++ /dev/null @@ -1,26 +0,0 @@ -Copyright (c) 2016, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/bootctrl/boot_control.cpp b/bootctrl/boot_control.cpp deleted file mode 100644 index e3eff6e..0000000 --- a/bootctrl/boot_control.cpp +++ /dev/null @@ -1,681 +0,0 @@ -/* - * Copyright (c) 2016, The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#include -#include -#include -#include -#ifdef __cplusplus -extern "C" { -#endif -#include -#define LOG_TAG "bootcontrolhal" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "gpt-utils.h" - -#define BOOTDEV_DIR "/dev/block/bootdevice/by-name" -#define BOOT_IMG_PTN_NAME "boot" -#define LUN_NAME_END_LOC 14 -#define BOOT_SLOT_PROP "ro.boot.slot_suffix" - -#define SLOT_ACTIVE 1 -#define SLOT_INACTIVE 2 -#define UPDATE_SLOT(pentry, guid, slot_state) ({ \ - memcpy(pentry, guid, TYPE_GUID_SIZE); \ - if (slot_state == SLOT_ACTIVE)\ - *(pentry + AB_FLAG_OFFSET) = AB_SLOT_ACTIVE_VAL; \ - else if (slot_state == SLOT_INACTIVE) \ - *(pentry + AB_FLAG_OFFSET) = (*(pentry + AB_FLAG_OFFSET)& \ - ~AB_PARTITION_ATTR_SLOT_ACTIVE); \ - }) - -using namespace std; -const char *slot_suffix_arr[] = { - AB_SLOT_A_SUFFIX, - AB_SLOT_B_SUFFIX, - NULL}; - -enum part_attr_type { - ATTR_SLOT_ACTIVE = 0, - ATTR_BOOT_SUCCESSFUL, - ATTR_UNBOOTABLE, -}; - -void boot_control_init(struct boot_control_module *module) -{ - if (!module) { - ALOGE("Invalid argument passed to %s", __func__); - return; - } - return; -} - -//Get the value of one of the attribute fields for a partition. -static int get_partition_attribute(char *partname, - enum part_attr_type part_attr) -{ - struct gpt_disk *disk = NULL; - uint8_t *pentry = NULL; - int retval = -1; - uint8_t *attr = NULL; - if (!partname) - goto error; - disk = gpt_disk_alloc(); - if (!disk) { - ALOGE("%s: Failed to alloc disk struct", __func__); - goto error; - } - if (gpt_disk_get_disk_info(partname, disk)) { - ALOGE("%s: Failed to get disk info", __func__); - goto error; - } - pentry = gpt_disk_get_pentry(disk, partname, PRIMARY_GPT); - if (!pentry) { - ALOGE("%s: pentry does not exist in disk struct", - __func__); - goto error; - } - attr = pentry + AB_FLAG_OFFSET; - if (part_attr == ATTR_SLOT_ACTIVE) - retval = !!(*attr & AB_PARTITION_ATTR_SLOT_ACTIVE); - else if (part_attr == ATTR_BOOT_SUCCESSFUL) - retval = !!(*attr & AB_PARTITION_ATTR_BOOT_SUCCESSFUL); - else if (part_attr == ATTR_UNBOOTABLE) - retval = !!(*attr & AB_PARTITION_ATTR_UNBOOTABLE); - else - retval = -1; - gpt_disk_free(disk); - return retval; -error: - if (disk) - gpt_disk_free(disk); - return retval; -} - -//Set a particular attribute for all the partitions in a -//slot -static int update_slot_attribute(const char *slot, - enum part_attr_type ab_attr) -{ - unsigned int i = 0; - char buf[PATH_MAX]; - struct stat st; - struct gpt_disk *disk = NULL; - uint8_t *pentry = NULL; - uint8_t *pentry_bak = NULL; - int rc = -1; - uint8_t *attr = NULL; - uint8_t *attr_bak = NULL; - char partName[MAX_GPT_NAME_SIZE + 1] = {0}; - const char ptn_list[][MAX_GPT_NAME_SIZE] = { AB_PTN_LIST }; - int slot_name_valid = 0; - if (!slot) { - ALOGE("%s: Invalid argument", __func__); - goto error; - } - for (i = 0; slot_suffix_arr[i] != NULL; i++) - { - if (!strncmp(slot, slot_suffix_arr[i], - strlen(slot_suffix_arr[i]))) - slot_name_valid = 1; - } - if (!slot_name_valid) { - ALOGE("%s: Invalid slot name", __func__); - goto error; - } - for (i=0; i < ARRAY_SIZE(ptn_list); i++) { - memset(buf, '\0', sizeof(buf)); - //Check if A/B versions of this ptn exist - snprintf(buf, sizeof(buf) - 1, - "%s/%s%s", - BOOT_DEV_DIR, - ptn_list[i], - AB_SLOT_A_SUFFIX - ); - if (stat(buf, &st)) { - //partition does not have _a version - continue; - } - memset(buf, '\0', sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, - "%s/%s%s", - BOOT_DEV_DIR, - ptn_list[i], - AB_SLOT_B_SUFFIX - ); - if (stat(buf, &st)) { - //partition does not have _a version - continue; - } - memset(partName, '\0', sizeof(partName)); - snprintf(partName, - sizeof(partName) - 1, - "%s%s", - ptn_list[i], - slot); - disk = gpt_disk_alloc(); - if (!disk) { - ALOGE("%s: Failed to alloc disk struct", - __func__); - goto error; - } - rc = gpt_disk_get_disk_info(partName, disk); - if (rc != 0) { - ALOGE("%s: Failed to get disk info for %s", - __func__, - partName); - goto error; - } - pentry = gpt_disk_get_pentry(disk, partName, PRIMARY_GPT); - pentry_bak = gpt_disk_get_pentry(disk, partName, SECONDARY_GPT); - if (!pentry || !pentry_bak) { - ALOGE("%s: Failed to get pentry/pentry_bak for %s", - __func__, - partName); - goto error; - } - attr = pentry + AB_FLAG_OFFSET; - attr_bak = pentry_bak + AB_FLAG_OFFSET; - if (ab_attr == ATTR_BOOT_SUCCESSFUL) { - *attr = (*attr) | AB_PARTITION_ATTR_BOOT_SUCCESSFUL; - *attr_bak = (*attr_bak) | - AB_PARTITION_ATTR_BOOT_SUCCESSFUL; - } else if (ab_attr == ATTR_UNBOOTABLE) { - *attr = (*attr) | AB_PARTITION_ATTR_UNBOOTABLE; - *attr_bak = (*attr_bak) | AB_PARTITION_ATTR_UNBOOTABLE; - } else if (ab_attr == ATTR_SLOT_ACTIVE) { - *attr = (*attr) | AB_PARTITION_ATTR_SLOT_ACTIVE; - *attr_bak = (*attr) | AB_PARTITION_ATTR_SLOT_ACTIVE; - } else { - ALOGE("%s: Unrecognized attr", __func__); - goto error; - } - if (gpt_disk_update_crc(disk)) { - ALOGE("%s: Failed to update crc for %s", - __func__, - partName); - goto error; - } - if (gpt_disk_commit(disk)) { - ALOGE("%s: Failed to write back entry for %s", - __func__, - partName); - goto error; - } - gpt_disk_free(disk); - disk = NULL; - } - return 0; -error: - if (disk) - gpt_disk_free(disk); - return -1; -} - -unsigned get_number_slots(struct boot_control_module *module) -{ - struct dirent *de = NULL; - DIR *dir_bootdev = NULL; - unsigned slot_count = 0; - if (!module) { - ALOGE("%s: Invalid argument", __func__); - goto error; - } - dir_bootdev = opendir(BOOTDEV_DIR); - if (!dir_bootdev) { - ALOGE("%s: Failed to open bootdev dir (%s)", - __func__, - strerror(errno)); - goto error; - } - while ((de = readdir(dir_bootdev))) { - if (de->d_name[0] == '.') - continue; - if (!strncmp(de->d_name, BOOT_IMG_PTN_NAME, - strlen(BOOT_IMG_PTN_NAME))) - slot_count++; - } - closedir(dir_bootdev); - return slot_count; -error: - if (dir_bootdev) - closedir(dir_bootdev); - return 0; -} - -unsigned get_current_slot(struct boot_control_module *module) -{ - uint32_t num_slots = 0; - char bootSlotProp[PROPERTY_VALUE_MAX] = {'\0'}; - unsigned i = 0; - if (!module) { - ALOGE("%s: Invalid argument", __func__); - goto error; - } - num_slots = get_number_slots(module); - if (num_slots <= 1) { - //Slot 0 is the only slot around. - return 0; - } - property_get(BOOT_SLOT_PROP, bootSlotProp, "N/A"); - if (!strncmp(bootSlotProp, "N/A", strlen("N/A"))) { - ALOGE("%s: Unable to read boot slot property", - __func__); - goto error; - } - //Iterate through a list of partitons named as boot+suffix - //and see which one is currently active. - for (i = 0; slot_suffix_arr[i] != NULL ; i++) { - if (!strncmp(bootSlotProp, - slot_suffix_arr[i], - strlen(slot_suffix_arr[i]))) - return i; - } -error: - //The HAL spec requires that we return a number between - //0 to num_slots - 1. Since something went wrong here we - //are just going to return the default slot. - return 0; -} - -static int boot_control_check_slot_sanity(struct boot_control_module *module, - unsigned slot) -{ - if (!module) - return -1; - uint32_t num_slots = get_number_slots(module); - if ((num_slots < 1) || (slot > num_slots - 1)) { - ALOGE("Invalid slot number"); - return -1; - } - return 0; - -} - -int mark_boot_successful(struct boot_control_module *module) -{ - unsigned cur_slot = 0; - if (!module) { - ALOGE("%s: Invalid argument", __func__); - goto error; - } - cur_slot = get_current_slot(module); - if (update_slot_attribute(slot_suffix_arr[cur_slot], - ATTR_BOOT_SUCCESSFUL)) { - goto error; - } - return 0; -error: - ALOGE("%s: Failed to mark boot successful", __func__); - return -1; -} - -const char *get_suffix(struct boot_control_module *module, unsigned slot) -{ - if (boot_control_check_slot_sanity(module, slot) != 0) - return NULL; - else - return slot_suffix_arr[slot]; -} - - -//Return a gpt disk structure representing the disk that holds -//partition. -static struct gpt_disk* boot_ctl_get_disk_info(char *partition) -{ - struct gpt_disk *disk = NULL; - if (!partition) - return NULL; - disk = gpt_disk_alloc(); - if (!disk) { - ALOGE("%s: Failed to alloc disk", - __func__); - goto error; - } - if (gpt_disk_get_disk_info(partition, disk)) { - ALOGE("failed to get disk info for %s", - partition); - goto error; - } - return disk; -error: - if (disk) - gpt_disk_free(disk); - return NULL; -} - -//The argument here is a vector of partition names(including the slot suffix) -//that lie on a single disk -static int boot_ctl_set_active_slot_for_partitions(vector part_list, - unsigned slot) -{ - char buf[PATH_MAX] = {0}; - struct gpt_disk *disk = NULL; - char slotA[MAX_GPT_NAME_SIZE + 1] = {0}; - char slotB[MAX_GPT_NAME_SIZE + 1] = {0}; - char active_guid[TYPE_GUID_SIZE + 1] = {0}; - char inactive_guid[TYPE_GUID_SIZE + 1] = {0}; - //Pointer to the partition entry of current 'A' partition - uint8_t *pentryA = NULL; - uint8_t *pentryA_bak = NULL; - //Pointer to partition entry of current 'B' partition - uint8_t *pentryB = NULL; - uint8_t *pentryB_bak = NULL; - struct stat st; - vector::iterator partition_iterator; - - for (partition_iterator = part_list.begin(); - partition_iterator != part_list.end(); - partition_iterator++) { - //Chop off the slot suffix from the partition name to - //make the string easier to work with. - string prefix = *partition_iterator; - if (prefix.size() < (strlen(AB_SLOT_A_SUFFIX) + 1)) { - ALOGE("Invalid partition name: %s", prefix.c_str()); - goto error; - } - prefix.resize(prefix.size() - strlen(AB_SLOT_A_SUFFIX)); - //Check if A/B versions of this ptn exist - snprintf(buf, sizeof(buf) - 1, "%s/%s%s", BOOT_DEV_DIR, - prefix.c_str(), - AB_SLOT_A_SUFFIX); - if (stat(buf, &st)) - continue; - memset(buf, '\0', sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, "%s/%s%s", BOOT_DEV_DIR, - prefix.c_str(), - AB_SLOT_B_SUFFIX); - if (stat(buf, &st)) - continue; - memset(slotA, 0, sizeof(slotA)); - memset(slotB, 0, sizeof(slotA)); - snprintf(slotA, sizeof(slotA) - 1, "%s%s", prefix.c_str(), - AB_SLOT_A_SUFFIX); - snprintf(slotB, sizeof(slotB) - 1,"%s%s", prefix.c_str(), - AB_SLOT_B_SUFFIX); - //Get the disk containing the partitions that were passed in. - //All partitions passed in must lie on the same disk. - if (!disk) { - disk = boot_ctl_get_disk_info(slotA); - if (!disk) - goto error; - } - //Get partition entry for slot A & B from the primary - //and backup tables. - pentryA = gpt_disk_get_pentry(disk, slotA, PRIMARY_GPT); - pentryA_bak = gpt_disk_get_pentry(disk, slotA, SECONDARY_GPT); - pentryB = gpt_disk_get_pentry(disk, slotB, PRIMARY_GPT); - pentryB_bak = gpt_disk_get_pentry(disk, slotB, SECONDARY_GPT); - if ( !pentryA || !pentryA_bak || !pentryB || !pentryB_bak) { - //None of these should be NULL since we have already - //checked for A & B versions earlier. - ALOGE("Slot pentries for %s not found.", - prefix.c_str()); - goto error; - } - memset(active_guid, '\0', sizeof(active_guid)); - memset(inactive_guid, '\0', sizeof(inactive_guid)); - if (get_partition_attribute(slotA, ATTR_SLOT_ACTIVE) == 1) { - //A is the current active slot - memcpy((void*)active_guid, (const void*)pentryA, - TYPE_GUID_SIZE); - memcpy((void*)inactive_guid,(const void*)pentryB, - TYPE_GUID_SIZE); - } else if (get_partition_attribute(slotB, - ATTR_SLOT_ACTIVE) == 1) { - //B is the current active slot - memcpy((void*)active_guid, (const void*)pentryB, - TYPE_GUID_SIZE); - memcpy((void*)inactive_guid, (const void*)pentryA, - TYPE_GUID_SIZE); - } else { - ALOGE("Both A & B for %s are inactive..Aborting", - prefix.c_str()); - goto error; - } - if (!strncmp(slot_suffix_arr[slot], AB_SLOT_A_SUFFIX, - strlen(AB_SLOT_A_SUFFIX))){ - //Mark A as active in primary table - UPDATE_SLOT(pentryA, active_guid, SLOT_ACTIVE); - //Mark A as active in backup table - UPDATE_SLOT(pentryA_bak, active_guid, SLOT_ACTIVE); - //Mark B as inactive in primary table - UPDATE_SLOT(pentryB, inactive_guid, SLOT_INACTIVE); - //Mark B as inactive in backup table - UPDATE_SLOT(pentryB_bak, inactive_guid, SLOT_INACTIVE); - } else if (!strncmp(slot_suffix_arr[slot], AB_SLOT_B_SUFFIX, - strlen(AB_SLOT_B_SUFFIX))){ - //Mark B as active in primary table - UPDATE_SLOT(pentryB, active_guid, SLOT_ACTIVE); - //Mark B as active in backup table - UPDATE_SLOT(pentryB_bak, active_guid, SLOT_ACTIVE); - //Mark A as inavtive in primary table - UPDATE_SLOT(pentryA, inactive_guid, SLOT_INACTIVE); - //Mark A as inactive in backup table - UPDATE_SLOT(pentryA_bak, inactive_guid, SLOT_INACTIVE); - } else { - //Something has gone terribly terribly wrong - ALOGE("%s: Unknown slot suffix!", __func__); - goto error; - } - if (disk) { - if (gpt_disk_update_crc(disk) != 0) { - ALOGE("%s: Failed to update gpt_disk crc", - __func__); - goto error; - } - } - } - //write updated content to disk - if (disk) { - if (gpt_disk_commit(disk)) { - ALOGE("Failed to commit disk entry"); - goto error; - } - gpt_disk_free(disk); - } - return 0; - -error: - if (disk) - gpt_disk_free(disk); - return -1; -} - -int set_active_boot_slot(struct boot_control_module *module, unsigned slot) -{ - map> ptn_map; - vector ptn_vec; - const char ptn_list[][MAX_GPT_NAME_SIZE] = { AB_PTN_LIST }; - uint32_t i; - int rc = -1; - int is_ufs = gpt_utils_is_ufs_device(); - map>::iterator map_iter; - vector::iterator string_iter; - - if (boot_control_check_slot_sanity(module, slot)) { - ALOGE("%s: Bad arguments", __func__); - goto error; - } - //The partition list just contains prefixes(without the _a/_b) of the - //partitions that support A/B. In order to get the layout we need the - //actual names. To do this we append the slot suffix to every member - //in the list. - for (i = 0; i < ARRAY_SIZE(ptn_list); i++) { - //XBL & XBL_CFG are handled differrently for ufs devices so - //ignore them - if (is_ufs && (!strncmp(ptn_list[i], - PTN_XBL, - strlen(PTN_XBL)) - || !strncmp(ptn_list[i], - PTN_XBL_CFG, - strlen(PTN_XBL_CFG)))) - continue; - //The partition list will be the list of _a partitions - string cur_ptn = ptn_list[i]; - cur_ptn.append(AB_SLOT_A_SUFFIX); - ptn_vec.push_back(cur_ptn); - - } - //The partition map gives us info in the following format: - // [path_to_block_device_1]--> - // [path_to_block_device_2]--> - // ... - // ... - // eg: - // [/dev/block/sdb]---> - if (gpt_utils_get_partition_map(ptn_vec, ptn_map)) { - ALOGE("%s: Failed to get partition map", - __func__); - goto error; - } - for (map_iter = ptn_map.begin(); map_iter != ptn_map.end(); map_iter++){ - if (map_iter->second.size() < 1) - continue; - if (boot_ctl_set_active_slot_for_partitions(map_iter->second, - slot)) { - ALOGE("%s: Failed to set active slot", __func__); - goto error; - } - } - if (is_ufs) { - if (!strncmp(slot_suffix_arr[slot], AB_SLOT_A_SUFFIX, - strlen(AB_SLOT_A_SUFFIX))){ - //Set xbl_a as the boot lun - rc = gpt_utils_set_xbl_boot_partition(NORMAL_BOOT); - } else if (!strncmp(slot_suffix_arr[slot], AB_SLOT_B_SUFFIX, - strlen(AB_SLOT_B_SUFFIX))){ - //Set xbl_b as the boot lun - rc = gpt_utils_set_xbl_boot_partition(BACKUP_BOOT); - } else { - //Something has gone terribly terribly wrong - ALOGE("%s: Unknown slot suffix!", __func__); - goto error; - } - if (rc) { - ALOGE("%s: Failed to switch xbl boot partition", - __func__); - goto error; - } - } - return 0; -error: - return -1; -} - -int set_slot_as_unbootable(struct boot_control_module *module, unsigned slot) -{ - if (boot_control_check_slot_sanity(module, slot) != 0) { - ALOGE("%s: Argument check failed", __func__); - goto error; - } - if (update_slot_attribute(slot_suffix_arr[slot], - ATTR_UNBOOTABLE)) { - goto error; - } - return 0; -error: - ALOGE("%s: Failed to mark slot unbootable", __func__); - return -1; -} - -int is_slot_bootable(struct boot_control_module *module, unsigned slot) -{ - int attr = 0; - char bootPartition[MAX_GPT_NAME_SIZE + 1] = {0}; - - if (boot_control_check_slot_sanity(module, slot) != 0) { - ALOGE("%s: Argument check failed", __func__); - goto error; - } - snprintf(bootPartition, - sizeof(bootPartition) - 1, "boot%s", - slot_suffix_arr[slot]); - attr = get_partition_attribute(bootPartition, ATTR_UNBOOTABLE); - if (attr >= 0) - return !attr; -error: - return -1; -} - -int is_slot_marked_successful(struct boot_control_module *module, unsigned slot) -{ - int attr = 0; - char bootPartition[MAX_GPT_NAME_SIZE + 1] = {0}; - - if (boot_control_check_slot_sanity(module, slot) != 0) { - ALOGE("%s: Argument check failed", __func__); - goto error; - } - snprintf(bootPartition, - sizeof(bootPartition) - 1, - "boot%s", slot_suffix_arr[slot]); - attr = get_partition_attribute(bootPartition, ATTR_BOOT_SUCCESSFUL); - if (attr >= 0) - return attr; -error: - return -1; -} - -static hw_module_methods_t boot_control_module_methods = { - .open = NULL, -}; - -boot_control_module_t HAL_MODULE_INFO_SYM = { - .common = { - .tag = HARDWARE_MODULE_TAG, - .module_api_version = 1, - .hal_api_version = 0, - .id = BOOT_CONTROL_HARDWARE_MODULE_ID, - .name = "Boot control HAL", - .author = "Code Aurora Forum", - .methods = &boot_control_module_methods, - }, - .init = boot_control_init, - .getNumberSlots = get_number_slots, - .getCurrentSlot = get_current_slot, - .markBootSuccessful = mark_boot_successful, - .setActiveBootSlot = set_active_boot_slot, - .setSlotAsUnbootable = set_slot_as_unbootable, - .isSlotBootable = is_slot_bootable, - .getSuffix = get_suffix, - .isSlotMarkedSuccessful = is_slot_marked_successful, -}; -#ifdef __cplusplus -} -#endif diff --git a/gpt-utils/Android.bp b/gpt-utils/Android.bp new file mode 100644 index 0000000..d483935 --- /dev/null +++ b/gpt-utils/Android.bp @@ -0,0 +1,31 @@ +// 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. +// + + +cc_library { + name: "libgptutils.fp3", + vendor: true, + recovery_available: true, + shared_libs: [ + "libcutils", + "liblog", + "libz", + ], + cflags: [ + "-Wall", + "-Werror", + ], + srcs: [ + "gpt-utils.cpp", + ], + owner: "qti", + export_include_dirs: ["."], +} diff --git a/recovery/gpt-utils/gpt-utils.cpp b/gpt-utils/gpt-utils.cpp similarity index 97% rename from recovery/gpt-utils/gpt-utils.cpp rename to gpt-utils/gpt-utils.cpp index f90fc48..42ec621 100644 --- a/recovery/gpt-utils/gpt-utils.cpp +++ b/gpt-utils/gpt-utils.cpp @@ -32,7 +32,6 @@ /****************************************************************************** * INCLUDE SECTION ******************************************************************************/ -#include #include #include #include @@ -44,8 +43,8 @@ #include #include #include +#include #include -#include #include #include #include @@ -146,7 +145,7 @@ static int blk_rw(int fd, int rw, int64_t offset, uint8_t *buf, unsigned len) int r; if (lseek64(fd, offset, SEEK_SET) < 0) { - fprintf(stderr, "block dev lseek64 %lld failed: %s\n", offset, + fprintf(stderr, "block dev lseek64 %" PRIi64 " failed: %s\n", offset, strerror(errno)); return -1; } @@ -746,7 +745,6 @@ int prepare_partitions(enum boot_update_stage stage, const char *dev_path) enum gpt_state gpt_prim, gpt_second; enum boot_update_stage internal_stage; struct stat xbl_partition_stat; - struct stat ufs_dir_stat; if (!dev_path) { fprintf(stderr, "%s: Invalid dev_path\n", @@ -969,7 +967,6 @@ int add_lun_to_update_list(char *lun_path, struct update_data *dat) int prepare_boot_update(enum boot_update_stage stage) { - int r, fd; int is_ufs = gpt_utils_is_ufs_device(); struct stat ufs_dir_stat; struct update_data data; @@ -1158,6 +1155,7 @@ static int gpt_set_header(uint8_t *gpt_header, int fd, goto error; } block_size = gpt_get_block_size(fd); + ALOGI("%s: Block size is : %d", __func__, block_size); if (block_size == 0) { ALOGE("%s: Failed to get block size", __func__); goto error; @@ -1170,6 +1168,8 @@ static int gpt_set_header(uint8_t *gpt_header, int fd, ALOGE("%s: Failed to get gpt header offset",__func__); goto error; } + ALOGI("%s: Writing back header to offset %" PRIi64, __func__, + gpt_header_offset); if (blk_rw(fd, 1, gpt_header_offset, gpt_header, block_size)) { ALOGE("%s: Failed to write back GPT header", __func__); goto error; @@ -1314,10 +1314,15 @@ static int gpt_set_pentry_arr(uint8_t *hdr, int fd, uint8_t* arr) __func__); goto error; } + ALOGI("%s : Block size is %d", __func__, block_size); pentries_start = GET_8_BYTES(hdr + PENTRIES_OFFSET) * block_size; pentry_size = GET_4_BYTES(hdr + PENTRY_SIZE_OFFSET); pentries_arr_size = GET_4_BYTES(hdr + PARTITION_COUNT_OFFSET) * pentry_size; + ALOGI("%s: Writing partition entry array of size %d to offset %" PRIu64, + __func__, + pentries_arr_size, + pentries_start); rc = blk_rw(fd, 1, pentries_start, arr, @@ -1385,7 +1390,7 @@ int gpt_disk_get_disk_info(const char *dev, struct gpt_disk *dsk) } gpt_header_size = GET_4_BYTES(disk->hdr + HEADER_SIZE_OFFSET); disk->hdr_crc = crc32(0, disk->hdr, gpt_header_size); - disk->hdr_bak = gpt_get_header(dev, PRIMARY_GPT); + disk->hdr_bak = gpt_get_header(dev, SECONDARY_GPT); if (!disk->hdr_bak) { ALOGE("%s: Failed to get backup header", __func__); goto error; @@ -1512,22 +1517,36 @@ int gpt_disk_commit(struct gpt_disk *disk) strerror(errno)); goto error; } + ALOGI("%s: Writing back primary GPT header", __func__); //Write the primary header if(gpt_set_header(disk->hdr, fd, PRIMARY_GPT) != 0) { ALOGE("%s: Failed to update primary GPT header", __func__); goto error; } + ALOGI("%s: Writing back primary partition array", __func__); //Write back the primary partition array if (gpt_set_pentry_arr(disk->hdr, fd, disk->pentry_arr)) { ALOGE("%s: Failed to write primary GPT partition arr", __func__); goto error; } + //Write back the secondary header + if(gpt_set_header(disk->hdr_bak, fd, SECONDARY_GPT) != 0) { + ALOGE("%s: Failed to update secondary GPT header", + __func__); + goto error; + } + //Write back the secondary partition array + if (gpt_set_pentry_arr(disk->hdr_bak, fd, disk->pentry_arr_bak)) { + ALOGE("%s: Failed to write secondary GPT partition arr", + __func__); + goto error; + } close(fd); return 0; error: if (fd >= 0) close(fd); return -1; -} +} \ No newline at end of file diff --git a/recovery/gpt-utils/gpt-utils.h b/gpt-utils/gpt-utils.h similarity index 100% rename from recovery/gpt-utils/gpt-utils.h rename to gpt-utils/gpt-utils.h diff --git a/recovery/gpt-utils/scsi/ufs/ioctl.h b/gpt-utils/scsi/ufs/ioctl.h similarity index 100% rename from recovery/gpt-utils/scsi/ufs/ioctl.h rename to gpt-utils/scsi/ufs/ioctl.h diff --git a/recovery/gpt-utils/scsi/ufs/ufs.h b/gpt-utils/scsi/ufs/ufs.h similarity index 100% rename from recovery/gpt-utils/scsi/ufs/ufs.h rename to gpt-utils/scsi/ufs/ufs.h diff --git a/recovery/Android.mk b/recovery/Android.mk deleted file mode 100644 index 6571161..0000000 --- a/recovery/Android.mk +++ /dev/null @@ -1 +0,0 @@ -include $(all-subdir-makefiles) diff --git a/recovery/gpt-utils/Android.mk b/recovery/gpt-utils/Android.mk deleted file mode 100644 index 6dd1a44..0000000 --- a/recovery/gpt-utils/Android.mk +++ /dev/null @@ -1,46 +0,0 @@ -# -# Copyright 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_SRC_FILES := gpt-utils.cpp -ifeq ($(TARGET_COMPILE_WITH_MSM_KERNEL),true) -LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include -LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr -endif -LOCAL_SHARED_LIBRARIES := liblog libz -LOCAL_MODULE := libgptutils -LOCAL_MODULE_OWNER := qti -include $(BUILD_STATIC_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_SRC_FILES := gpt-utils.cpp -ifeq ($(TARGET_COMPILE_WITH_MSM_KERNEL),true) -LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include -LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr -endif -LOCAL_SHARED_LIBRARIES += liblog libcutils libz -LOCAL_EXPORT_HEADER_LIBRARY_HEADERS := libgptutils_headers -LOCAL_MODULE := libgptutils -LOCAL_MODULE_OWNER := qti -LOCAL_PROPRIETARY_MODULE := true -include $(BUILD_SHARED_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := libgptutils_headers -LOCAL_EXPORT_C_INCLUDE_DIRS:=$(LOCAL_PATH) -include $(BUILD_HEADER_LIBRARY) diff --git a/recovery/root/init.recovery.qcom.rc b/recovery/root/init.recovery.qcom.rc index 7729541..31e8dba 100644 --- a/recovery/root/init.recovery.qcom.rc +++ b/recovery/root/init.recovery.qcom.rc @@ -39,3 +39,4 @@ on property:ro.boot.usbcontroller=* on fs wait /dev/block/platform/soc/${ro.boot.bootdevice} symlink /dev/block/platform/soc/${ro.boot.bootdevice} /dev/block/bootdevice + start boot-hal-1-0 diff --git a/twrp_FP3.mk b/twrp_FP3.mk index 8162d5c..c92a0e3 100644 --- a/twrp_FP3.mk +++ b/twrp_FP3.mk @@ -62,6 +62,7 @@ PRODUCT_PACKAGES_DEBUG += \ # Boot control HAL PRODUCT_PACKAGES += \ + android.hardware.boot@1.0-impl.recovery \ bootctrl.msm8953 \ bootctrl.msm8953.recovery @@ -98,6 +99,8 @@ PRODUCT_EXTRA_RECOVERY_KEYS := device/fairphone/FP3/releasekey PRODUCT_USE_DYNAMIC_PARTITIONS := true PRODUCT_RETROFIT_DYNAMIC_PARTITIONS := true +PRODUCT_SOONG_NAMESPACES += $(LOCAL_PATH) + # Device identifier. This must come after all inclusions PRODUCT_DEVICE := FP3 PRODUCT_NAME := twrp_FP3