From 0071ea498f79f9cc8ff5b4fecabc84564e370af6 Mon Sep 17 00:00:00 2001 From: Laukik Hase Date: Fri, 29 Jul 2022 16:07:04 +0530 Subject: [PATCH] esp_app_format: Fixed build errors and resolved dependencies --- components/bootloader_support/CMakeLists.txt | 13 ++++++++-- .../include/bootloader_common.h | 15 ----------- .../include/esp_app_format.h | 22 ---------------- .../src/bootloader_common_loader.c | 24 ----------------- .../src/bootloader_utility.c | 26 +++++++++++++++++++ components/esp_https_ota/CMakeLists.txt | 2 +- .../esp_https_ota/include/esp_https_ota.h | 1 + components/esp_system/CMakeLists.txt | 2 +- components/esp_system/panic.c | 12 ++++----- components/esp_system/startup.c | 20 +++++++------- components/espcoredump/CMakeLists.txt | 6 ++++- components/espcoredump/src/core_dump_elf.c | 7 +++-- .../main/native_ota_example.c | 1 + .../system/g1_components/CMakeLists.txt | 6 +++-- 14 files changed, 71 insertions(+), 86 deletions(-) diff --git a/components/bootloader_support/CMakeLists.txt b/components/bootloader_support/CMakeLists.txt index 42b8f85f49..cd2e1eac74 100644 --- a/components/bootloader_support/CMakeLists.txt +++ b/components/bootloader_support/CMakeLists.txt @@ -19,7 +19,7 @@ set(srcs if(BOOTLOADER_BUILD) set(include_dirs "include" "bootloader_flash/include" "private_include") - set(priv_requires micro-ecc spi_flash efuse) + set(priv_requires micro-ecc spi_flash efuse esp_app_format) list(APPEND srcs "src/bootloader_init.c" "src/bootloader_clock_loader.c" @@ -37,7 +37,7 @@ else() set(include_dirs "include" "bootloader_flash/include") set(priv_include_dirs "private_include") # heap is required for `heap_memory_layout.h` header - set(priv_requires spi_flash mbedtls efuse app_update heap) + set(priv_requires spi_flash mbedtls efuse heap esp_app_format) endif() if(BOOTLOADER_BUILD) @@ -86,6 +86,15 @@ idf_component_register(SRCS "${srcs}" REQUIRES "${requires}" PRIV_REQUIRES "${priv_requires}") +if(NOT BOOTLOADER_BUILD) + if(CONFIG_SECURE_SIGNED_ON_UPDATE) + if(CONFIG_SECURE_SIGNED_APPS_ECDSA_SCHEME OR CONFIG_SECURE_SIGNED_APPS_RSA_SCHEME OR + CONFIG_SECURE_SIGNED_APPS_ECDSA_V2_SCHEME) + target_link_libraries(${COMPONENT_LIB} PRIVATE idf::app_update) + endif() + endif() +endif() + if(CONFIG_SECURE_SIGNED_APPS AND (CONFIG_SECURE_BOOT_V1_ENABLED OR CONFIG_SECURE_SIGNED_APPS_ECDSA_SCHEME)) if(BOOTLOADER_BUILD) # Whether CONFIG_SECURE_BOOT_BUILD_SIGNED_BINARIES or not, we need verification key to embed diff --git a/components/bootloader_support/include/bootloader_common.h b/components/bootloader_support/include/bootloader_common.h index 3237de61c0..6145a72ef8 100644 --- a/components/bootloader_support/include/bootloader_common.h +++ b/components/bootloader_support/include/bootloader_common.h @@ -7,7 +7,6 @@ #pragma once #include "esp_flash_partitions.h" #include "esp_image_format.h" -#include "esp_app_format.h" #ifdef __cplusplus extern "C" { @@ -151,20 +150,6 @@ int bootloader_common_get_active_otadata(esp_ota_select_entry_t *two_otadata); */ int bootloader_common_select_otadata(const esp_ota_select_entry_t *two_otadata, bool *valid_two_otadata, bool max); -/** - * @brief Returns esp_app_desc structure for app partition. This structure includes app version. - * - * Returns a description for the requested app partition. - * @param[in] partition App partition description. - * @param[out] app_desc Structure of info about app. - * @return - * - ESP_OK: Successful. - * - ESP_ERR_INVALID_ARG: The arguments passed are not valid. - * - ESP_ERR_NOT_FOUND: app_desc structure is not found. Magic word is incorrect. - * - ESP_FAIL: mapping is fail. - */ -esp_err_t bootloader_common_get_partition_description(const esp_partition_pos_t *partition, esp_app_desc_t *app_desc); - /** * @brief Get chip package * diff --git a/components/bootloader_support/include/esp_app_format.h b/components/bootloader_support/include/esp_app_format.h index a6c4d9b283..5fa0975ee1 100644 --- a/components/bootloader_support/include/esp_app_format.h +++ b/components/bootloader_support/include/esp_app_format.h @@ -106,25 +106,3 @@ typedef struct { } esp_image_segment_header_t; #define ESP_IMAGE_MAX_SEGMENTS 16 /*!< Max count of segments in the image. */ - -#define ESP_APP_DESC_MAGIC_WORD 0xABCD5432 /*!< The magic word for the esp_app_desc structure that is in DROM. */ - -/** - * @brief Description about application. - */ -typedef struct { - uint32_t magic_word; /*!< Magic word ESP_APP_DESC_MAGIC_WORD */ - uint32_t secure_version; /*!< Secure version */ - uint32_t reserv1[2]; /*!< reserv1 */ - char version[32]; /*!< Application version */ - char project_name[32]; /*!< Project name */ - char time[16]; /*!< Compile time */ - char date[16]; /*!< Compile date*/ - char idf_ver[32]; /*!< Version IDF */ - uint8_t app_elf_sha256[32]; /*!< sha256 of elf file */ - uint32_t reserv2[20]; /*!< reserv2 */ -} esp_app_desc_t; - -/** @cond */ -_Static_assert(sizeof(esp_app_desc_t) == 256, "esp_app_desc_t should be 256 bytes"); -/** @endcond */ diff --git a/components/bootloader_support/src/bootloader_common_loader.c b/components/bootloader_support/src/bootloader_common_loader.c index 3d9f5c857d..7bc3571127 100644 --- a/components/bootloader_support/src/bootloader_common_loader.c +++ b/components/bootloader_support/src/bootloader_common_loader.c @@ -112,30 +112,6 @@ int bootloader_common_select_otadata(const esp_ota_select_entry_t *two_otadata, return active_otadata; } -esp_err_t bootloader_common_get_partition_description(const esp_partition_pos_t *partition, esp_app_desc_t *app_desc) -{ - if (partition == NULL || app_desc == NULL || partition->offset == 0) { - return ESP_ERR_INVALID_ARG; - } - - const uint32_t app_desc_offset = sizeof(esp_image_header_t) + sizeof(esp_image_segment_header_t); - const uint32_t mmap_size = app_desc_offset + sizeof(esp_app_desc_t); - const uint8_t *image = bootloader_mmap(partition->offset, mmap_size); - if (image == NULL) { - ESP_LOGE(TAG, "bootloader_mmap(0x%x, 0x%x) failed", partition->offset, mmap_size); - return ESP_FAIL; - } - - memcpy(app_desc, image + app_desc_offset, sizeof(esp_app_desc_t)); - bootloader_munmap(image); - - if (app_desc->magic_word != ESP_APP_DESC_MAGIC_WORD) { - return ESP_ERR_NOT_FOUND; - } - - return ESP_OK; -} - #if defined( CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP ) || defined( CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC ) #define RTC_RETAIN_MEM_ADDR (SOC_RTC_DRAM_HIGH - sizeof(rtc_retain_mem_t)) diff --git a/components/bootloader_support/src/bootloader_utility.c b/components/bootloader_support/src/bootloader_utility.c index 5ef053ce87..b3c4ed1bf0 100644 --- a/components/bootloader_support/src/bootloader_utility.c +++ b/components/bootloader_support/src/bootloader_utility.c @@ -60,6 +60,7 @@ #include "esp_cpu.h" #include "esp_image_format.h" +#include "esp_app_desc.h" #include "esp_secure_boot.h" #include "esp_flash_encrypt.h" #include "esp_flash_partitions.h" @@ -119,6 +120,31 @@ static esp_err_t read_otadata(const esp_partition_pos_t *ota_info, esp_ota_selec return ESP_OK; } +esp_err_t bootloader_common_get_partition_description(const esp_partition_pos_t *partition, esp_app_desc_t *app_desc) +{ + if (partition == NULL || app_desc == NULL || partition->offset == 0) { + return ESP_ERR_INVALID_ARG; + } + + const uint32_t app_desc_offset = sizeof(esp_image_header_t) + sizeof(esp_image_segment_header_t); + const uint32_t mmap_size = app_desc_offset + sizeof(esp_app_desc_t); + const uint8_t *image = bootloader_mmap(partition->offset, mmap_size); + if (image == NULL) { + ESP_LOGE(TAG, "bootloader_mmap(0x%x, 0x%x) failed", partition->offset, mmap_size); + return ESP_FAIL; + } + + memcpy(app_desc, image + app_desc_offset, sizeof(esp_app_desc_t)); + bootloader_munmap(image); + + if (app_desc->magic_word != ESP_APP_DESC_MAGIC_WORD) { + return ESP_ERR_NOT_FOUND; + } + + return ESP_OK; +} + + bool bootloader_utility_load_partition_table(bootloader_state_t *bs) { const esp_partition_info_t *partitions; diff --git a/components/esp_https_ota/CMakeLists.txt b/components/esp_https_ota/CMakeLists.txt index cee9eb7620..ef037f8b0f 100644 --- a/components/esp_https_ota/CMakeLists.txt +++ b/components/esp_https_ota/CMakeLists.txt @@ -1,6 +1,6 @@ idf_component_register(SRCS "src/esp_https_ota.c" INCLUDE_DIRS "include" - REQUIRES esp_http_client bootloader_support + REQUIRES esp_http_client bootloader_support esp_app_format PRIV_REQUIRES log app_update) target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/components/esp_https_ota/include/esp_https_ota.h b/components/esp_https_ota/include/esp_https_ota.h index 9dee205c5b..ba13ad619e 100644 --- a/components/esp_https_ota/include/esp_https_ota.h +++ b/components/esp_https_ota/include/esp_https_ota.h @@ -8,6 +8,7 @@ #include #include +#include "esp_app_desc.h" #include #ifdef __cplusplus diff --git a/components/esp_system/CMakeLists.txt b/components/esp_system/CMakeLists.txt index 620396fcfd..5e7e8e3c2f 100644 --- a/components/esp_system/CMakeLists.txt +++ b/components/esp_system/CMakeLists.txt @@ -85,7 +85,7 @@ endif() # need to introduce panic "event" concept to remove this dependency (IDF-2194) idf_component_optional_requires(PRIVATE esp_gdbstub) -idf_component_optional_requires(PRIVATE app_update) +idf_component_optional_requires(PRIVATE esp_app_format) if(CONFIG_PM_ENABLE) idf_component_optional_requires(PRIVATE pm) diff --git a/components/esp_system/panic.c b/components/esp_system/panic.c index 3903796a79..d060f48bfb 100644 --- a/components/esp_system/panic.c +++ b/components/esp_system/panic.c @@ -24,9 +24,9 @@ #include "sdkconfig.h" -#if __has_include("esp_ota_ops.h") -#include "esp_ota_ops.h" -#define HAS_ESP_OTA 1 +#if __has_include("esp_app_desc.h") +#define WITH_ELF_SHA256 +#include "esp_app_desc.h" #endif #if CONFIG_ESP_COREDUMP_ENABLE @@ -312,13 +312,13 @@ void esp_panic_handler(panic_info_t *info) PANIC_INFO_DUMP(info, state); panic_print_str("\r\n"); -#if HAS_ESP_OTA +#ifdef WITH_ELF_SHA256 panic_print_str("\r\nELF file SHA256: "); char sha256_buf[65]; - esp_ota_get_app_elf_sha256(sha256_buf, sizeof(sha256_buf)); + esp_app_get_elf_sha256(sha256_buf, sizeof(sha256_buf)); panic_print_str(sha256_buf); panic_print_str("\r\n"); -#endif //HAS_ESP_OTA +#endif panic_print_str("\r\n"); diff --git a/components/esp_system/startup.c b/components/esp_system/startup.c index 6adda6dbd3..bf2254d7fc 100644 --- a/components/esp_system/startup.c +++ b/components/esp_system/startup.c @@ -20,8 +20,6 @@ #include "hal/uart_types.h" #include "hal/uart_ll.h" -#include "esp_system.h" -#include "esp_log.h" #include "esp_heap_caps_init.h" #include "spi_flash_mmap.h" #include "esp_flash_internal.h" @@ -33,10 +31,7 @@ #include "esp_xt_wdt.h" #include "esp_cpu.h" -#if __has_include("esp_ota_ops.h") -#include "esp_ota_ops.h" -#define HAS_ESP_OTA 1 -#endif +#include "esp_partition.h" /***********************************************/ // Headers for other components init functions @@ -44,6 +39,11 @@ #include "esp_coexist_internal.h" #endif +#if __has_include("esp_app_desc.h") +#define WITH_APP_IMAGE_INFO +#include "esp_app_desc.h" +#endif + #if CONFIG_ESP_COREDUMP_ENABLE #include "esp_core_dump.h" #endif @@ -408,10 +408,10 @@ static void start_cpu0_default(void) int cpu_freq = esp_clk_cpu_freq(); ESP_EARLY_LOGI(TAG, "cpu freq: %d Hz", cpu_freq); -#if HAS_ESP_OTA // [refactor-todo] find a better way to handle this. +#ifdef WITH_APP_IMAGE_INFO // Display information about the current running image. if (LOG_LOCAL_LEVEL >= ESP_LOG_INFO) { - const esp_app_desc_t *app_desc = esp_ota_get_app_description(); + const esp_app_desc_t *app_desc = esp_app_get_description(); ESP_EARLY_LOGI(TAG, "Application information:"); #ifndef CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR ESP_EARLY_LOGI(TAG, "Project name: %s", app_desc->project_name); @@ -426,11 +426,11 @@ static void start_cpu0_default(void) ESP_EARLY_LOGI(TAG, "Compile time: %s %s", app_desc->date, app_desc->time); #endif char buf[17]; - esp_ota_get_app_elf_sha256(buf, sizeof(buf)); + esp_app_get_elf_sha256(buf, sizeof(buf)); ESP_EARLY_LOGI(TAG, "ELF file SHA256: %s...", buf); ESP_EARLY_LOGI(TAG, "ESP-IDF: %s", app_desc->idf_ver); } -#endif //HAS_ESP_OTA +#endif // Initialize core components and services. do_core_init(); diff --git a/components/espcoredump/CMakeLists.txt b/components/espcoredump/CMakeLists.txt index 7f936a1cb4..6be5b6a29a 100644 --- a/components/espcoredump/CMakeLists.txt +++ b/components/espcoredump/CMakeLists.txt @@ -24,4 +24,8 @@ idf_component_register(SRCS ${srcs} INCLUDE_DIRS ${includes} PRIV_INCLUDE_DIRS ${priv_includes} LDFRAGMENTS linker.lf - PRIV_REQUIRES spi_flash app_update mbedtls esp_rom soc driver) + PRIV_REQUIRES spi_flash bootloader_support mbedtls esp_rom soc esp_system driver) + +if(CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF) + target_link_libraries(${COMPONENT_LIB} PRIVATE idf::esp_app_format) +endif() diff --git a/components/espcoredump/src/core_dump_elf.c b/components/espcoredump/src/core_dump_elf.c index 2cd0b53f30..11bde327c7 100644 --- a/components/espcoredump/src/core_dump_elf.c +++ b/components/espcoredump/src/core_dump_elf.c @@ -6,7 +6,6 @@ #include #include "esp_attr.h" #include "esp_partition.h" -#include "esp_ota_ops.h" #include "spi_flash_mmap.h" #include "esp_flash_encrypt.h" #include "sdkconfig.h" @@ -16,6 +15,10 @@ #include "esp_core_dump_port_impl.h" #include "esp_core_dump_common.h" +#ifdef CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF +#include "esp_app_desc.h" +#endif + #define ELF_CLASS ELFCLASS32 #include "elf.h" // for ELF file types @@ -496,7 +499,7 @@ static int elf_write_core_dump_info(core_dump_elf_t *self) ESP_COREDUMP_LOG_PROCESS("================ Processing coredump info ================"); int data_len = (int)sizeof(self->elf_version_info.app_elf_sha256); - data_len = esp_ota_get_app_elf_sha256((char*)self->elf_version_info.app_elf_sha256, (size_t)data_len); + data_len = esp_app_get_elf_sha256((char*)self->elf_version_info.app_elf_sha256, (size_t)data_len); ESP_COREDUMP_LOG_PROCESS("Application SHA256='%s', length=%d.", self->elf_version_info.app_elf_sha256, data_len); self->elf_version_info.version = esp_core_dump_elf_version(); diff --git a/examples/system/ota/native_ota_example/main/native_ota_example.c b/examples/system/ota/native_ota_example/main/native_ota_example.c index ebebbabd99..287405436f 100644 --- a/examples/system/ota/native_ota_example/main/native_ota_example.c +++ b/examples/system/ota/native_ota_example/main/native_ota_example.c @@ -13,6 +13,7 @@ #include "esp_event.h" #include "esp_log.h" #include "esp_ota_ops.h" +#include "esp_app_format.h" #include "esp_http_client.h" #include "esp_flash_partitions.h" #include "esp_partition.h" diff --git a/tools/test_apps/system/g1_components/CMakeLists.txt b/tools/test_apps/system/g1_components/CMakeLists.txt index 7c69876019..0380cdd395 100644 --- a/tools/test_apps/system/g1_components/CMakeLists.txt +++ b/tools/test_apps/system/g1_components/CMakeLists.txt @@ -21,8 +21,8 @@ set(extra_allowed_components # These components are currently included into "G1" build, but shouldn't. # After removing the extra dependencies, remove the components from this list as well. set(extra_components_which_shouldnt_be_included - # app_update gets added because of bootloader_support, spi_flash, espcoredump. - # bootloader_support, spi_flash, espcoredump should be removed from dependencies; + # app_update gets added because of spi_flash. + # spi_flash should be removed from dependencies; app_update # of G1 components, bootloader is only included from spi_flash # [refactor-todo]: see if this dependency from spi_flash can be made weak @@ -36,6 +36,8 @@ set(extra_components_which_shouldnt_be_included # [refactor-todo]: driver is a dependency of esp_pm, esp_timer, spi_flash, vfs, esp_wifi, ${IDF_TARGET} # all of these should be removed from G1 except for spi_flash. driver + # esp_app_format is dependency of bootloader_support, app_update + esp_app_format # [refactor-todo]: efuse is a dependency of esp_hw_support, esp_system. # Figure out if these components can exist without a dependency on efuse. # If not, see if esp_hw_support can provide minimal efuse component replacement in G1 build.