1Title: Test to verify code fault handling in ISR execution context 2 and the behavior of irq_lock() and irq_unlock() when invoked 3 from User Mode. An additional test case verifies that null 4 pointer dereferencing attempts are detected and interpreted 5 as CPU faults. Tests supported only on Cortex-M architecture. 6 7Description: 8 9The first test verifies that we can handle system fault conditions 10while running in handler mode (i.e. in an ISR). Only for ARM 11Cortex-M targets. 12 13The test also verifies 14- the behavior of the spurious interrupt handler, as well as the 15 ARM spurious exception handler. 16- the ability of the Cortex-M fault handling mechanism to detect 17 stack overflow errors explicitly due to exception frame context 18 stacking (that is when the processor reports only the Stacking 19 Error and not an additional Data Access Violation error with a 20 valid corresponding MMFAR address value). 21 22The second test verifies that threads in user mode, despite being able to call 23the irq_lock() and irq_unlock() functions without triggering a CPU fault, 24they won't be able to read or modify the current IRQ locking status. 25 26An additional test case verifies that null pointer dereferencing (read) 27attempts are caught and successfully trigger a CPU exception in the case 28the read is attempted by privileged code. 29 30--------------------------------------------------------------------------- 31 32Building and Running Project: 33 34This project outputs to the console. It can be built and executed on QEMU as 35follows: 36 37 ninja/make run 38 39--------------------------------------------------------------------------- 40 41Troubleshooting: 42 43Problems caused by out-dated project information can be addressed by 44issuing one of the following commands then rebuilding the project: 45 46 ninja/make clean # discard results of previous builds 47 # but keep existing configuration info 48or 49 ninja/make pristine # discard results of previous builds 50 # and restore pre-defined configuration info 51 52--------------------------------------------------------------------------- 53 54Sample Output: 55*** Booting Zephyr OS build zephyr-v2.4.0-3490-ga44a42e3f4d5 *** 56Running test suite arm_interrupt 57=================================================================== 58START - test_arm_null_pointer_exception 59E: ***** Debug monitor exception ***** 60Null-pointer exception? 61E: r0/a1: 0x20000000 r1/a2: 0x00000000 r2/a3: 0x20001e40 62E: r3/a4: 0x00003109 r12/ip: 0xfabf33ff r14/lr: 0x00003e7f 63E: xpsr: 0x41000000 64E: Faulting instruction address (r15/pc): 0x00000f34 65E: >>> ZEPHYR FATAL ERROR 0: CPU exception on CPU 0 66E: Current thread: 0x20000148 (unknown) 67Caught system error -- reason 0 68 PASS - test_arm_null_pointer_exception 69=================================================================== 70START - test_arm_interrupt 71Available IRQ line: 68 72E: >>> ZEPHYR FATAL ERROR 1: Unhandled interrupt on CPU 0 73E: Current thread: 0x20000148 (unknown) 74Caught system error -- reason 1 75E: r0/a1: 0x00000003 r1/a2: 0x200020b8 r2/a3: 0x00000003 76E: r3/a4: 0x20001e40 r12/ip: 0x00000000 r14/lr: 0x00002f47 77E: xpsr: 0x61000054 78E: Faulting instruction address (r15/pc): 0x000009a6 79E: >>> ZEPHYR FATAL ERROR 3: Kernel oops on CPU 0 80E: Fault during interrupt handling 81 82E: Current thread: 0x20000148 (unknown) 83Caught system error -- reason 3 84E: r0/a1: 0x00000004 r1/a2: 0x200020b8 r2/a3: 0x00000004 85E: r3/a4: 0x20001e40 r12/ip: 0x00000000 r14/lr: 0x00002f47 86E: xpsr: 0x61000054 87E: Faulting instruction address (r15/pc): 0x000009c4 88E: >>> ZEPHYR FATAL ERROR 4: Kernel panic on CPU 0 89E: Fault during interrupt handling 90 91E: Current thread: 0x20000148 (unknown) 92Caught system error -- reason 4 93ASSERTION FAIL [0] @ ../src/arm_interrupt.c:207 94 Intentional assert 95 96E: r0/a1: 0x00000004 r1/a2: 0x000000cf r2/a3: 0x00000000 97E: r3/a4: 0x00000054 r12/ip: 0x00000000 r14/lr: 0x00002f47 98E: xpsr: 0x41000054 99E: Faulting instruction address (r15/pc): 0x0000cab0 100E: >>> ZEPHYR FATAL ERROR 4: Kernel panic on CPU 0 101E: Fault during interrupt handling 102 103E: Current thread: 0x20000148 (unknown) 104Caught system error -- reason 4 105ASSERTION FAIL [0] @ WEST_TOPDIR/zephyr/drivers/timer/sys_clock_init.c:23 106E: ***** HARD FAULT ***** 107E: Fault escalation (see below) 108E: r0/a1: 0x00000004 r1/a2: 0x00000017 r2/a3: 0x00000000 109E: r3/a4: 0x0000000f r12/ip: 0x00000000 r14/lr: 0xfffffff1 110E: xpsr: 0x4100000f 111E: Faulting instruction address (r15/pc): 0x0000cab0 112E: >>> ZEPHYR FATAL ERROR 0: CPU exception on CPU 0 113E: Fault during interrupt handling 114 115E: Current thread: 0x20000148 (unknown) 116Caught system error -- reason 0 117E: ***** USAGE FAULT ***** 118E: Stack overflow (context area not valid) 119E: r0/a1: 0xdde8d9e7 r1/a2: 0x5510538d r2/a3: 0x00000d74 120E: r3/a4: 0x01000000 r12/ip: 0xdfcdaf37 r14/lr: 0xe4698510 121E: xpsr: 0x53445600 122E: Faulting instruction address (r15/pc): 0xf9cfef45 123E: >>> ZEPHYR FATAL ERROR 2: Stack overflow on CPU 0 124E: Current thread: 0x20000148 (unknown) 125Caught system error -- reason 2 126 PASS - test_arm_interrupt 127=================================================================== 128START - test_arm_esf_collection 129Testing ESF Reporting 130E: ***** USAGE FAULT ***** 131E: Attempt to execute undefined instruction 132E: r0/a1: 0x00000000 r1/a2: 0x00000001 r2/a3: 0x00000002 133E: r3/a4: 0x00000003 r12/ip: 0x0000000c r14/lr: 0x0000000f 134E: xpsr: 0x01000000 135E: Faulting instruction address (r15/pc): 0x0000bec0 136E: >>> ZEPHYR FATAL ERROR 0: CPU exception on CPU 0 137E: Current thread: 0x20000080 (unknown) 138Caught system error -- reason 0 139 PASS - test_arm_esf_collection 140=================================================================== 141START - test_arm_user_interrupt 142 PASS - test_arm_user_interrupt 143=================================================================== 144Test suite arm_interrupt succeeded 145=================================================================== 146PROJECT EXECUTION SUCCESSFUL 147