@@ -39,6 +39,54 @@ extern volatile irq_offload_routine_t offload_routine;
3939 */
4040#define AIRCR_VECT_KEY_PERMIT_WRITE 0x05FAUL
4141
42+ /* Exception Return (EXC_RETURN) is provided in LR upon exception entry.
43+ * It is used to perform an exception return and to detect possible state
44+ * transition upon exception.
45+ */
46+
47+ /* Prefix. Indicates that this is an EXC_RETURN value.
48+ * This field reads as 0b11111111.
49+ */
50+ #define EXC_RETURN_INDICATOR_PREFIX (0xFF << 24)
51+ /* bit[0]: Exception Secure. The security domain the exception was taken to. */
52+ #define EXC_RETURN_EXCEPTION_SECURE_Pos 0
53+ #define EXC_RETURN_EXCEPTION_SECURE_Msk \
54+ BIT(EXC_RETURN_EXCEPTION_SECURE_Pos)
55+ #define EXC_RETURN_EXCEPTION_SECURE_Non_Secure 0
56+ #define EXC_RETURN_EXCEPTION_SECURE_Secure EXC_RETURN_EXCEPTION_SECURE_Msk
57+ /* bit[2]: Stack Pointer selection. */
58+ #define EXC_RETURN_SPSEL_Pos 2
59+ #define EXC_RETURN_SPSEL_Msk BIT(EXC_RETURN_SPSEL_Pos)
60+ #define EXC_RETURN_SPSEL_MAIN 0
61+ #define EXC_RETURN_SPSEL_PROCESS EXC_RETURN_SPSEL_Msk
62+ /* bit[3]: Mode. Indicates the Mode that was stacked from. */
63+ #define EXC_RETURN_MODE_Pos 3
64+ #define EXC_RETURN_MODE_Msk BIT(EXC_RETURN_MODE_Pos)
65+ #define EXC_RETURN_MODE_HANDLER 0
66+ #define EXC_RETURN_MODE_THREAD EXC_RETURN_MODE_Msk
67+ /* bit[4]: Stack frame type. Indicates whether the stack frame is a standard
68+ * integer only stack frame or an extended floating-point stack frame.
69+ */
70+ #define EXC_RETURN_STACK_FRAME_TYPE_Pos 4
71+ #define EXC_RETURN_STACK_FRAME_TYPE_Msk BIT(EXC_RETURN_STACK_FRAME_TYPE_Pos)
72+ #define EXC_RETURN_STACK_FRAME_TYPE_EXTENDED 0
73+ #define EXC_RETURN_STACK_FRAME_TYPE_STANDARD EXC_RETURN_STACK_FRAME_TYPE_Msk
74+ /* bit[5]: Default callee register stacking. Indicates whether the default
75+ * stacking rules apply, or whether the callee registers are already on the
76+ * stack.
77+ */
78+ #define EXC_RETURN_CALLEE_STACK_Pos 5
79+ #define EXC_RETURN_CALLEE_STACK_Msk BIT(EXC_RETURN_CALLEE_STACK_Pos)
80+ #define EXC_RETURN_CALLEE_STACK_SKIPPED 0
81+ #define EXC_RETURN_CALLEE_STACK_DEFAULT EXC_RETURN_CALLEE_STACK_Msk
82+ /* bit[6]: Secure or Non-secure stack. Indicates whether a Secure or
83+ * Non-secure stack is used to restore stack frame on exception return.
84+ */
85+ #define EXC_RETURN_RETURN_STACK_Pos 6
86+ #define EXC_RETURN_RETURN_STACK_Msk BIT(EXC_RETURN_RETURN_STACK_Pos)
87+ #define EXC_RETURN_RETURN_STACK_Non_Secure 0
88+ #define EXC_RETURN_RETURN_STACK_Secure EXC_RETURN_RETURN_STACK_Msk
89+
4290/*
4391 * The current executing vector is found in the IPSR register. All
4492 * IRQs and system exceptions are considered as interrupt context.
@@ -184,6 +232,43 @@ static ALWAYS_INLINE void z_arm_clear_faults(void)
184232#endif /* CONFIG_ARMV6_M_ARMV8_M_BASELINE */
185233}
186234
235+ /**
236+ * @brief Set z_arm_coredump_fault_sp to stack pointer value expected by GDB
237+ *
238+ * @param esf exception frame
239+ * @param exc_return EXC_RETURN value present in LR after exception entry.
240+ */
241+ static ALWAYS_INLINE void z_arm_set_fault_sp (const struct arch_esf * esf , uint32_t exc_return )
242+ {
243+ #ifdef CONFIG_DEBUG_COREDUMP
244+ z_arm_coredump_fault_sp = POINTER_TO_UINT (esf );
245+ #if defined(CONFIG_ARMV7_M_ARMV8_M_MAINLINE ) || defined(CONFIG_ARMV6_M_ARMV8_M_BASELINE )
246+ /* Gdb expects a stack pointer that does not include the exception stack frame in order to
247+ * unwind. So adjust the stack pointer accordingly.
248+ */
249+ z_arm_coredump_fault_sp += sizeof (esf -> basic );
250+
251+ #if defined(CONFIG_FPU ) && defined(CONFIG_FPU_SHARING )
252+ /* Assess whether thread had been using the FP registers and add size of additional
253+ * registers if necessary
254+ */
255+ if ((exc_return & EXC_RETURN_STACK_FRAME_TYPE_STANDARD ) ==
256+ EXC_RETURN_STACK_FRAME_TYPE_EXTENDED ) {
257+ z_arm_coredump_fault_sp += sizeof (esf -> fpu );
258+ }
259+ #endif /* CONFIG_FPU && CONFIG_FPU_SHARING */
260+
261+ #ifndef CONFIG_ARMV8_M_MAINLINE
262+ if ((esf -> basic .xpsr & SCB_CCR_STKALIGN_Msk ) == SCB_CCR_STKALIGN_Msk ) {
263+ /* Adjust stack alignment after PSR bit[9] detected */
264+ z_arm_coredump_fault_sp |= 0x4 ;
265+ }
266+ #endif /* !CONFIG_ARMV8_M_MAINLINE */
267+
268+ #endif /* CONFIG_ARMV7_M_ARMV8_M_MAINLINE || CONFIG_ARMV6_M_ARMV8_M_BASELINE */
269+ #endif /* CONFIG_DEBUG_COREDUMP */
270+ }
271+
187272/**
188273 * @brief Assess whether a debug monitor event should be treated as an error
189274 *
0 commit comments