arch: arm: fix null pointer dereference check test
What is changed? Updated the condition thats prevents mpu config for null dereference. Added a new check so that mpu is configured for null dereference if devicetree contains a memory-region node with: - node address starting at 0 - size covered by the node is more than the null dereference page size (0x400) and - contains a memory-attr Why is the change needed? The check relied on flash base address to align with 0 for configuring the mpu for null dereference but, a device tree could have a flash starting at an address other than 0 and still need the mpu config for null dereference. The new extra check provides a way to connfigure mpu for null dereference even if flash base address is not 0. Note, though this change helps with mpu config for new boards having flash address other than 0, this change does not change existing behaviour for existing boards. Signed-off-by: Sudan Landge <sudan.landge@arm.com>
This commit is contained in:
parent
caa7226157
commit
f2e115cca3
2 changed files with 18 additions and 1 deletions
|
|
@ -37,6 +37,13 @@ BUILD_ASSERT((DT_FOREACH_STATUS_OKAY_NODE_VARGS(
|
|||
NODE_HAS_PROP_AND_OR, zephyr_memory_region_mpu) false) == false,
|
||||
"`zephyr,memory-region-mpu` was deprecated in favor of `zephyr,memory-attr`");
|
||||
|
||||
#define NULL_PAGE_DETECT_NODE_FINDER(node_id, prop) \
|
||||
(DT_NODE_HAS_PROP(node_id, prop) && (DT_REG_ADDR(node_id) == 0) && \
|
||||
(DT_REG_SIZE(node_id) >= CONFIG_CORTEX_M_NULL_POINTER_EXCEPTION_PAGE_SIZE)) ||
|
||||
|
||||
#define DT_NULL_PAGE_DETECT_NODE_EXIST \
|
||||
(DT_FOREACH_STATUS_OKAY_NODE_VARGS(NULL_PAGE_DETECT_NODE_FINDER, zephyr_memory_attr) false)
|
||||
|
||||
/*
|
||||
* Global status variable holding the number of HW MPU region indices, which
|
||||
* have been reserved by the MPU driver to program the static (fixed) memory
|
||||
|
|
@ -470,7 +477,9 @@ int z_arm_mpu_init(void)
|
|||
*/
|
||||
#if defined(CONFIG_NULL_POINTER_EXCEPTION_DETECTION_MPU)
|
||||
#if (defined(CONFIG_ARMV8_M_BASELINE) || defined(CONFIG_ARMV8_M_MAINLINE)) && \
|
||||
(CONFIG_FLASH_BASE_ADDRESS > CONFIG_CORTEX_M_NULL_POINTER_EXCEPTION_PAGE_SIZE)
|
||||
(CONFIG_FLASH_BASE_ADDRESS > CONFIG_CORTEX_M_NULL_POINTER_EXCEPTION_PAGE_SIZE) && \
|
||||
(!DT_NULL_PAGE_DETECT_NODE_EXIST)
|
||||
|
||||
#pragma message "Null-Pointer exception detection cannot be configured on un-mapped flash areas"
|
||||
#else
|
||||
const struct z_arm_mpu_partition unmap_region = {
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@
|
|||
#include <arm/armv8.1-m.dtsi>
|
||||
#include <zephyr/dt-bindings/i2c/i2c.h>
|
||||
#include <zephyr/dt-bindings/input/input-event-codes.h>
|
||||
#include <zephyr/dt-bindings/memory-attr/memory-attr-arm.h>
|
||||
#include <mem.h>
|
||||
|
||||
/ {
|
||||
|
|
@ -77,6 +78,13 @@
|
|||
};
|
||||
};
|
||||
|
||||
null_ptr_detect: null_ptr_detect@0 {
|
||||
compatible = "zephyr,memory-region";
|
||||
/* 0 - CONFIG_CORTEX_M_NULL_POINTER_EXCEPTION_PAGE_SIZE> */
|
||||
reg = <0x0 0x400>;
|
||||
zephyr,memory-region = "NULL_PTR_DETECT";
|
||||
zephyr,memory-attr = <( DT_MEM_ARM(ATTR_MPU_FLASH) )>;
|
||||
};
|
||||
/* DDR4 - 2G, alternates non-secure/secure every 256M */
|
||||
ddr4: memory@60000000 {
|
||||
device_type = "memory";
|
||||
|
|
|
|||
Loading…
Reference in a new issue