Merge branch 'fix/pmp_drom_mask_read_only_v5.4' into 'release/v5.4'

fix(cpu_region_protect): set DROM mask PMP entry to read-only (v5.4)

See merge request espressif/esp-idf!47578
This commit is contained in:
Mahavir Jain
2026-05-13 12:56:17 +05:30
5 changed files with 75 additions and 2 deletions

View File

@@ -48,6 +48,12 @@ void test_spiram_xip_irom_alignment_reg_execute_violation(void);
void test_spiram_xip_drom_alignment_reg_execute_violation(void);
void test_irom_mask_reg_write_violation(void);
#ifdef SOC_DROM_MASK_HIGH
void test_drom_mask_reg_write_violation(void);
#endif
void test_drom_reg_write_violation(void);
void test_drom_reg_execute_violation(void);

View File

@@ -174,6 +174,10 @@ void app_main(void)
#if CONFIG_ESP_SYSTEM_PMP_IDRAM_SPLIT
HANDLE_TEST(test_name, test_irom_reg_write_violation);
HANDLE_TEST(test_name, test_irom_mask_reg_write_violation);
#ifdef SOC_DROM_MASK_HIGH
HANDLE_TEST(test_name, test_drom_mask_reg_write_violation);
#endif
HANDLE_TEST(test_name, test_drom_reg_write_violation);
HANDLE_TEST(test_name, test_drom_reg_execute_violation);
#if CONFIG_SPIRAM_FETCH_INSTRUCTIONS && SOC_MMU_DI_VADDR_SHARED

View File

@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2021-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -234,6 +234,23 @@ void test_irom_reg_write_violation(void)
*test_addr = RND_VAL;
}
void test_irom_mask_reg_write_violation(void)
{
uint32_t *test_addr = (uint32_t *)(SOC_IROM_MASK_LOW + 0x04);
printf("ROM (IROM Mask): Write operation | Address: %p\n", test_addr);
*test_addr = RND_VAL;
}
#ifdef SOC_DROM_MASK_HIGH
void test_drom_mask_reg_write_violation(void)
{
uint32_t *test_addr = (uint32_t *)(SOC_DROM_MASK_HIGH - 0x04);
printf("ROM (DROM Mask): Write operation | Address: %p\n", test_addr);
*test_addr = RND_VAL;
}
#endif
void test_drom_reg_write_violation(void)
{
uint32_t *test_addr = (uint32_t *)((uint32_t)(foo_buf));

View File

@@ -2149,6 +2149,52 @@ def test_irom_reg_write_violation(dut: PanicTestDut, test_func_name: str) -> Non
dut.expect_cpu_reset()
def irom_mask_reg_write_violation(dut: PanicTestDut, test_func_name: str) -> None:
dut.run_test_func(test_func_name)
dut.expect_gme('Store access fault')
dut.expect_reg_dump(0)
dut.expect_cpu_reset()
@pytest.mark.generic
@idf_parametrize(
'config,target',
[
('memprot_esp32c5', 'esp32c5'),
('memprot_esp32c6', 'esp32c6'),
('memprot_esp32c61', 'esp32c61'),
('memprot_esp32h2', 'esp32h2'),
('memprot_esp32p4', 'esp32p4'),
],
indirect=['config', 'target'],
)
def test_irom_mask_reg_write_violation(dut: PanicTestDut, test_func_name: str) -> None:
irom_mask_reg_write_violation(dut, test_func_name)
def drom_mask_reg_write_violation(dut: PanicTestDut, test_func_name: str) -> None:
dut.run_test_func(test_func_name)
dut.expect_gme('Store access fault')
dut.expect_reg_dump(0)
dut.expect_cpu_reset()
@pytest.mark.generic
@idf_parametrize(
'config,target',
[
('memprot_esp32c5', 'esp32c5'),
('memprot_esp32c6', 'esp32c6'),
('memprot_esp32c61', 'esp32c61'),
('memprot_esp32h2', 'esp32h2'),
('memprot_esp32p4', 'esp32p4'),
],
indirect=['config', 'target'],
)
def test_drom_mask_reg_write_violation(dut: PanicTestDut, test_func_name: str) -> None:
drom_mask_reg_write_violation(dut, test_func_name)
@pytest.mark.generic
@idf_parametrize(
'config,target',