Title: Test to verify code fault handling in ISR execution context
and the behavior of irq_lock() and irq_unlock() when invoked
from User Mode. An additional test case verifies that null
pointer dereferencing attempts are detected and interpreted
as CPU faults. Tests supported only on Cortex-M architecture.
Description:
The first test verifies that we can handle system fault conditions
while running in handler mode (i.e. in an ISR). Only for ARM
Cortex-M targets.
The test also verifies
- the behavior of the spurious interrupt handler, as well as the
ARM spurious exception handler.
- the ability of the Cortex-M fault handling mechanism to detect
stack overflow errors explicitly due to exception frame context
stacking (that is when the processor reports only the Stacking
Error and not an additional Data Access Violation error with a
valid corresponding MMFAR address value).
The second test verifies that threads in user mode, despite being able to call
the irq_lock() and irq_unlock() functions without triggering a CPU fault,
they won't be able to read or modify the current IRQ locking status.
An additional test case verifies that null pointer dereferencing (read)
attempts are caught and successfully trigger a CPU exception in the case
the read is attempted by privileged code.
---------------------------------------------------------------------------
Building and Running Project:
This project outputs to the console. It can be built and executed on QEMU as
follows:
ninja/make run
---------------------------------------------------------------------------
Troubleshooting:
Problems caused by out-dated project information can be addressed by
issuing one of the following commands then rebuilding the project:
ninja/make clean # discard results of previous builds
# but keep existing configuration info
or
ninja/make pristine # discard results of previous builds
# and restore pre-defined configuration info
---------------------------------------------------------------------------
Sample Output:
*** Booting Zephyr OS build zephyr-v2.4.0-3490-ga44a42e3f4d5 ***
Running test suite arm_interrupt
===================================================================
START - test_arm_null_pointer_exception
E: ***** Debug monitor exception *****
Null-pointer exception?
E: r0/a1: 0x20000000 r1/a2: 0x00000000 r2/a3: 0x20001e40
E: r3/a4: 0x00003109 r12/ip: 0xfabf33ff r14/lr: 0x00003e7f
E: xpsr: 0x41000000
E: Faulting instruction address (r15/pc): 0x00000f34
E: >>> ZEPHYR FATAL ERROR 0: CPU exception on CPU 0
E: Current thread: 0x20000148 (unknown)
Caught system error -- reason 0
PASS - test_arm_null_pointer_exception
===================================================================
START - test_arm_interrupt
Available IRQ line: 68
E: >>> ZEPHYR FATAL ERROR 1: Unhandled interrupt on CPU 0
E: Current thread: 0x20000148 (unknown)
Caught system error -- reason 1
E: r0/a1: 0x00000003 r1/a2: 0x200020b8 r2/a3: 0x00000003
E: r3/a4: 0x20001e40 r12/ip: 0x00000000 r14/lr: 0x00002f47
E: xpsr: 0x61000054
E: Faulting instruction address (r15/pc): 0x000009a6
E: >>> ZEPHYR FATAL ERROR 3: Kernel oops on CPU 0
E: Fault during interrupt handling
E: Current thread: 0x20000148 (unknown)
Caught system error -- reason 3
E: r0/a1: 0x00000004 r1/a2: 0x200020b8 r2/a3: 0x00000004
E: r3/a4: 0x20001e40 r12/ip: 0x00000000 r14/lr: 0x00002f47
E: xpsr: 0x61000054
E: Faulting instruction address (r15/pc): 0x000009c4
E: >>> ZEPHYR FATAL ERROR 4: Kernel panic on CPU 0
E: Fault during interrupt handling
E: Current thread: 0x20000148 (unknown)
Caught system error -- reason 4
ASSERTION FAIL [0] @ ../src/arm_interrupt.c:207
Intentional assert
E: r0/a1: 0x00000004 r1/a2: 0x000000cf r2/a3: 0x00000000
E: r3/a4: 0x00000054 r12/ip: 0x00000000 r14/lr: 0x00002f47
E: xpsr: 0x41000054
E: Faulting instruction address (r15/pc): 0x0000cab0
E: >>> ZEPHYR FATAL ERROR 4: Kernel panic on CPU 0
E: Fault during interrupt handling
E: Current thread: 0x20000148 (unknown)
Caught system error -- reason 4
ASSERTION FAIL [0] @ WEST_TOPDIR/zephyr/drivers/timer/sys_clock_init.c:23
E: ***** HARD FAULT *****
E: Fault escalation (see below)
E: r0/a1: 0x00000004 r1/a2: 0x00000017 r2/a3: 0x00000000
E: r3/a4: 0x0000000f r12/ip: 0x00000000 r14/lr: 0xfffffff1
E: xpsr: 0x4100000f
E: Faulting instruction address (r15/pc): 0x0000cab0
E: >>> ZEPHYR FATAL ERROR 0: CPU exception on CPU 0
E: Fault during interrupt handling
E: Current thread: 0x20000148 (unknown)
Caught system error -- reason 0
E: ***** USAGE FAULT *****
E: Stack overflow (context area not valid)
E: r0/a1: 0xdde8d9e7 r1/a2: 0x5510538d r2/a3: 0x00000d74
E: r3/a4: 0x01000000 r12/ip: 0xdfcdaf37 r14/lr: 0xe4698510
E: xpsr: 0x53445600
E: Faulting instruction address (r15/pc): 0xf9cfef45
E: >>> ZEPHYR FATAL ERROR 2: Stack overflow on CPU 0
E: Current thread: 0x20000148 (unknown)
Caught system error -- reason 2
PASS - test_arm_interrupt
===================================================================
START - test_arm_esf_collection
Testing ESF Reporting
E: ***** USAGE FAULT *****
E: Attempt to execute undefined instruction
E: r0/a1: 0x00000000 r1/a2: 0x00000001 r2/a3: 0x00000002
E: r3/a4: 0x00000003 r12/ip: 0x0000000c r14/lr: 0x0000000f
E: xpsr: 0x01000000
E: Faulting instruction address (r15/pc): 0x0000bec0
E: >>> ZEPHYR FATAL ERROR 0: CPU exception on CPU 0
E: Current thread: 0x20000080 (unknown)
Caught system error -- reason 0
PASS - test_arm_esf_collection
===================================================================
START - test_arm_user_interrupt
PASS - test_arm_user_interrupt
===================================================================
Test suite arm_interrupt succeeded
===================================================================
PROJECT EXECUTION SUCCESSFUL