| # ARM Cortex-M platform configuration options |
| |
| # Copyright (c) 2014-2015 Wind River Systems, Inc. |
| # SPDX-License-Identifier: Apache-2.0 |
| |
| # NOTE: We have the specific core implementations first and outside of the |
| # if CPU_CORTEX_M block so that SoCs can select which core they are using |
| # without having to select all the options related to that core. Everything |
| # else is captured inside the if CPU_CORTEX_M block so they are not exposed |
| # if one select a different ARM Cortex Family (Cortex-A or Cortex-R) |
| |
| config CPU_CORTEX_M0 |
| bool |
| select CPU_CORTEX_M |
| select ARMV6_M_ARMV8_M_BASELINE |
| help |
| This option signifies the use of a Cortex-M0 CPU |
| |
| config CPU_CORTEX_M0PLUS |
| bool |
| select CPU_CORTEX_M |
| select ARMV6_M_ARMV8_M_BASELINE |
| help |
| This option signifies the use of a Cortex-M0+ CPU |
| |
| config CPU_CORTEX_M1 |
| bool |
| select CPU_CORTEX_M |
| select ARMV6_M_ARMV8_M_BASELINE |
| help |
| This option signifies the use of a Cortex-M1 CPU |
| |
| config CPU_CORTEX_M3 |
| bool |
| select CPU_CORTEX_M |
| select ARMV7_M_ARMV8_M_MAINLINE |
| help |
| This option signifies the use of a Cortex-M3 CPU |
| |
| config CPU_CORTEX_M4 |
| bool |
| select CPU_CORTEX_M |
| select ARMV7_M_ARMV8_M_MAINLINE |
| select ARMV7_M_ARMV8_M_FP if CPU_HAS_FPU |
| help |
| This option signifies the use of a Cortex-M4 CPU |
| |
| config CPU_CORTEX_M23 |
| bool |
| select CPU_CORTEX_M |
| select ARMV8_M_BASELINE |
| select ARMV8_M_SE if CPU_HAS_TEE |
| help |
| This option signifies the use of a Cortex-M23 CPU |
| |
| config CPU_CORTEX_M33 |
| bool |
| select CPU_CORTEX_M |
| select ARMV8_M_MAINLINE |
| select ARMV8_M_SE if CPU_HAS_TEE |
| select ARMV7_M_ARMV8_M_FP if CPU_HAS_FPU |
| help |
| This option signifies the use of a Cortex-M33 CPU |
| |
| config CPU_CORTEX_M55 |
| bool |
| select CPU_CORTEX_M |
| select ARMV8_1_M_MAINLINE |
| select ARMV8_M_SE if CPU_HAS_TEE |
| select ARMV7_M_ARMV8_M_FP if CPU_HAS_FPU |
| select CPU_HAS_DCACHE |
| select CPU_HAS_ICACHE |
| help |
| This option signifies the use of a Cortex-M55 CPU |
| |
| config CPU_CORTEX_M7 |
| bool |
| select CPU_CORTEX_M |
| select ARMV7_M_ARMV8_M_MAINLINE |
| select ARMV7_M_ARMV8_M_FP if CPU_HAS_FPU |
| select CPU_HAS_DCACHE |
| select CPU_HAS_ICACHE |
| help |
| This option signifies the use of a Cortex-M7 CPU |
| |
| if CPU_CORTEX_M |
| |
| config CPU_CORTEX_M_HAS_SYSTICK |
| bool |
| help |
| This option is enabled when the CPU implements the SysTick timer. |
| |
| config DCACHE_LINE_SIZE |
| default 32 |
| |
| config ICACHE_LINE_SIZE |
| default 32 |
| |
| config CPU_CORTEX_M_HAS_DWT |
| bool |
| depends on !CPU_CORTEX_M0 && !CPU_CORTEX_M0PLUS && !CPU_CORTEX_M1 |
| help |
| This option signifies that the CPU implements the Data Watchpoint and |
| Trace (DWT) unit specified by the ARMv7-M and above. |
| |
| While ARMv6-M does define a "DWT" unit, this is significantly different |
| from the DWT specified by the ARMv7-M and above in terms of both feature |
| set and register mappings. |
| |
| config CPU_CORTEX_M_HAS_BASEPRI |
| bool |
| depends on ARMV7_M_ARMV8_M_MAINLINE |
| help |
| This option signifies the CPU has the BASEPRI register. |
| |
| The BASEPRI register defines the minimum priority for |
| exception processing. When BASEPRI is set to a nonzero |
| value, it prevents the activation of all exceptions with |
| the same or lower priority level as the BASEPRI value. |
| Always present in CPUs that implement the ARMv7-M or |
| ARM8-M Mainline architectures. |
| |
| config CPU_CORTEX_M_HAS_VTOR |
| bool |
| depends on !CPU_CORTEX_M0 && !CPU_CORTEX_M1 |
| help |
| This option signifies the CPU has the VTOR register. |
| The VTOR indicates the offset of the vector table base |
| address from memory address 0x00000000. Always present |
| in CPUs implementing the ARMv7-M or ARMv8-M architectures. |
| Optional in CPUs implementing ARMv6-M, ARMv8-M Baseline |
| architectures (except for Cortex-M0/M1, where it is never |
| implemented). |
| |
| config CPU_CORTEX_M_HAS_SPLIM |
| bool |
| depends on ARMV8_M_MAINLINE || (ARMV8_M_SE && !ARM_NONSECURE_FIRMWARE) |
| help |
| This option signifies the CPU has the MSPLIM, PSPLIM registers. |
| |
| The stack pointer limit registers, MSPLIM, PSPLIM, limit the |
| extend to which the Main and Process Stack Pointers, respectively, |
| can descend. MSPLIM, PSPLIM are always present in ARMv8-M |
| MCUs that implement the ARMv8-M Main Extension (Mainline). |
| |
| In an ARMv8-M Mainline implementation with the Security Extension |
| the MSPLIM, PSPLIM registers have additional Secure instances. |
| In an ARMv8-M Baseline implementation with the Security Extension |
| the MSPLIM, PSPLIM registers have only Secure instances. |
| |
| config CPU_CORTEX_M_HAS_PROGRAMMABLE_FAULT_PRIOS |
| bool |
| depends on ARMV7_M_ARMV8_M_MAINLINE |
| help |
| This option signifies the CPU may trigger system faults |
| (other than HardFault) with configurable priority, and, |
| therefore, it needs to reserve a priority level for them. |
| |
| config CPU_CORTEX_M0_HAS_VECTOR_TABLE_REMAP |
| bool |
| depends on ARMV6_M_ARMV8_M_BASELINE |
| help |
| This option signifies the Cortex-M0 has some mechanisms that can map |
| the vector table to SRAM |
| |
| config CPU_CORTEX_M_HAS_CMSE |
| bool |
| depends on ARMV8_M_BASELINE || ARMV8_M_MAINLINE |
| help |
| This option signifies the Cortex-M CPU has the CMSE intrinsics. |
| |
| config ARMV6_M_ARMV8_M_BASELINE |
| bool |
| select ATOMIC_OPERATIONS_C |
| select ISA_THUMB2 |
| help |
| This option signifies the use of an ARMv6-M processor |
| implementation, or the use of an ARMv8-M processor |
| supporting the Baseline implementation. |
| |
| Notes: |
| - A Processing Element (PE) without the Main Extension |
| is also referred to as a Baseline Implementation. A |
| Baseline implementation has a subset of the instructions, |
| registers, and features, of a Mainline implementation. |
| - ARMv6-M compatibility is provided by all ARMv8-M |
| implementations. |
| |
| config ARMV8_M_BASELINE |
| bool |
| select ARMV6_M_ARMV8_M_BASELINE |
| select CPU_CORTEX_M_HAS_CMSE |
| help |
| This option signifies the use of an ARMv8-M processor |
| implementation. |
| |
| ARMv8-M Baseline includes additional features |
| not present in the ARMv6-M architecture. |
| |
| config ARMV7_M_ARMV8_M_MAINLINE |
| bool |
| select ATOMIC_OPERATIONS_BUILTIN |
| select ISA_THUMB2 |
| select CPU_CORTEX_M_HAS_BASEPRI |
| select CPU_CORTEX_M_HAS_VTOR |
| select CPU_CORTEX_M_HAS_PROGRAMMABLE_FAULT_PRIOS |
| select CPU_CORTEX_M_HAS_SYSTICK |
| help |
| This option signifies the use of an ARMv7-M processor |
| implementation, or the use of a backwards-compatible |
| ARMv8-M processor implementation supporting the Main |
| Extension. |
| |
| Notes: |
| - A Processing Element (PE) with the Main Extension is also |
| referred to as a Mainline Implementation. |
| - ARMv7-M compatibility requires the Main Extension. |
| |
| From https://developer.arm.com/products/architecture/m-profile: |
| The Main Extension provides backwards compatibility |
| with ARMv7-M. |
| |
| config ARMV8_M_MAINLINE |
| bool |
| select ARMV7_M_ARMV8_M_MAINLINE |
| select CPU_CORTEX_M_HAS_SPLIM |
| select CPU_CORTEX_M_HAS_CMSE |
| help |
| This option signifies the use of an ARMv8-M processor |
| implementation, supporting the Main Extension. |
| |
| ARMv8-M Main Extension includes additional features |
| not present in the ARMv7-M architecture. |
| |
| config ARMV8_1_M_MAINLINE |
| bool |
| select ARMV8_M_MAINLINE |
| help |
| This option signifies the use of an ARMv8.1-M processor |
| implementation, supporting the Main Extension. |
| |
| ARMv8.1-M Main Extension includes additional features |
| not present in the ARMv8-M architecture. |
| |
| config ARMV8_M_SE |
| bool |
| depends on ARMV8_M_BASELINE || ARMV8_M_MAINLINE |
| select CPU_CORTEX_M_HAS_SPLIM if !ARM_NONSECURE_FIRMWARE |
| help |
| This option signifies the use of an ARMv8-M processor |
| implementation (Baseline or Mainline) supporting the |
| Security Extensions. |
| |
| config ARMV7_M_ARMV8_M_FP |
| bool |
| depends on ARMV7_M_ARMV8_M_MAINLINE && !CPU_CORTEX_M3 |
| imply FPU_SHARING |
| help |
| This option signifies the use of an ARMv7-M processor |
| implementation, or the use of an ARMv8-M processor |
| implementation supporting the Floating-Point Extension. |
| |
| config ARMV8_M_DSP |
| bool |
| depends on ARMV8_M_MAINLINE |
| help |
| This option signifies the use of an ARMv8-M processor |
| implementation supporting the DSP Extension. |
| |
| config ARMV8_1_M_MVEI |
| bool |
| depends on ARMV8_1_M_MAINLINE |
| depends on ARMV8_M_DSP |
| help |
| This option signifies the use of an ARMv8.1-M processor implementation |
| supporting the M-Profile Vector Extension (MVE) integer instruction set. |
| |
| config ARMV8_1_M_MVEF |
| bool |
| depends on ARMV8_1_M_MVEI |
| help |
| This option signifies the use of an ARMv8.1-M processor implementation |
| supporting the M-Profile Vector Extension (MVE) floating-point |
| instruction set. |
| |
| menu "ARM Cortex-M0/M0+/M1/M3/M4/M7/M23/M33 options" |
| depends on ARMV6_M_ARMV8_M_BASELINE || ARMV7_M_ARMV8_M_MAINLINE |
| |
| config GEN_ISR_TABLES |
| default y |
| |
| config ZERO_LATENCY_IRQS |
| bool "Zero-latency interrupts" |
| depends on CPU_CORTEX_M_HAS_BASEPRI |
| help |
| The kernel may reserve some of the highest interrupts priorities in |
| the system for its own use. These interrupts will not be masked |
| by interrupt locking. |
| When connecting interrupts the kernel will offset all interrupts |
| to lower priority than those reserved by the kernel. |
| Zero-latency interrupt can be used to set up an interrupt at the |
| highest interrupt priority which will not be blocked by interrupt |
| locking. |
| Since Zero-latency ISRs will run in the same priority or possibly at |
| higher priority than the rest of the kernel they cannot use any |
| kernel functionality. |
| |
| config ZERO_LATENCY_LEVELS |
| int "Number of interrupt priority levels reserved for zero latency" |
| depends on ZERO_LATENCY_IRQS |
| range 1 255 |
| help |
| The amount of interrupt priority levels reserved for zero latency |
| interrupts. Increase this value to reserve more than one priority |
| level for zero latency interrupts. |
| |
| config DYNAMIC_DIRECT_INTERRUPTS |
| bool "Support for dynamic direct interrupts" |
| depends on DYNAMIC_INTERRUPTS |
| help |
| Direct interrupts are designed for performance-critical interrupt |
| handling and do not go through all of the common interrupt handling |
| code. This option enables the installation of interrupt service |
| routines for direct interrupts at runtime. |
| Note: this requires enabling support for dynamic interrupts in the |
| kernel. |
| |
| config SW_VECTOR_RELAY |
| bool "Software Vector Relay" |
| help |
| When building a bootloader firmware this option adds a |
| vector table relay handler and a vector relay table, to |
| relay interrupts based on a vector table pointer. |
| This is only required but not limited to Cortex-M Baseline CPUs |
| with no hardware vector table relocation mechanisms (e.g. VTOR). |
| |
| config SW_VECTOR_RELAY_CLIENT |
| bool "Software Vector Relay (client)" |
| default y if BOOTLOADER_MCUBOOT && !CPU_CORTEX_M0_HAS_VECTOR_TABLE_REMAP |
| depends on !CPU_CORTEX_M_HAS_VTOR |
| help |
| Another image has enabled SW_VECTOR_RELAY, and will be forwarding |
| exceptions and HW interrupts to this image. Enable this option to make |
| sure the vector table pointer in RAM is set properly by the image upon |
| initialization. |
| |
| config CORTEX_M_DWT |
| bool "Data Watchpoint and Trace (DWT)" |
| depends on CPU_CORTEX_M_HAS_DWT |
| default y if TIMING_FUNCTIONS |
| help |
| Enable and use the Data Watchpoint and Trace (DWT) unit for |
| timing functions. |
| |
| # Additional stack for tests when building with FPU_SHARING |
| # enabled, which may increase ESF stacking requirements for |
| # threads. |
| config TEST_EXTRA_STACK_SIZE |
| default 512 if TEST_ARM_CORTEX_M && FPU_SHARING |
| |
| config TRAP_UNALIGNED_ACCESS |
| bool "Unaligned access trap" |
| depends on !ARMV6_M_ARMV8_M_BASELINE |
| help |
| If enabled, the CPU generates a UsageFault exception when executing a |
| halfword or word access. |
| |
| endmenu |
| |
| # Implement the null pointer detection using either the Data Watchpoint and |
| # Trace Unit and the Debug Monitor Exception, or the Memory Protection Unit. |
| |
| choice NULL_POINTER_EXCEPTION_DETECTION |
| bool "Null-pointer exception" |
| # Disable this until https://github.com/zephyrproject-rtos/zephyr/issues/32984 is fixed |
| # default NULL_POINTER_EXCEPTION_DETECTION_DWT if TEST_ARM_CORTEX_M && !ARM_NONSECURE_FIRMWARE && CPU_CORTEX_M_HAS_DWT |
| default NULL_POINTER_EXCEPTION_DETECTION_MPU if TEST_ARM_CORTEX_M && !ARM_NONSECURE_FIRMWARE && ARM_MPU && !CPU_CORTEX_M_HAS_DWT |
| default NULL_POINTER_EXCEPTION_DETECTION_NONE |
| help |
| There are 2 implementations available, one based |
| on DWT and the other based on MPU. Use this choice |
| symbol to select one of the options. By default the |
| feature is disabled. In the test suite the feature |
| is enabled and the DWT-based solution is preferred. |
| |
| config NULL_POINTER_EXCEPTION_DETECTION_NONE |
| bool "No null pointer exception detection" |
| help |
| Null pointer exception detection feature is not |
| enabled. |
| |
| config NULL_POINTER_EXCEPTION_DETECTION_DWT |
| bool "Use DWT for null pointer exception detection" |
| depends on CPU_CORTEX_M_HAS_DWT |
| depends on !TRUSTED_EXECUTION_NONSECURE |
| select CORTEX_M_DWT |
| select CORTEX_M_NULL_POINTER_EXCEPTION |
| help |
| Null pointer dereference detection implemented |
| using the DWT unit functionality. |
| Notes: |
| - Not enabled for Non-Secure FW images, where |
| null-pointer dereferencing is likely caught as |
| a SecureFault. |
| - Requires DWT functionality in the Cortex-M SoC |
| implementation (1 comparator for ARMv7-M, 2 comparators |
| for ARMv8-M). |
| - Requires the Cortex-M core be in normal mode. |
| |
| config NULL_POINTER_EXCEPTION_DETECTION_MPU |
| bool "Use MPU for null pointer exception detection" |
| depends on !TRUSTED_EXECUTION_NONSECURE |
| depends on ARM_MPU |
| select CORTEX_M_NULL_POINTER_EXCEPTION |
| help |
| Null pointer dereference detection implemented |
| using MPU functionality. |
| Notes: |
| - Mutually exclusive to the DWT-based solution |
| - Not enabled for Non-Secure FW images, where |
| null-pointer dereferencing is likely caught as |
| a SecureFault. |
| - Requires MPU functionality to be present and |
| enabled. The implementation consumes 1 MPU region. |
| - In ARMv8-M, explicit null-pointer dereference |
| detection with MPU requires, additionally, that |
| the area: [0x0, |
| CORTEX_M_NULL_POINTER_EXCEPTION_PAGE_SIZE) |
| is not unmapped (covered by an MPU region already). |
| If it is unmapped null-pointer dereferencing may |
| still be indirectly detected (e.g. via a precise |
| Bus access fault), but this is not guaranteed. A |
| build-time message warns the user of this scenario. |
| |
| endchoice |
| |
| config CORTEX_M_NULL_POINTER_EXCEPTION |
| bool |
| help |
| Enable and use the null pointer exception option. |
| This is a debug feature in Cortex-M, allowing for |
| detecting null pointer dereferencing (raising a |
| CPU fault). Supporting the feature results in an |
| increased code footprint, determined by option |
| CORTEX_M_NULL_POINTER_EXCEPTION_PAGE_SIZE. |
| |
| Note: this hidden option is selected by the choice |
| symbols corresponding to the DWT-based or to the |
| MPU-based solution. |
| |
| if CORTEX_M_NULL_POINTER_EXCEPTION |
| |
| config CORTEX_M_NULL_POINTER_EXCEPTION_PAGE_SIZE |
| hex "Size of paged unmapped to implement null pointer detection" |
| default 0x400 |
| help |
| Size of the page reserved for detecting null pointer |
| dereferencing. Must be a power of two. A large value |
| offers enhanced detection performance to the cost of |
| wasting a large flash area that code may not use. |
| |
| endif # CORTEX_M_NULL_POINTER_EXCEPTION |
| |
| rsource "tz/Kconfig" |
| |
| endif # CPU_CORTEX_M |