| /* |
| * 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_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 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 = 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 */ |
| 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_64; |
| } |