|
|
@@ -25,16 +25,16 @@
|
|
|
extern "C" {
|
|
|
#endif
|
|
|
|
|
|
- //highest address of each Level slot in the SRAM's 3rd memory region (I/D access, 416kB)
|
|
|
+//highest address of each Level slot in the SRAM's 3rd memory region (I/D access, 416kB)
|
|
|
//quick resolver of split-address category bits
|
|
|
static const intptr_t sram_rg3_level_hlimits[] = {
|
|
|
0x4037FFFF, //level 2 (32KB)
|
|
|
0x4038FFFF, //level 3 (64KB)
|
|
|
0x4039FFFF, //level 4 (64KB)
|
|
|
- 0x403A0000, //level 5 (64KB)
|
|
|
- 0x403B0000, //level 6 (64KB)
|
|
|
- 0x403C0000, //level 7 (64KB)
|
|
|
- 0x403D0000 //level 8 (64KB)
|
|
|
+ 0x403AFFFF, //level 5 (64KB)
|
|
|
+ 0x403BFFFF, //level 6 (64KB)
|
|
|
+ 0x403CFFFF, //level 7 (64KB)
|
|
|
+ 0x403DFFFF //level 8 (64KB)
|
|
|
};
|
|
|
|
|
|
/* ******************************************************************************************************
|
|
|
@@ -81,6 +81,62 @@ static inline void *memprot_ll_get_split_addr_from_reg(const uint32_t regval, co
|
|
|
return (void *)(base + level_off + off);
|
|
|
}
|
|
|
|
|
|
+/* ******************************************************************************************************
|
|
|
+ * *** ICACHE ***
|
|
|
+ * ******************************************************************************************************/
|
|
|
+static inline uint32_t memprot_ll_icache_set_permissions(const bool r, const bool w, const bool x)
|
|
|
+{
|
|
|
+ uint32_t permissions = 0;
|
|
|
+ if (r) {
|
|
|
+ permissions |= SENSITIVE_CORE_X_ICACHE_PMS_CONSTRAIN_SRAM_WORLD_X_R;
|
|
|
+ }
|
|
|
+ if (w) {
|
|
|
+ permissions |= SENSITIVE_CORE_X_ICACHE_PMS_CONSTRAIN_SRAM_WORLD_X_W;
|
|
|
+ }
|
|
|
+ if (x) {
|
|
|
+ permissions |= SENSITIVE_CORE_X_ICACHE_PMS_CONSTRAIN_SRAM_WORLD_X_F;
|
|
|
+ }
|
|
|
+
|
|
|
+ return permissions;
|
|
|
+}
|
|
|
+
|
|
|
+static inline void memprot_ll_icache_set_pms_area_0(const bool r, const bool w, const bool x)
|
|
|
+{
|
|
|
+ REG_SET_FIELD(SENSITIVE_CORE_X_IRAM0_PMS_CONSTRAIN_2_REG, SENSITIVE_CORE_X_IRAM0_PMS_CONSTRAIN_SRAM_WORLD_0_CACHEDATAARRAY_PMS_0, memprot_ll_icache_set_permissions(r, w, x));
|
|
|
+#ifdef PMS_DEBUG_ASSERTIONS
|
|
|
+ uint32_t expected = REG_GET_FIELD(SENSITIVE_CORE_X_IRAM0_PMS_CONSTRAIN_2_REG, SENSITIVE_CORE_X_IRAM0_PMS_CONSTRAIN_SRAM_WORLD_0_CACHEDATAARRAY_PMS_0);
|
|
|
+ HAL_ASSERT((expected == memprot_ll_icache_set_permissions(r, w, x)) && "Value not stored to required register");
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
+static inline void memprot_ll_icache_set_pms_area_1(const bool r, const bool w, const bool x)
|
|
|
+{
|
|
|
+ REG_SET_FIELD(SENSITIVE_CORE_X_IRAM0_PMS_CONSTRAIN_2_REG, SENSITIVE_CORE_X_IRAM0_PMS_CONSTRAIN_SRAM_WORLD_0_CACHEDATAARRAY_PMS_1, memprot_ll_icache_set_permissions(r, w, x));
|
|
|
+#ifdef PMS_DEBUG_ASSERTIONS
|
|
|
+ uint32_t expected = REG_GET_FIELD(SENSITIVE_CORE_X_IRAM0_PMS_CONSTRAIN_2_REG, SENSITIVE_CORE_X_IRAM0_PMS_CONSTRAIN_SRAM_WORLD_0_CACHEDATAARRAY_PMS_1);
|
|
|
+ HAL_ASSERT((expected == memprot_ll_icache_set_permissions(r, w, x)) && "Value not stored to required register");
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
+static inline void memprot_ll_icache_get_permissions(const uint32_t perms, bool *r, bool *w, bool *x)
|
|
|
+{
|
|
|
+ *r = perms & SENSITIVE_CORE_X_ICACHE_PMS_CONSTRAIN_SRAM_WORLD_X_R;
|
|
|
+ *w = perms & SENSITIVE_CORE_X_ICACHE_PMS_CONSTRAIN_SRAM_WORLD_X_W;
|
|
|
+ *x = perms & SENSITIVE_CORE_X_ICACHE_PMS_CONSTRAIN_SRAM_WORLD_X_F;
|
|
|
+}
|
|
|
+
|
|
|
+static inline void memprot_ll_icache_get_pms_area_0(bool *r, bool *w, bool *x)
|
|
|
+{
|
|
|
+ uint32_t permissions = REG_GET_FIELD(SENSITIVE_CORE_X_IRAM0_PMS_CONSTRAIN_2_REG, SENSITIVE_CORE_X_IRAM0_PMS_CONSTRAIN_SRAM_WORLD_0_CACHEDATAARRAY_PMS_0);
|
|
|
+ memprot_ll_icache_get_permissions(permissions, r, w, x);
|
|
|
+}
|
|
|
+
|
|
|
+static inline void memprot_ll_icache_get_pms_area_1(bool *r, bool *w, bool *x)
|
|
|
+{
|
|
|
+ uint32_t permissions = REG_GET_FIELD(SENSITIVE_CORE_X_IRAM0_PMS_CONSTRAIN_2_REG, SENSITIVE_CORE_X_IRAM0_PMS_CONSTRAIN_SRAM_WORLD_0_CACHEDATAARRAY_PMS_1);
|
|
|
+ memprot_ll_icache_get_permissions(permissions, r, w, x);
|
|
|
+}
|
|
|
+
|
|
|
/* ******************************************************************************************************
|
|
|
* *** IRAM0 ***
|
|
|
* ******************************************************************************************************/
|
|
|
@@ -571,7 +627,7 @@ static inline memprot_hal_err_t memprot_ll_iram0_get_monitor_status_fault_addr(c
|
|
|
return MEMP_HAL_ERR_CORE_INVALID;
|
|
|
}
|
|
|
|
|
|
- *addr = (void*)(reg_off > 0 ? (reg_off << I_D_FAULT_ADDR_SHIFT) + IRAM0_ADDRESS_LOW : 0);
|
|
|
+ *addr = (void*)(reg_off > 0 ? (reg_off << I_FAULT_ADDR_SHIFT) + IRAM0_ADDRESS_LOW : 0);
|
|
|
|
|
|
return MEMP_HAL_OK;
|
|
|
}
|
|
|
@@ -1590,7 +1646,7 @@ static inline memprot_hal_err_t memprot_ll_dram0_get_monitor_status_fault_addr(c
|
|
|
return MEMP_HAL_ERR_CORE_INVALID;
|
|
|
}
|
|
|
|
|
|
- *addr = (void*)(reg_off > 0 ? (reg_off << I_D_FAULT_ADDR_SHIFT) + IRAM0_ADDRESS_LOW : 0);
|
|
|
+ *addr = (void*)(reg_off > 0 ? (reg_off << D_FAULT_ADDR_SHIFT) + DRAM0_ADDRESS_LOW : 0);
|
|
|
|
|
|
return MEMP_HAL_OK;
|
|
|
}
|