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

View File

@ -53,6 +53,7 @@
#include "up_internal.h"
#include <systemlib/hardfault_log.h>
#include "nvic.h"
#if defined(CONFIG_STM32F7_BBSRAM) && defined(CONFIG_STM32F7_SAVE_CRASHDUMP)
# define HAS_BBSRAM CONFIG_STM32F7_BBSRAM
@ -287,6 +288,16 @@ __EXPORT void board_crashdump(uintptr_t currentsp, FAR void *tcb, FAR const uint
pdump->info.pid = rtcb->pid;
pdump->info.fault_regs.cfsr = getreg32(NVIC_CFAULTS);
pdump->info.fault_regs.hfsr = getreg32(NVIC_HFAULTS);
pdump->info.fault_regs.dfsr = getreg32(NVIC_DFAULTS);
pdump->info.fault_regs.mmfsr = getreg32(NVIC_MEMMANAGE_ADDR);
pdump->info.fault_regs.bfsr = getreg32(NVIC_BFAULT_ADDR);
pdump->info.fault_regs.afsr = getreg32(NVIC_AFAULTS);
#if defined(CONFIG_ARCH_CORTEXM7)
pdump->info.fault_regs.abfsr = getreg32(NVIC_ABFSR);
#endif
pdump->info.flags |= eFaultRegPresent;
/* If current_regs is not NULL then we are in an interrupt context
* and the user context is in current_regs else we are running in

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

View File

@ -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;
}