mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-06-28 02:42:34 +00:00
feat(core): add details for fault and fatal error RSOD
[no changelog]
This commit is contained in:
parent
e8a5d11e5d
commit
3d2a9c93a9
@ -20,6 +20,7 @@
|
|||||||
#include <trezor_bsp.h>
|
#include <trezor_bsp.h>
|
||||||
#include <trezor_rtl.h>
|
#include <trezor_rtl.h>
|
||||||
|
|
||||||
|
#include <rtl/mini_printf.h>
|
||||||
#include <sys/bootargs.h>
|
#include <sys/bootargs.h>
|
||||||
#include <sys/bootutils.h>
|
#include <sys/bootutils.h>
|
||||||
#include <sys/linker_utils.h>
|
#include <sys/linker_utils.h>
|
||||||
@ -154,41 +155,59 @@ __attribute((naked, noreturn, no_stack_protector)) void system_emergency_rescue(
|
|||||||
|
|
||||||
#ifdef STM32U5
|
#ifdef STM32U5
|
||||||
const char* system_fault_message(const system_fault_t* fault) {
|
const char* system_fault_message(const system_fault_t* fault) {
|
||||||
|
static char message[48] = {0};
|
||||||
|
const char* fault_type = "FAULT";
|
||||||
switch (fault->irqn) {
|
switch (fault->irqn) {
|
||||||
case HardFault_IRQn:
|
case HardFault_IRQn:
|
||||||
return "(HF)";
|
fault_type = "HF";
|
||||||
|
break;
|
||||||
case MemoryManagement_IRQn:
|
case MemoryManagement_IRQn:
|
||||||
return "(MM)";
|
fault_type = "MM";
|
||||||
|
break;
|
||||||
case BusFault_IRQn:
|
case BusFault_IRQn:
|
||||||
return "(BF)";
|
fault_type = "BF";
|
||||||
|
break;
|
||||||
case UsageFault_IRQn:
|
case UsageFault_IRQn:
|
||||||
return (fault->cfsr & SCB_CFSR_STKOF_Msk) ? "(SO)" : "(UF)";
|
fault_type = (fault->cfsr & SCB_CFSR_STKOF_Msk) ? "SO" : "UF";
|
||||||
|
break;
|
||||||
case SecureFault_IRQn:
|
case SecureFault_IRQn:
|
||||||
return "(SF)";
|
fault_type = "SF";
|
||||||
|
break;
|
||||||
case GTZC_IRQn:
|
case GTZC_IRQn:
|
||||||
return "(IA)";
|
fault_type = "IA";
|
||||||
|
break;
|
||||||
case NonMaskableInt_IRQn:
|
case NonMaskableInt_IRQn:
|
||||||
return "(CS)";
|
fault_type = "CS";
|
||||||
default:
|
break;
|
||||||
return "(FAULT)";
|
|
||||||
}
|
}
|
||||||
|
mini_snprintf(message, sizeof(message), "%s @ 0x%08X", fault_type,
|
||||||
|
(unsigned int)fault->pc);
|
||||||
|
return message;
|
||||||
}
|
}
|
||||||
#else // STM32U5
|
#else // STM32U5
|
||||||
const char* system_fault_message(const system_fault_t* fault) {
|
const char* system_fault_message(const system_fault_t* fault) {
|
||||||
|
static char message[48] = {0};
|
||||||
|
const char* fault_type = "FAULT";
|
||||||
switch (fault->irqn) {
|
switch (fault->irqn) {
|
||||||
case HardFault_IRQn:
|
case HardFault_IRQn:
|
||||||
return "(HF)";
|
fault_type = "HF";
|
||||||
|
break;
|
||||||
case MemoryManagement_IRQn:
|
case MemoryManagement_IRQn:
|
||||||
return (fault->sp < fault->sp_lim) ? "(SO)" : "(MM)";
|
fault_type = (fault->sp < fault->sp_lim) ? "SO" : "MM";
|
||||||
|
break;
|
||||||
case BusFault_IRQn:
|
case BusFault_IRQn:
|
||||||
return "(BF)";
|
fault_type = "BF";
|
||||||
|
break;
|
||||||
case UsageFault_IRQn:
|
case UsageFault_IRQn:
|
||||||
return "(UF)";
|
fault_type = "UF";
|
||||||
|
break;
|
||||||
case NonMaskableInt_IRQn:
|
case NonMaskableInt_IRQn:
|
||||||
return "(CS)";
|
fault_type = "CS";
|
||||||
default:
|
break;
|
||||||
return "(FAULT)";
|
|
||||||
}
|
}
|
||||||
|
mini_snprintf(message, sizeof(message), "%s @ 0x%08X", fault_type,
|
||||||
|
(unsigned int)fault->pc);
|
||||||
|
return message;
|
||||||
}
|
}
|
||||||
#endif // STM32U5
|
#endif // STM32U5
|
||||||
|
|
||||||
|
@ -142,8 +142,11 @@ void rsod_gui(const systask_postmortem_t* pminfo) {
|
|||||||
if (message[0] == '\0') {
|
if (message[0] == '\0') {
|
||||||
mini_snprintf(message_buf, sizeof(message_buf), "%s:%u",
|
mini_snprintf(message_buf, sizeof(message_buf), "%s:%u",
|
||||||
pminfo->fatal.file, (unsigned int)pminfo->fatal.line);
|
pminfo->fatal.file, (unsigned int)pminfo->fatal.line);
|
||||||
message = message_buf;
|
} else {
|
||||||
|
mini_snprintf(message_buf, sizeof(message_buf), "%s\n%s:%u", message,
|
||||||
|
pminfo->fatal.file, (unsigned int)pminfo->fatal.line);
|
||||||
}
|
}
|
||||||
|
message = message_buf;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TASK_TERM_REASON_FAULT:
|
case TASK_TERM_REASON_FAULT:
|
||||||
|
Loading…
Reference in New Issue
Block a user