diff --git a/components/esp_psram/system_layer/esp_psram.c b/components/esp_psram/system_layer/esp_psram.c index d80d8498fb..c0358902e5 100644 --- a/components/esp_psram/system_layer/esp_psram.c +++ b/components/esp_psram/system_layer/esp_psram.c @@ -427,6 +427,9 @@ esp_err_t esp_psram_extram_add_to_heap_allocator(void) ESP_EARLY_LOGI(TAG, "Adding pool of %dK of PSRAM memory to heap allocator", (s_psram_ctx.regions_to_heap[PSRAM_MEM_8BIT_ALIGNED].size + s_psram_ctx.regions_to_heap[PSRAM_MEM_32BIT_ALIGNED].size) / 1024); + // To allow using the page alignment gaps created while mapping the flash segments, + // the alignment gaps must be configured with correct memory protection configurations. +#if CONFIG_SPIRAM_PRE_CONFIGURE_MEMORY_PROTECTION // Here, SOC_MMU_DI_VADDR_SHARED is necessary because, for the targets that have separate data and instruction virtual address spaces, // the SPIRAM gap created due to the alignment needed while placing the instruction segment in the instruction virtual address space // cannot be added in heap because the region cannot be configured with write permissions. @@ -452,6 +455,8 @@ esp_err_t esp_psram_extram_add_to_heap_allocator(void) } } #endif /* CONFIG_SPIRAM_RODATA */ +#endif /* CONFIG_SPIRAM_PRE_CONFIGURE_MEMORY_PROTECTION */ + return ESP_OK; } diff --git a/components/esp_system/ld/esp32c5/sections.ld.in b/components/esp_system/ld/esp32c5/sections.ld.in index cdf188cb92..9275091051 100644 --- a/components/esp_system/ld/esp32c5/sections.ld.in +++ b/components/esp_system/ld/esp32c5/sections.ld.in @@ -279,7 +279,9 @@ SECTIONS . += _esp_flash_mmap_prefetch_pad_size; #if CONFIG_SPIRAM_FETCH_INSTRUCTIONS && CONFIG_SPIRAM_PRE_CONFIGURE_MEMORY_PROTECTION - /* Align the end of flash text region as per PMP granularity as PSRAM memory protection is enabled */ + /* Align the end of flash text region as per PMP granularity to allow using the + * page alignment gap created while mapping the flash region into the PSRAM memory. + */ . = ALIGN(_esp_pmp_align_size); #endif // CONFIG_SPIRAM_FETCH_INSTRUCTIONS && CONFIG_SPIRAM_PRE_CONFIGURE_MEMORY_PROTECTION @@ -425,7 +427,9 @@ SECTIONS . = ALIGN(ALIGNOF(.flash.tbss)); #if CONFIG_SPIRAM_RODATA && CONFIG_SPIRAM_PRE_CONFIGURE_MEMORY_PROTECTION - /* Align the end of flash rodata region as per PMP granularity as PSRAM memory protection is enabled */ + /* Align the end of flash rodata region as per PMP granularity to allow using the + * page alignment gap created while mapping the flash region into the PSRAM memory. + */ . = ALIGN(_esp_pmp_align_size); #endif // CONFIG_SPIRAM_RODATA && CONFIG_SPIRAM_PRE_CONFIGURE_MEMORY_PROTECTION diff --git a/components/esp_system/ld/esp32c61/sections.ld.in b/components/esp_system/ld/esp32c61/sections.ld.in index 0c7d1babf1..e6c48b5452 100644 --- a/components/esp_system/ld/esp32c61/sections.ld.in +++ b/components/esp_system/ld/esp32c61/sections.ld.in @@ -136,10 +136,12 @@ SECTIONS */ . += _esp_flash_mmap_prefetch_pad_size; -#if CONFIG_SPIRAM_FETCH_INSTRUCTIONS - /* Align the end of flash text region as per PMP granularity */ +#if CONFIG_SPIRAM_FETCH_INSTRUCTIONS && CONFIG_SPIRAM_PRE_CONFIGURE_MEMORY_PROTECTION + /* Align the end of flash text region as per PMP granularity to allow using the + * page alignment gap created while mapping the flash region into the PSRAM memory. + */ . = ALIGN(_esp_pmp_align_size); -#endif // CONFIG_SPIRAM_FETCH_INSTRUCTIONS +#endif // CONFIG_SPIRAM_FETCH_INSTRUCTIONS && CONFIG_SPIRAM_PRE_CONFIGURE_MEMORY_PROTECTION _text_end = ABSOLUTE(.); /** @@ -282,10 +284,12 @@ SECTIONS . = ALIGN(ALIGNOF(.flash.tbss)); -#if CONFIG_SPIRAM_RODATA - /* Align the end of flash rodata region as per PMP granularity */ +#if CONFIG_SPIRAM_RODATA && CONFIG_SPIRAM_PRE_CONFIGURE_MEMORY_PROTECTION + /* Align the end of flash rodata region as per PMP granularity to allow using the + * page alignment gap created while mapping the flash region into the PSRAM memory. + */ . = ALIGN(_esp_pmp_align_size); -#endif // CONFIG_SPIRAM_RODATA +#endif // CONFIG_SPIRAM_RODATA && CONFIG_SPIRAM_PRE_CONFIGURE_MEMORY_PROTECTION _thread_local_data_end = ABSOLUTE(.); } > default_rodata_seg diff --git a/components/esp_system/ld/esp32p4/sections.ld.in b/components/esp_system/ld/esp32p4/sections.ld.in index 02b961d97f..b062587f7c 100644 --- a/components/esp_system/ld/esp32p4/sections.ld.in +++ b/components/esp_system/ld/esp32p4/sections.ld.in @@ -293,10 +293,12 @@ SECTIONS */ . += _esp_flash_mmap_prefetch_pad_size; -#if CONFIG_SPIRAM_FETCH_INSTRUCTIONS - /* Align the end of flash text region as per PMP granularity */ +#if CONFIG_SPIRAM_FETCH_INSTRUCTIONS && CONFIG_SPIRAM_PRE_CONFIGURE_MEMORY_PROTECTION + /* Align the end of flash text region as per PMP granularity to allow using the + * page alignment gap created while mapping the flash region into the PSRAM memory. + */ . = ALIGN(_esp_pmp_align_size); -#endif // CONFIG_SPIRAM_FETCH_INSTRUCTIONS +#endif // CONFIG_SPIRAM_FETCH_INSTRUCTIONS && CONFIG_SPIRAM_PRE_CONFIGURE_MEMORY_PROTECTION _text_end = ABSOLUTE(.); /** @@ -446,10 +448,12 @@ SECTIONS . = ALIGN(ALIGNOF(.flash.tbss)); -#if CONFIG_SPIRAM_RODATA - /* Align the end of flash rodata region as per PMP granularity */ +#if CONFIG_SPIRAM_RODATA && CONFIG_SPIRAM_PRE_CONFIGURE_MEMORY_PROTECTION + /* Align the end of flash rodata region as per PMP granularity to allow using the + * page alignment gap created while mapping the flash region into the PSRAM memory. + */ . = ALIGN(_esp_pmp_align_size); -#endif // CONFIG_SPIRAM_RODATA +#endif // CONFIG_SPIRAM_RODATA && CONFIG_SPIRAM_PRE_CONFIGURE_MEMORY_PROTECTION _thread_local_data_end = ABSOLUTE(.); } > rodata_seg_low