hardfault_log:Add Fault Status registers

This commit is contained in:
David Sidrane
2020-09-02 13:33:50 -07:00
committed by Beat Küng
parent bf41574b1d
commit 7f91e41f67
3 changed files with 61 additions and 2 deletions
+16 -2
View File
@@ -229,17 +229,31 @@ typedef enum {
eRegsPresent = 0x01,
eUserStackPresent = 0x02,
eIntStackPresent = 0x04,
eFaultRegPresent = 0x08,
eInvalidUserStackPtr = 0x20,
eInvalidIntStackPrt = 0x40,
} fault_flags_t;
typedef struct {
uint32_t cfsr; /* 0x0d28 Configurable fault status register */
uint32_t hfsr; /* 0x0d2c Hard fault status register */
uint32_t dfsr; /* 0x0d30 Debug fault status register */
uint32_t mmfsr; /* 0x0d34 Mem manage address register */
uint32_t bfsr; /* 0x0d38 Bus fault address register */
uint32_t afsr; /* 0x0d3c Auxiliary fault status register */
#if defined(CONFIG_ARCH_CORTEXM7)
uint32_t abfsr; /* 0x0fa8 Auxiliary Bus Fault Status Register */
#endif
} fault_regs_s;
typedef struct {
fault_flags_t flags; /* What is in the dump */
uintptr_t current_regs; /* Used to validate the dump */
int lineno; /* __LINE__ to up_assert */
int pid; /* Process ID */
uint32_t regs[XCPTCONTEXT_REGS]; /* Interrupt register save
* area */
uint32_t regs[XCPTCONTEXT_REGS]; /* Interrupt register save area */
fault_regs_s fault_regs; /* NVIC status */
stack_t stacks; /* Stack info */
#if CONFIG_TASK_NAME_SIZE > 0
char name[CONFIG_TASK_NAME_SIZE + 1]; /* Task name (with NULL
@@ -392,6 +392,31 @@ static int write_registers(uint32_t regs[], char *buffer, int max, int fd)
return OK;
}
/****************************************************************************
* write_registers
****************************************************************************/
static int write_fault_registers(fault_regs_s *fault_regs, char *buffer, int max, int fd)
{
#if defined(CONFIG_ARCH_CORTEXM7)
const char fmt[] = " cfsr:0x%08x hfsr:0x%08x dfsr:0x%08x mmfsr:0x%08x bfsr:0x%08x afsr:0x%08x abfsr:0x%08x \n";
#else
const char fmt[] = " cfsr:0x%08x hfsr:0x%08x dfsr:0x%08x mmfsr:0x%08x bfsr:0x%08x afsr:0x%08x\n";
#endif
int n = snprintf(buffer, max, fmt,
fault_regs->cfsr, fault_regs->hfsr, fault_regs->dfsr,
#if defined(CONFIG_ARCH_CORTEXM7)
fault_regs->mmfsr, fault_regs->bfsr, fault_regs->afsr, fault_regs->abfsr);
#else
fault_regs->mmfsr, fault_regs->bfsr, fault_regs->afsr);
#endif
if (n != write(fd, buffer, n)) {
return -EIO;
}
return OK;
}
/****************************************************************************
* write_registers_info
****************************************************************************/
@@ -408,6 +433,15 @@ static int write_registers_info(int fdout, info_s *pi, char *buffer, int sz)
}
}
if (pi->flags & eFaultRegPresent) {
ret = -EIO;
int n = snprintf(buffer, sz, " Fault status registers: from NVIC\n");
if (n == write(fdout, buffer, n)) {
ret = write_fault_registers(&pi->fault_regs, buffer, sz, fdout);
}
}
return ret;
}