145 lines
3.0 KiB
C
145 lines
3.0 KiB
C
/*
|
|
* Copyright (c) 2020 Intel Corporation.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#ifndef ZEPHYR_INCLUDE_DEBUG_COREDUMP_H_
|
|
#define ZEPHYR_INCLUDE_DEBUG_COREDUMP_H_
|
|
|
|
#ifdef CONFIG_DEBUG_COREDUMP
|
|
|
|
#include <toolchain.h>
|
|
#include <arch/cpu.h>
|
|
#include <sys/byteorder.h>
|
|
|
|
#define Z_COREDUMP_HDR_VER 1
|
|
|
|
#define Z_COREDUMP_ARCH_HDR_ID 'A'
|
|
|
|
#define Z_COREDUMP_MEM_HDR_ID 'M'
|
|
#define Z_COREDUMP_MEM_HDR_VER 1
|
|
|
|
/* Target code */
|
|
enum z_coredump_tgt_code {
|
|
COREDUMP_TGT_UNKNOWN = 0,
|
|
COREDUMP_TGT_X86,
|
|
COREDUMP_TGT_X86_64,
|
|
COREDUMP_TGT_ARM_CORTEX_M,
|
|
};
|
|
|
|
/* Coredump header */
|
|
struct z_coredump_hdr_t {
|
|
/* 'Z', 'E' */
|
|
char id[2];
|
|
|
|
/* Header version */
|
|
uint16_t hdr_version;
|
|
|
|
/* Target code */
|
|
uint16_t tgt_code;
|
|
|
|
/* Pointer size in Log2 */
|
|
uint8_t ptr_size_bits;
|
|
|
|
uint8_t flag;
|
|
|
|
/* Coredump Reason given */
|
|
unsigned int reason;
|
|
} __packed;
|
|
|
|
/* Architecture-specific block header */
|
|
struct z_coredump_arch_hdr_t {
|
|
/* Z_COREDUMP_ARCH_HDR_ID */
|
|
char id;
|
|
|
|
/* Header version */
|
|
uint16_t hdr_version;
|
|
|
|
/* Number of bytes in this block (excluding header) */
|
|
uint16_t num_bytes;
|
|
} __packed;
|
|
|
|
/* Memory block header */
|
|
struct z_coredump_mem_hdr_t {
|
|
/* Z_COREDUMP_MEM_HDR_ID */
|
|
char id;
|
|
|
|
/* Header version */
|
|
uint16_t hdr_version;
|
|
|
|
/* Address of start of memory region */
|
|
uintptr_t start;
|
|
|
|
/* Address of end of memory region */
|
|
uintptr_t end;
|
|
} __packed;
|
|
|
|
void z_coredump(unsigned int reason, const z_arch_esf_t *esf,
|
|
struct k_thread *thread);
|
|
void z_coredump_memory_dump(uintptr_t start_addr, uintptr_t end_addr);
|
|
int z_coredump_buffer_output(uint8_t *buf, size_t buflen);
|
|
|
|
#else
|
|
|
|
void z_coredump(unsigned int reason, const z_arch_esf_t *esf,
|
|
struct k_thread *thread)
|
|
{
|
|
}
|
|
|
|
void z_coredump_memory_dump(uintptr_t start_addr, uintptr_t end_addr)
|
|
{
|
|
}
|
|
|
|
int z_coredump_buffer_output(uint8_t *buf, size_t buflen)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
#endif /* CONFIG_DEBUG_COREDUMP */
|
|
|
|
/**
|
|
* @defgroup coredump_apis Coredump APIs
|
|
* @brief Coredump APIs
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* @fn void z_coredump(unsigned int reason, const z_arch_esf_t *esf, struct k_thread *thread);
|
|
* @brief Perform coredump.
|
|
*
|
|
* Normally, this is called inside z_fatal_error() to generate coredump
|
|
* when a fatal error is encountered. This can also be called on demand
|
|
* whenever a coredump is desired.
|
|
*
|
|
* @param reason Reason for the fatal error
|
|
* @param esf Exception context
|
|
* @param thread Thread information to dump
|
|
*/
|
|
|
|
/**
|
|
* @fn void z_coredump_memory_dump(uintptr_t start_addr, uintptr_t end_addr);
|
|
* @brief Dump memory region
|
|
*
|
|
* @param start_addr Start address of memory region to be dumped
|
|
* @param emd_addr End address of memory region to be dumped
|
|
*/
|
|
|
|
/**
|
|
* @fn int z_coredump_buffer_output(uint8_t *buf, size_t buflen);
|
|
* @brief Output the buffer via coredump
|
|
*
|
|
* This outputs the buffer of byte array to the coredump backend.
|
|
* For example, this can be called to output the coredump section
|
|
* containing registers, or a section for memory dump.
|
|
*
|
|
* @param buf Buffer to be send to coredump output
|
|
* @param buflen Buffer length
|
|
*/
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
#endif /* ZEPHYR_INCLUDE_DEBUG_COREDUMP_H_ */
|