zephyr/tests/arch/arm/arm_interrupt
Yong Cong Sin e54b27b967 arch: define `struct arch_esf` and deprecate `z_arch_esf_t`
Make `struct arch_esf` compulsory for all architectures by
declaring it in the `arch_interface.h` header.

After this commit, the named struct `z_arch_esf_t` is only used
internally to generate offsets, and is slated to be removed
from the `arch_interface.h` header in the future.

Signed-off-by: Yong Cong Sin <ycsin@meta.com>
2024-06-04 14:02:51 -05:00
..
src
CMakeLists.txt
README.txt
prj.conf
testcase.yaml

README.txt

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