This is an automated email from the ASF dual-hosted git repository. GUIDINGLI pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit 4afb7f91ad2f9b4d4f1af70c5159010093459fd2 Author: zhangyu117 <[email protected]> AuthorDate: Mon Aug 31 10:07:31 2026 +0800 arch/tricore: mpu: per-set flags array and cpuset in mpu_region_s Refactor kflags/uflags into a per-set flags[] array indexed by set number, and add a cpuset field to filter regions per CPU. Rewrite mpu_initialize to loop over all protection sets. Signed-off-by: zhangyu117 <[email protected]> --- arch/tricore/src/common/tricore_mpu.c | 49 +++++++++++++++++++---------------- arch/tricore/src/common/tricore_mpu.h | 6 ++--- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/arch/tricore/src/common/tricore_mpu.c b/arch/tricore/src/common/tricore_mpu.c index d8c3b6d1f98..5eebc548087 100644 --- a/arch/tricore/src/common/tricore_mpu.c +++ b/arch/tricore/src/common/tricore_mpu.c @@ -1207,38 +1207,43 @@ void mpu_set_active_set(unsigned int set) void mpu_initialize(const struct mpu_region_s *table, size_t count) { const struct mpu_region_s *conf; - unsigned int kset = mpu_alloc_set(); -#ifdef CONFIG_BUILD_PROTECTED - unsigned int uset = mpu_alloc_set(); -#endif + unsigned int cpu = this_cpu(); unsigned int region; - size_t index; + int set; + int index; mpu_control(false); for (index = 0; index < count; index++) { conf = &table[index]; - if ((conf->kflags & REGION_TYPE_MASK) == REGION_TYPE_CODE) - { - region = mpu_alloccoderegion(); - mpu_modify_code_region(region, conf->base, conf->size); - mpu_modify_code_set(kset, region, conf->kflags); -#ifdef CONFIG_BUILD_PROTECTED - mpu_modify_code_set(uset, region, conf->uflags); -#endif - } - else + if (conf->cpuset & (1 << cpu)) { - region = mpu_allocdataregion(); - mpu_modify_data_region(region, conf->base, conf->size); - mpu_modify_data_set(kset, region, conf->kflags); - #ifdef CONFIG_BUILD_PROTECTED - mpu_modify_data_set(uset, region, conf->uflags); - #endif + /* Allocate new region based on type */ + + if ((conf->flags[0] & REGION_TYPE_MASK) == REGION_TYPE_CODE) + { + region = mpu_alloccoderegion(); + mpu_modify_code_region(region, conf->base, conf->size); + } + else if ((conf->flags[0] & REGION_TYPE_MASK) == REGION_TYPE_DATA) + { + region = mpu_allocdataregion(); + mpu_modify_data_region(region, conf->base, conf->size); + } + else + { + continue; + } + + /* Set permissions for each protection set */ + + for (set = 0; set < CONFIG_ARCH_MPU_NSETS; set++) + { + mpu_modify_region(set, region, 0, 0, conf->flags[set]); + } } } - mpu_set_active_set(kset); mpu_control(true); } diff --git a/arch/tricore/src/common/tricore_mpu.h b/arch/tricore/src/common/tricore_mpu.h index 4ddb597d3af..a3221d8f7d3 100644 --- a/arch/tricore/src/common/tricore_mpu.h +++ b/arch/tricore/src/common/tricore_mpu.h @@ -55,9 +55,9 @@ struct mpu_region_s { uintptr_t base; - size_t size; - int kflags; - int uflags; + size_t size; + uint32_t cpuset; + int flags[CONFIG_ARCH_MPU_NSETS]; }; /****************************************************************************
