| /* |
| * 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_ */ |