| Supported Targets | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 |
|---|
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 hal/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>