mirror of
https://github.com/espressif/esp-idf.git
synced 2025-08-05 05:34:32 +02:00
Merge branch 'fix/malloc_cap_exec_on_esp32c6' into 'master'
heap: Fix allocation issue when trying to allocate in IRAM on esp32c6 Closes IDF-6306 See merge request espressif/esp-idf!22077
This commit is contained in:
@@ -20,6 +20,16 @@ extern "C" {
|
|||||||
|
|
||||||
/** The content of this file is to be kept in sync with the common section of esp_memory_utils.h **/
|
/** The content of this file is to be kept in sync with the common section of esp_memory_utils.h **/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if the IRAM and DRAM are separate or using the same memory space
|
||||||
|
*
|
||||||
|
* @return true if the DRAM and IRAM are sharing the same memory space, false otherwise
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline))
|
||||||
|
inline static bool esp_dram_match_iram(void) {
|
||||||
|
return (SOC_DRAM_LOW == SOC_IRAM_LOW && SOC_DRAM_HIGH == SOC_IRAM_HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Check if the pointer is in iram
|
* @brief Check if the pointer is in iram
|
||||||
*
|
*
|
||||||
|
@@ -20,6 +20,16 @@ extern "C" {
|
|||||||
|
|
||||||
/** Common functions, to be kept in sync with bootloader_memory_utils.h **/
|
/** Common functions, to be kept in sync with bootloader_memory_utils.h **/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if the IRAM and DRAM are separate or using the same memory space
|
||||||
|
*
|
||||||
|
* @return true if the DRAM and IRAM are sharing the same memory space, false otherwise
|
||||||
|
*/
|
||||||
|
__attribute__((always_inline))
|
||||||
|
inline static bool esp_dram_match_iram(void) {
|
||||||
|
return (SOC_DRAM_LOW == SOC_IRAM_LOW && SOC_DRAM_HIGH == SOC_IRAM_HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Check if the pointer is in iram
|
* @brief Check if the pointer is in iram
|
||||||
*
|
*
|
||||||
|
@@ -3,8 +3,3 @@
|
|||||||
components/heap/host_test/host_test_linux:
|
components/heap/host_test/host_test_linux:
|
||||||
enable:
|
enable:
|
||||||
- if: IDF_TARGET == "linux"
|
- if: IDF_TARGET == "linux"
|
||||||
components/heap/test_apps:
|
|
||||||
disable_test:
|
|
||||||
- if: IDF_TARGET == "esp32c6"
|
|
||||||
temporary: true
|
|
||||||
reason: target esp32c6 is not supported yet
|
|
||||||
|
@@ -131,7 +131,9 @@ IRAM_ATTR static void *heap_caps_malloc_base( size_t size, uint32_t caps)
|
|||||||
//doesn't cover, see if they're available in other prios.
|
//doesn't cover, see if they're available in other prios.
|
||||||
if ((get_all_caps(heap) & caps) == caps) {
|
if ((get_all_caps(heap) & caps) == caps) {
|
||||||
//This heap can satisfy all the requested capabilities. See if we can grab some memory using it.
|
//This heap can satisfy all the requested capabilities. See if we can grab some memory using it.
|
||||||
if ((caps & MALLOC_CAP_EXEC) && esp_ptr_in_diram_dram((void *)heap->start)) {
|
// If MALLOC_CAP_EXEC is requested but the DRAM and IRAM are on the same addresses (like on esp32c6)
|
||||||
|
// proceed as for a default allocation.
|
||||||
|
if ((caps & MALLOC_CAP_EXEC) && !esp_dram_match_iram() && esp_ptr_in_diram_dram((void *)heap->start)) {
|
||||||
//This is special, insofar that what we're going to get back is a DRAM address. If so,
|
//This is special, insofar that what we're going to get back is a DRAM address. If so,
|
||||||
//we need to 'invert' it (lowest address in DRAM == highest address in IRAM and vice-versa) and
|
//we need to 'invert' it (lowest address in DRAM == highest address in IRAM and vice-versa) and
|
||||||
//add a pointer to the DRAM equivalent before the address we're going to return.
|
//add a pointer to the DRAM equivalent before the address we're going to return.
|
||||||
|
@@ -278,3 +278,23 @@ TEST_CASE("RTC memory shoule be lowest priority and its free size should be big
|
|||||||
free(ptr);
|
free(ptr);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
TEST_CASE("test memory protection features", "[heap][mem_prot]")
|
||||||
|
{
|
||||||
|
// try to allocate memory in IRAM and check that if memory protection is active,
|
||||||
|
// no memory is being allocated
|
||||||
|
uint32_t *iram_ptr = heap_caps_malloc(4, MALLOC_CAP_EXEC);
|
||||||
|
|
||||||
|
#ifndef CONFIG_ESP_SYSTEM_MEMPROT_FEATURE
|
||||||
|
// System memory protection not active, check that iram_ptr is not null
|
||||||
|
// Check that iram_ptr is in IRAM
|
||||||
|
TEST_ASSERT_NOT_NULL(iram_ptr);
|
||||||
|
TEST_ASSERT(true == esp_ptr_in_iram(iram_ptr));
|
||||||
|
|
||||||
|
// free the memory
|
||||||
|
heap_caps_free(iram_ptr);
|
||||||
|
#else
|
||||||
|
// System memory protection is active, DIRAM seen as DRAM, iram_ptr should be null
|
||||||
|
TEST_ASSERT_NULL(iram_ptr);
|
||||||
|
#endif // CONFIG_ESP_SYSTEM_MEMPROT_FEATURE
|
||||||
|
}
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
|
# SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
|
||||||
# SPDX-License-Identifier: CC0-1.0
|
# SPDX-License-Identifier: CC0-1.0
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
@@ -92,3 +92,18 @@ def test_heap_trace_dump(dut: Dut) -> None:
|
|||||||
dut.expect_exact('Enter next test, or \'enter\' to see menu')
|
dut.expect_exact('Enter next test, or \'enter\' to see menu')
|
||||||
dut.write('[heap-trace]')
|
dut.write('[heap-trace]')
|
||||||
dut.expect_unity_test_output(timeout=100)
|
dut.expect_unity_test_output(timeout=100)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.generic
|
||||||
|
@pytest.mark.supported_targets
|
||||||
|
@pytest.mark.temp_skip_ci(targets=['esp32c3', 'esp32s3'], reason='test failed')
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
'config',
|
||||||
|
[
|
||||||
|
'mem_prot'
|
||||||
|
]
|
||||||
|
)
|
||||||
|
def test_memory_protection(dut: Dut) -> None:
|
||||||
|
dut.expect_exact('Press ENTER to see the list of tests')
|
||||||
|
dut.write('[heap][mem_prot]')
|
||||||
|
dut.expect_unity_test_output(timeout=300)
|
||||||
|
1
components/heap/test_apps/sdkconfig.ci.mem_prot
Normal file
1
components/heap/test_apps/sdkconfig.ci.mem_prot
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CONFIG_ESP_SYSTEM_MEMPROT_FEATURE=y
|
Reference in New Issue
Block a user