Validate linked RISC-V executables when CONFIG_COMPILER_ENABLE_RISCV_ZCMP is enabled on affected chips. Disassemble each function and reject mstatus.MIE clears that lack an earlier mintthresh write of 0xff. Handle csrrci, csrrw, and register-mask csrrc patterns while ignoring csrrs. Add build-only coverage for valid and invalid sequences with CMake v1 and v2. Stop the hardware stack guard before switching stacks during restart, and keep ZCMP disabled for TEE test apps that still require the workaround.
| Supported Targets | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 |
|---|
TEE (Trusted Execution Environment) Test Application
This application is designed to validate the key components of the ESP-TEE framework, with a focus on:
-
Permission Management (PMS: TEE controller + APM module)
- Region-based memory and peripheral access control using the TEE controller and the Access Permission Management (APM) module
-
Interrupts
- Interrupt handling in Machine mode (M), User mode (U), and cross-mode contexts
It is primarily intended for early bring-up and SoC-level functional validation.
Test Coverage: PMS (TEE + APM module)
TEE mode default access behavior
- TEE Mode Default Access
Validates whether TEE mode has unrestricted access to regions not covered by APM entries. Confirms filtering issues on ESP32-C6 and ESP32-H2.
HP_CPU Access
- HP_CPU → CPU_PERI
- HP_CPU → HP_PERI
- HP_CPU → LP_PERI
- HP_CPU → HP_MEM (if
SOC_APM_CPU_APM_SUPPORTED) - HP_CPU → LP_MEM (if
SOC_RTC_MEM_SUPPORTED)
Each scenario checks access permission enforcement for read-only and write-only settings across security modes.
GDMA Access
- GDMA → HP_MEM
- GDMA → EXT_MEM (if
CONFIG_SPIRAM)
Validates region-based restrictions across modes using DMA transfers.
LP_CPU Access (if CONFIG_ULP_COPROC_ENABLED)
- LP_CPU → LP_PERI
- LP_CPU → LP_MEM
- LP_CPU → HP_MEM
PERI_APM Tests (if SOC_APM_SUPPORT_TEE_PERI_ACCESS_CTRL)
- HP_CPU → HP_PERI
- HP_CPU → LP_PERI
- LP_CPU → HP_PERI
- LP_CPU → LP_PERI
Validates the per-peripheral access permissions for all security modes.
Test Coverage: Interrupts
- M-mode interrupts in M-mode
- U-mode interrupts in U-mode
- M-mode interrupts in U-mode
- U-mode interrupts in M-mode
Target Extension Guide
To add support for a new SoC target, create a test configuration header at:
components/pms/priv_include/<target>/test_pms_params.h
This header must define:
1. GDMA APM Master ID
Defined based on GDMA version:
#define TEST_GDMA_APM_MASTER_ID APM_MASTER_GDMA_GPSPI // For SOC_AHB_GDMA_VERSION == 1
SOC_AHB_GDMA_VERSION == 1→GPSPISOC_AHB_GDMA_VERSION == 2→26(e.g.,GDMA_DUMMY10)
Refer to esp_hal_security/apm_types.h or the SoC TRM.
2. APM Controller and Path Definitions
Specify APM controller and access path for each initiator-target pair:
#define HP_CPU_CPUPERI_APM_CTRL APM_CTRL_HP_APM
#define HP_CPU_CPUPERI_APM_PATH APM_CTRL_ACCESS_PATH_M0
#define TEST_HP_CPU_CPUPERI_REGN_NUM 4
Use the TRM to determine path-controller mappings.
3. Peripheral Test Region Definitions
Split the peripheral address space into testable regions:
- Use
soc/reg_base.hto get base addresses of peripherals. - Align non-contiguous region boundaries to 4 KB using:
#define ALIGN_TO_NEXT_4KB(addr) (((addr) + 0x1000) & ~0xFFF)
CPU_PERI
- Typically monitored by
HP_APM. - Includes blocks like
TRACE,ASSIST_DEBUG,INTPRI,CACHE. CPU_PERItypically includes ~4 peripherals, and thus, 4 APM regions are sufficient for test coverage.
LP_PERI
- Monitored by
LP_APM. - Covers domains like
PMU,LP_IO,LP_AON. - For SoCs with
LP_CPU, reserve the regions containingPMU,LP_AON,LP_PERI. These are reserved to allow test-case control and avoid undesired APM violations.
#define TEST_LP_PERI_RESV_MASK BIT(0) | BIT(2) | BIT(6)
HP_PERI
- Monitored by
HP_APM. - Split into:
HP_PERI0,HP_PERI1, andHP_PERI2. Test APM regions should be proportionally allocated to these segments based on address space size. - Reserve the region containing
UART0, since it is often used by the log console. - If
PERI_APMis supported, reserve the regions withTEE,LP_TEE,HP_APM,LP_APM,LP_APM0, andCPU_APM, as these are inaccessible to the REE modes.
#define TEST_HP_PERI_RESV_MASK BIT(0)
Building
idf.py set-target <TARGET>
idf.py build
Running the App
idf.py flash monitor
Running Tests
pytest --target <TARGET>