zephyr/arch/x86/core/intel64/coredump.c

109 lines
2.1 KiB
C
Raw Normal View History

/*
* Copyright (c) 2020 Intel Corporation.
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <string.h>
#include <debug/coredump.h>
#define ARCH_HDR_VER 1
struct x86_64_arch_block {
uint64_t vector;
uint64_t code;
struct {
uint64_t rax;
uint64_t rcx;
uint64_t rdx;
uint64_t rsi;
uint64_t rdi;
uint64_t rsp;
uint64_t r8;
uint64_t r9;
uint64_t r10;
uint64_t r11;
uint64_t rip;
uint64_t eflags;
uint64_t cs;
uint64_t ss;
uint64_t rbp;
#ifdef CONFIG_EXCEPTION_DEBUG
uint64_t rbx;
uint64_t r12;
uint64_t r13;
uint64_t r14;
uint64_t r15;
#endif
} r;
} __packed;
/*
* Register block takes up too much stack space
* if defined within function. So define it here.
*/
static struct x86_64_arch_block arch_blk;
void arch_coredump_info_dump(const z_arch_esf_t *esf)
{
struct z_coredump_arch_hdr_t hdr = {
.id = Z_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 = esf->vector;
arch_blk.code = esf->code;
/*
* 34 registers expected by GDB.
* Not all are in ESF but the GDB stub
* will need to send all 34 as one packet.
* The stub will need to send undefined
* for registers not presented in coredump.
*/
arch_blk.r.rax = esf->rax;
arch_blk.r.rcx = esf->rcx;
arch_blk.r.rdx = esf->rdx;
arch_blk.r.rsi = esf->rsi;
arch_blk.r.rdi = esf->rdi;
arch_blk.r.rsp = esf->rsp;
arch_blk.r.rip = esf->rip;
arch_blk.r.r8 = esf->r8;
arch_blk.r.r9 = esf->r9;
arch_blk.r.r10 = esf->r10;
arch_blk.r.r11 = esf->r11;
arch_blk.r.eflags = esf->rflags;
arch_blk.r.cs = esf->cs & 0xFFFFU;
arch_blk.r.ss = esf->ss;
arch_blk.r.rbp = esf->rbp;
#ifdef CONFIG_EXCEPTION_DEBUG
arch_blk.r.rbx = esf->rbx;
arch_blk.r.r12 = esf->r12;
arch_blk.r.r13 = esf->r13;
arch_blk.r.r14 = esf->r14;
arch_blk.r.r15 = esf->r15;
#endif
/* Send for output */
z_coredump_buffer_output((uint8_t *)&hdr, sizeof(hdr));
z_coredump_buffer_output((uint8_t *)&arch_blk, sizeof(arch_blk));
}
uint16_t arch_coredump_tgt_code_get(void)
{
return COREDUMP_TGT_X86_64;
}