Add hardfault log progmem flash backend

This commit is contained in:
Peter van der Perk
2023-01-04 12:52:01 -05:00
committed by Daniel Agar
parent ca9ae80b10
commit fa87375d0c
21 changed files with 1142 additions and 38 deletions
+56 -8
View File
@@ -54,12 +54,18 @@
#include <errno.h>
#include <debug.h>
#ifdef HAS_BBSRAM
#include <stm32_bbsram.h>
#endif
#include <systemlib/px4_macros.h>
#include <systemlib/hardfault_log.h>
#include <lib/version/version.h>
#ifdef HAS_PROGMEM
#include <px4_platform/progmem_dump.h>
#endif
#include "chip.h"
#if defined(CONSTRAINED_FLASH_NO_HELP)
@@ -224,7 +230,7 @@ static void identify(const char *caller)
/****************************************************************************
* hardfault_get_desc
****************************************************************************/
static int hardfault_get_desc(char *caller, struct bbsramd_s *desc, bool silent)
static int hardfault_get_desc(char *caller, dump_s *desc, bool silent)
{
int ret = -ENOENT;
int fd = open(HARDFAULT_PATH, O_RDONLY);
@@ -237,7 +243,7 @@ static int hardfault_get_desc(char *caller, struct bbsramd_s *desc, bool silent)
} else {
ret = -EIO;
int rv = ioctl(fd, PX4_BBSRAM_GETDESC_IOCTL, (unsigned long)((uintptr_t)desc));
int rv = ioctl(fd, PX4_HF_GETDESC_IOCTL, (unsigned long)((uintptr_t)desc));
if (rv >= 0) {
ret = fd;
@@ -251,6 +257,39 @@ static int hardfault_get_desc(char *caller, struct bbsramd_s *desc, bool silent)
return ret;
}
#if HAS_PROGMEM
/****************************************************************************
* hardfault_clear
****************************************************************************/
static int hardfault_clear(char *caller, bool silent)
{
int ret = -ENOENT;
int fd = open(HARDFAULT_PATH, O_RDONLY);
int value = 1;
if (fd < 0) {
if (!silent) {
identify(caller);
hfsyslog(LOG_INFO, "Failed to open Fault Log file to clear [%s] (%d)\n", HARDFAULT_PATH, fd);
}
} else {
ret = -EIO;
int rv = ioctl(fd, PROGMEM_DUMP_CLEAR_IOCTL, (unsigned long)((uintptr_t)&value));
if (rv >= 0) {
ret = fd;
} else {
identify(caller);
hfsyslog(LOG_INFO, "Failed to clear progmem sector (%d)\n", rv);
}
}
return ret;
}
#endif
/****************************************************************************
* write_stack_detail
****************************************************************************/
@@ -518,7 +557,7 @@ static int write_user_stack_info(int fdout, info_s *pi, char *buffer,
/****************************************************************************
* write_dump_info
****************************************************************************/
static int write_dump_info(int fdout, info_s *info, struct bbsramd_s *desc,
static int write_dump_info(int fdout, info_s *info, dump_s *desc,
char *buffer, unsigned int sz)
{
char fmtbuff[ TIME_FMT_LEN + 1];
@@ -859,7 +898,7 @@ static int hardfault_commit(char *caller)
{
int ret = -ENOENT;
int state = -1;
struct bbsramd_s desc;
dump_s desc;
char path[LOG_PATH_LEN + 1];
ret = hardfault_get_desc(caller, &desc, false);
@@ -889,7 +928,7 @@ static int hardfault_commit(char *caller)
if (fdout >= 0) {
identify(caller);
syslog(LOG_INFO, "Saving Fault Log file %s\n", path);
ret = hardfault_write(caller, fdout, HARDFAULT_FILE_FORMAT, true);
ret = hardfault_write(caller, fdout, HARDFAULT_FILE_FORMAT, false);
identify(caller);
hfsyslog(LOG_INFO, "Done saving Fault Log file\n");
@@ -916,6 +955,12 @@ static int hardfault_commit(char *caller)
}
}
#ifdef HAS_PROGMEM
// Clear flash sector to write new hardfault
hardfault_clear(caller, false);
#endif
ret = hardfault_rearm(caller);
close(fdout);
}
}
@@ -931,7 +976,7 @@ static int hardfault_commit(char *caller)
* hardfault_dowrite
****************************************************************************/
static int hardfault_dowrite(char *caller, int infd, int outfd,
struct bbsramd_s *desc, int format)
dump_s *desc, int format)
{
int ret = -ENOMEM;
char *line = zalloc(OUT_BUFFER_LEN);
@@ -1056,7 +1101,7 @@ __EXPORT int hardfault_rearm(char *caller)
__EXPORT int hardfault_check_status(char *caller)
{
int state = -1;
struct bbsramd_s desc;
dump_s desc;
int ret = hardfault_get_desc(caller, &desc, true);
if (ret < 0) {
@@ -1122,8 +1167,11 @@ __EXPORT int hardfault_increment_reboot(char *caller, bool reset)
if (!reset) {
if (read(fd, &count, sizeof(count)) != sizeof(count)) {
//Progmem could have an empty file hence we ignore this error
#ifndef HAS_PROGMEM
ret = -EIO;
close(fd);
#endif
} else {
lseek(fd, 0, SEEK_SET);
@@ -1155,7 +1203,7 @@ __EXPORT int hardfault_increment_reboot(char *caller, bool reset)
__EXPORT int hardfault_write(char *caller, int fd, int format, bool rearm)
{
struct bbsramd_s desc;
dump_s desc;
switch (format) {