mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-06-01 02:55:07 +08:00
hardfault_log:Add Fault Status registers
This commit is contained in:
@@ -53,6 +53,7 @@
|
|||||||
|
|
||||||
#include "up_internal.h"
|
#include "up_internal.h"
|
||||||
#include <systemlib/hardfault_log.h>
|
#include <systemlib/hardfault_log.h>
|
||||||
|
#include "nvic.h"
|
||||||
|
|
||||||
#if defined(CONFIG_STM32F7_BBSRAM) && defined(CONFIG_STM32F7_SAVE_CRASHDUMP)
|
#if defined(CONFIG_STM32F7_BBSRAM) && defined(CONFIG_STM32F7_SAVE_CRASHDUMP)
|
||||||
# define HAS_BBSRAM CONFIG_STM32F7_BBSRAM
|
# 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.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
|
/* 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
|
* and the user context is in current_regs else we are running in
|
||||||
|
|||||||
@@ -229,17 +229,31 @@ typedef enum {
|
|||||||
eRegsPresent = 0x01,
|
eRegsPresent = 0x01,
|
||||||
eUserStackPresent = 0x02,
|
eUserStackPresent = 0x02,
|
||||||
eIntStackPresent = 0x04,
|
eIntStackPresent = 0x04,
|
||||||
|
eFaultRegPresent = 0x08,
|
||||||
eInvalidUserStackPtr = 0x20,
|
eInvalidUserStackPtr = 0x20,
|
||||||
eInvalidIntStackPrt = 0x40,
|
eInvalidIntStackPrt = 0x40,
|
||||||
} fault_flags_t;
|
} 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 {
|
typedef struct {
|
||||||
fault_flags_t flags; /* What is in the dump */
|
fault_flags_t flags; /* What is in the dump */
|
||||||
uintptr_t current_regs; /* Used to validate the dump */
|
uintptr_t current_regs; /* Used to validate the dump */
|
||||||
int lineno; /* __LINE__ to up_assert */
|
int lineno; /* __LINE__ to up_assert */
|
||||||
int pid; /* Process ID */
|
int pid; /* Process ID */
|
||||||
uint32_t regs[XCPTCONTEXT_REGS]; /* Interrupt register save
|
uint32_t regs[XCPTCONTEXT_REGS]; /* Interrupt register save area */
|
||||||
* area */
|
fault_regs_s fault_regs; /* NVIC status */
|
||||||
stack_t stacks; /* Stack info */
|
stack_t stacks; /* Stack info */
|
||||||
#if CONFIG_TASK_NAME_SIZE > 0
|
#if CONFIG_TASK_NAME_SIZE > 0
|
||||||
char name[CONFIG_TASK_NAME_SIZE + 1]; /* Task name (with NULL
|
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;
|
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
|
* 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;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user