diff --git a/core/embed/sys/task/inc/sys/systask.h b/core/embed/sys/task/inc/sys/systask.h index 85b9f2a7aa..61be22c958 100644 --- a/core/embed/sys/task/inc/sys/systask.h +++ b/core/embed/sys/task/inc/sys/systask.h @@ -44,6 +44,12 @@ typedef struct { uint32_t mmfar; // Address associated with the BusFault uint32_t bfar; +#if defined(__ARM_FEATURE_CMSE) + // Secure Fault Status Register + uint32_t sfsr; + // Address associated with the SecureFault + uint32_t sfar; +#endif // Stack pointer at the time of the fault // (MSP or PSP depending on the privilege level) uint32_t sp; diff --git a/core/embed/sys/task/stm32/systask.c b/core/embed/sys/task/stm32/systask.c index 666d07e1c8..4f97a26572 100644 --- a/core/embed/sys/task/stm32/systask.c +++ b/core/embed/sys/task/stm32/systask.c @@ -93,7 +93,7 @@ void systask_scheduler_init(systask_error_handler_t error_handler) { #if defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) // Enable SecureFault handler SCB->SHCSR |= SCB_SHCSR_SECUREFAULTENA_Msk; -#endif +#endif } systask_t* systask_active(void) { @@ -380,6 +380,10 @@ __attribute((used)) static void systask_exit_fault(bool privileged, pminfo->fault.mmfar = SCB->MMFAR; pminfo->fault.bfar = SCB->BFAR; pminfo->fault.hfsr = SCB->HFSR; +#if defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + pminfo->fault.sfsr = SAU->SFSR; + pminfo->fault.sfar = SAU->SFAR; +#endif } systask_kill(task);