| 
									
										
										
										
											2021-05-10 03:48:25 +02:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2022-12-14 01:16:56 +08:00
										 |  |  |  * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD | 
					
						
							| 
									
										
										
										
											2021-05-10 03:48:25 +02:00
										 |  |  |  * | 
					
						
							|  |  |  |  * SPDX-License-Identifier: Apache-2.0 | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-10-05 20:29:07 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <assert.h>
 | 
					
						
							| 
									
										
										
										
											2019-01-09 20:06:01 +08:00
										 |  |  | #include <sys/param.h>
 | 
					
						
							| 
									
										
										
										
											2023-05-04 17:14:46 +08:00
										 |  |  | #include <string.h>
 | 
					
						
							| 
									
										
										
										
											2022-08-02 14:24:29 +05:30
										 |  |  | #include "esp_app_desc.h"
 | 
					
						
							| 
									
										
										
										
											2018-10-05 20:29:07 +08:00
										 |  |  | #include "sdkconfig.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-02 14:24:29 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-05 20:29:07 +08:00
										 |  |  | // Application version info
 | 
					
						
							| 
									
										
										
										
											2022-10-02 18:46:46 +02:00
										 |  |  | const __attribute__((weak)) __attribute__((section(".rodata_desc")))  esp_app_desc_t esp_app_desc = { | 
					
						
							| 
									
										
										
										
											2018-10-05 20:29:07 +08:00
										 |  |  |     .magic_word = ESP_APP_DESC_MAGIC_WORD, | 
					
						
							| 
									
										
										
										
											2018-12-13 15:45:27 +08:00
										 |  |  | #ifdef CONFIG_APP_EXCLUDE_PROJECT_VER_VAR
 | 
					
						
							|  |  |  |     .version = "", | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2018-10-05 20:29:07 +08:00
										 |  |  |     .version = PROJECT_VER, | 
					
						
							| 
									
										
										
										
											2018-12-13 15:45:27 +08:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR
 | 
					
						
							|  |  |  |     .project_name = "", | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2018-10-05 20:29:07 +08:00
										 |  |  |     .project_name = PROJECT_NAME, | 
					
						
							| 
									
										
										
										
											2018-12-13 15:45:27 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2018-10-05 20:29:07 +08:00
										 |  |  |     .idf_ver = IDF_VER, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-09 14:10:35 +02:00
										 |  |  | #ifdef CONFIG_BOOTLOADER_APP_SECURE_VERSION
 | 
					
						
							|  |  |  |     .secure_version = CONFIG_BOOTLOADER_APP_SECURE_VERSION, | 
					
						
							| 
									
										
										
										
											2018-10-05 20:29:07 +08:00
										 |  |  | #else
 | 
					
						
							|  |  |  |     .secure_version = 0, | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-14 01:16:56 +08:00
										 |  |  | #ifdef CONFIG_APP_COMPILE_TIME_DATE
 | 
					
						
							| 
									
										
										
										
											2018-10-05 20:29:07 +08:00
										 |  |  |     .time = __TIME__, | 
					
						
							|  |  |  |     .date = __DATE__, | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |     .time = "", | 
					
						
							|  |  |  |     .date = "", | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-13 15:45:27 +08:00
										 |  |  | #ifndef CONFIG_APP_EXCLUDE_PROJECT_VER_VAR
 | 
					
						
							| 
									
										
										
										
											2018-10-05 20:29:07 +08:00
										 |  |  | _Static_assert(sizeof(PROJECT_VER) <= sizeof(esp_app_desc.version), "PROJECT_VER is longer than version field in structure"); | 
					
						
							| 
									
										
										
										
											2018-12-13 15:45:27 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2018-10-05 20:29:07 +08:00
										 |  |  | _Static_assert(sizeof(IDF_VER) <= sizeof(esp_app_desc.idf_ver), "IDF_VER is longer than idf_ver field in structure"); | 
					
						
							| 
									
										
										
										
											2018-12-13 15:45:27 +08:00
										 |  |  | #ifndef CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR
 | 
					
						
							| 
									
										
										
										
											2018-10-05 20:29:07 +08:00
										 |  |  | _Static_assert(sizeof(PROJECT_NAME) <= sizeof(esp_app_desc.project_name), "PROJECT_NAME is longer than project_name field in structure"); | 
					
						
							| 
									
										
										
										
											2018-12-13 15:45:27 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2018-10-05 20:29:07 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-02 14:24:29 +05:30
										 |  |  | const esp_app_desc_t *esp_app_get_description(void) | 
					
						
							| 
									
										
										
										
											2018-10-05 20:29:07 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     return &esp_app_desc; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2019-01-09 20:06:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-04 17:14:46 +08:00
										 |  |  | char app_elf_sha256_str[CONFIG_APP_RETRIEVE_LEN_ELF_SHA + 1] = { 0 }; | 
					
						
							| 
									
										
										
										
											2020-02-07 18:57:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-04 17:14:46 +08:00
										 |  |  | /* The esp_app_desc.app_elf_sha256 should be possible to print in panic handler or core dump during cache is disabled.
 | 
					
						
							| 
									
										
										
										
											2020-02-07 18:57:55 +08:00
										 |  |  |  * But because the cache is disabled the reading esp_app_desc.app_elf_sha256 is not right and | 
					
						
							|  |  |  |  * can lead to a complete lock-up of the CPU. | 
					
						
							| 
									
										
										
										
											2023-05-04 17:14:46 +08:00
										 |  |  |  * For this reason we do a reading of esp_app_desc.app_elf_sha256 and convert to string while start up in esp_system_init_app_elf_sha256() | 
					
						
							|  |  |  |  * and keep it in the static app_elf_sha256_str variable. | 
					
						
							| 
									
										
										
										
											2020-02-07 18:57:55 +08:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2023-05-04 17:14:46 +08:00
										 |  |  | __attribute__((constructor)) void esp_app_format_init_elf_sha256(void) | 
					
						
							| 
									
										
										
										
											2019-01-09 20:06:01 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2023-05-04 17:14:46 +08:00
										 |  |  |     if (*((int *)&app_elf_sha256_str) != 0) { | 
					
						
							|  |  |  |         // app_elf_sha256_str is already set
 | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     // At -O2 optimization level, GCC optimizes out the copying of the first byte of the app_elf_sha256,
 | 
					
						
							|  |  |  |     // because it is zero at compile time, and only modified afterwards by esptool.
 | 
					
						
							|  |  |  |     // Casting to volatile disables the optimization.
 | 
					
						
							|  |  |  |     const volatile char* src = (const volatile char*)esp_app_desc.app_elf_sha256; | 
					
						
							|  |  |  |     for (size_t i = 0; i < sizeof(app_elf_sha256_str) / 2; ++i) { | 
					
						
							|  |  |  |         char c = src[i]; | 
					
						
							|  |  |  |         for (size_t s = 0; s < 2; ++s) { | 
					
						
							|  |  |  |             char val = (c >> 4) & 0xF; | 
					
						
							|  |  |  |             app_elf_sha256_str[2 * i + s] = (val < 10) ? ('0' + val) : ('a' + val - 10); | 
					
						
							|  |  |  |             c <<= 4; | 
					
						
							| 
									
										
										
										
											2020-02-07 18:57:55 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-05-04 17:14:46 +08:00
										 |  |  |     app_elf_sha256_str[sizeof(app_elf_sha256_str) - 1] = 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int esp_app_get_elf_sha256(char* dst, size_t size) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (dst == NULL || size < 2) { | 
					
						
							| 
									
										
										
										
											2020-02-07 18:57:55 +08:00
										 |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-05-04 17:14:46 +08:00
										 |  |  |     esp_app_format_init_elf_sha256(); | 
					
						
							|  |  |  |     size_t n = MIN(size, sizeof(app_elf_sha256_str)); | 
					
						
							|  |  |  |     memcpy(dst, app_elf_sha256_str, n); | 
					
						
							|  |  |  |     dst[n - 1] = 0; | 
					
						
							|  |  |  |     return n; | 
					
						
							| 
									
										
										
										
											2019-01-09 20:06:01 +08:00
										 |  |  | } |