1919#include <esp_image_format.h>
2020#include <esp_secure_boot.h>
2121#include <esp_log.h>
22+ #include <esp_spi_flash.h>
2223#include <bootloader_flash.h>
2324#include <bootloader_random.h>
2425#include <bootloader_sha.h>
@@ -33,6 +34,9 @@ static const char *TAG = "esp_image";
3334/* Headroom to ensure between stack SP (at time of checking) and data loaded from flash */
3435#define STACK_LOAD_HEADROOM 32768
3536
37+ /* Mmap source address mask */
38+ #define MMAP_ALIGNED_MASK 0x0000FFFF
39+
3640#ifdef BOOTLOADER_BUILD
3741/* 64 bits of random data to obfuscate loaded RAM with, until verification is complete
3842 (Means loaded code isn't executable until after the secure boot check.)
@@ -48,6 +52,9 @@ static bool should_map(uint32_t load_addr);
4852/* Load or verify a segment */
4953static esp_err_t process_segment (int index , uint32_t flash_addr , esp_image_segment_header_t * header , bool silent , bool do_load , bootloader_sha256_handle_t sha_handle , uint32_t * checksum );
5054
55+ /* split segment and verify if data_len is too long */
56+ static esp_err_t process_segment_data (intptr_t load_addr , uint32_t data_addr , uint32_t data_len , bool do_load , bootloader_sha256_handle_t sha_handle , uint32_t * checksum );
57+
5158/* Verify the main image header */
5259static esp_err_t verify_image_header (uint32_t src_addr , const esp_image_header_t * image , bool silent );
5360
@@ -291,7 +298,36 @@ static esp_err_t process_segment(int index, uint32_t flash_addr, esp_image_segme
291298 }
292299 }
293300 }
301+ #ifndef BOOTLOADER_BUILD
302+ uint32_t free_page_count = spi_flash_mmap_get_free_pages (SPI_FLASH_MMAP_DATA );
303+ ESP_LOGD (TAG , "free data page_count 0x%08x" ,free_page_count );
304+ uint32_t offset_page = 0 ;
305+ while (data_len >= free_page_count * SPI_FLASH_MMU_PAGE_SIZE ) {
306+ offset_page = ((data_addr & MMAP_ALIGNED_MASK ) != 0 )?1 :0 ;
307+ err = process_segment_data (load_addr , data_addr , (free_page_count - offset_page ) * SPI_FLASH_MMU_PAGE_SIZE , do_load , sha_handle , checksum );
308+ if (err != ESP_OK ) {
309+ return err ;
310+ }
311+ data_addr += (free_page_count - offset_page ) * SPI_FLASH_MMU_PAGE_SIZE ;
312+ data_len -= (free_page_count - offset_page ) * SPI_FLASH_MMU_PAGE_SIZE ;
313+ }
314+ #endif
315+ err = process_segment_data (load_addr , data_addr , data_len , do_load , sha_handle , checksum );
316+ if (err != ESP_OK ) {
317+ return err ;
318+ }
319+ return ESP_OK ;
320+
321+ err :
322+ if (err == ESP_OK ) {
323+ err = ESP_ERR_IMAGE_INVALID ;
324+ }
325+
326+ return err ;
327+ }
294328
329+ static esp_err_t process_segment_data (intptr_t load_addr , uint32_t data_addr , uint32_t data_len , bool do_load , bootloader_sha256_handle_t sha_handle , uint32_t * checksum )
330+ {
295331 const uint32_t * data = (const uint32_t * )bootloader_mmap (data_addr , data_len );
296332 if (!data ) {
297333 ESP_LOGE (TAG , "bootloader_mmap(0x%x, 0x%x) failed" ,
@@ -332,12 +368,6 @@ static esp_err_t process_segment(int index, uint32_t flash_addr, esp_image_segme
332368 bootloader_munmap (data );
333369
334370 return ESP_OK ;
335-
336- err :
337- if (err == ESP_OK ) {
338- err = ESP_ERR_IMAGE_INVALID ;
339- }
340- return err ;
341371}
342372
343373static esp_err_t verify_segment_header (int index , const esp_image_segment_header_t * segment , uint32_t segment_data_offs , bool silent )
0 commit comments