| 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 |