83 lines
1.7 KiB
C
83 lines
1.7 KiB
C
/*
|
|
* Copyright (c) 2020 Intel Corporation.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <string.h>
|
|
#include <zephyr/debug/coredump.h>
|
|
|
|
#define ARCH_HDR_VER 1
|
|
|
|
struct x86_arch_block {
|
|
uint32_t vector;
|
|
uint32_t code;
|
|
|
|
struct {
|
|
uint32_t eax;
|
|
uint32_t ecx;
|
|
uint32_t edx;
|
|
uint32_t ebx;
|
|
uint32_t esp;
|
|
uint32_t ebp;
|
|
uint32_t esi;
|
|
uint32_t edi;
|
|
uint32_t eip;
|
|
uint32_t eflags;
|
|
uint32_t cs;
|
|
} r;
|
|
} __packed;
|
|
|
|
/*
|
|
* This might be too large for stack space if defined
|
|
* inside function. So do it here.
|
|
*/
|
|
static struct x86_arch_block arch_blk;
|
|
|
|
void arch_coredump_info_dump(const z_arch_esf_t *esf)
|
|
{
|
|
struct coredump_arch_hdr_t hdr = {
|
|
.id = COREDUMP_ARCH_HDR_ID,
|
|
.hdr_version = ARCH_HDR_VER,
|
|
.num_bytes = sizeof(arch_blk),
|
|
};
|
|
|
|
/* Nothing to process */
|
|
if (esf == NULL) {
|
|
return;
|
|
}
|
|
|
|
(void)memset(&arch_blk, 0, sizeof(arch_blk));
|
|
|
|
arch_blk.vector = z_x86_exception_vector;
|
|
arch_blk.code = esf->errorCode;
|
|
|
|
/*
|
|
* 16 registers expected by GDB.
|
|
* Not all are in ESF but the GDB stub
|
|
* will need to send all 16 as one packet.
|
|
* The stub will need to send undefined
|
|
* for registers not presented in coredump.
|
|
*/
|
|
arch_blk.r.eax = esf->eax;
|
|
arch_blk.r.ebx = esf->ebx;
|
|
arch_blk.r.ecx = esf->ecx;
|
|
arch_blk.r.edx = esf->edx;
|
|
arch_blk.r.esp = esf->esp;
|
|
arch_blk.r.ebp = esf->ebp;
|
|
arch_blk.r.esi = esf->esi;
|
|
arch_blk.r.edi = esf->edi;
|
|
arch_blk.r.eip = esf->eip;
|
|
arch_blk.r.eflags = esf->eflags;
|
|
arch_blk.r.cs = esf->cs & 0xFFFFU;
|
|
|
|
/* Send for output */
|
|
coredump_buffer_output((uint8_t *)&hdr, sizeof(hdr));
|
|
coredump_buffer_output((uint8_t *)&arch_blk, sizeof(arch_blk));
|
|
}
|
|
|
|
uint16_t arch_coredump_tgt_code_get(void)
|
|
{
|
|
return COREDUMP_TGT_X86;
|
|
}
|