106 lines
2.4 KiB
C
106 lines
2.4 KiB
C
/*
|
|
* Copyright (c) 2022 Huawei Technologies SASU
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <string.h>
|
|
#include <zephyr/debug/coredump.h>
|
|
|
|
/* Identify the version of this block (in case of architecture changes).
|
|
* To be interpreted by the target architecture specific block parser.
|
|
*/
|
|
#define ARCH_HDR_VER 1
|
|
|
|
/* Structure to store the architecture registers passed arch_coredump_info_dump
|
|
* As callee saved registers are not provided in z_arch_esf_t structure in Zephyr
|
|
* we just need 22 registers.
|
|
*/
|
|
struct arm64_arch_block {
|
|
struct {
|
|
uint64_t x0;
|
|
uint64_t x1;
|
|
uint64_t x2;
|
|
uint64_t x3;
|
|
uint64_t x4;
|
|
uint64_t x5;
|
|
uint64_t x6;
|
|
uint64_t x7;
|
|
uint64_t x8;
|
|
uint64_t x9;
|
|
uint64_t x10;
|
|
uint64_t x11;
|
|
uint64_t x12;
|
|
uint64_t x13;
|
|
uint64_t x14;
|
|
uint64_t x15;
|
|
uint64_t x16;
|
|
uint64_t x17;
|
|
uint64_t x18;
|
|
uint64_t lr;
|
|
uint64_t spsr;
|
|
uint64_t elr;
|
|
} r;
|
|
} __packed;
|
|
|
|
|
|
/*
|
|
* Register block takes up too much stack space
|
|
* if defined within function. So define it here.
|
|
*/
|
|
static struct arm64_arch_block arch_blk;
|
|
|
|
void arch_coredump_info_dump(const z_arch_esf_t *esf)
|
|
{
|
|
/* Target architecture information header */
|
|
/* Information just relevant to the python parser */
|
|
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));
|
|
|
|
/*
|
|
* Copies the thread registers to a memory block that will be printed out
|
|
* The thread registers are already provided by structure z_arch_esf_t
|
|
*/
|
|
arch_blk.r.x0 = esf->x0;
|
|
arch_blk.r.x1 = esf->x1;
|
|
arch_blk.r.x2 = esf->x2;
|
|
arch_blk.r.x3 = esf->x3;
|
|
arch_blk.r.x4 = esf->x4;
|
|
arch_blk.r.x5 = esf->x5;
|
|
arch_blk.r.x6 = esf->x6;
|
|
arch_blk.r.x7 = esf->x7;
|
|
arch_blk.r.x8 = esf->x8;
|
|
arch_blk.r.x9 = esf->x9;
|
|
arch_blk.r.x10 = esf->x10;
|
|
arch_blk.r.x11 = esf->x11;
|
|
arch_blk.r.x12 = esf->x12;
|
|
arch_blk.r.x13 = esf->x13;
|
|
arch_blk.r.x14 = esf->x14;
|
|
arch_blk.r.x15 = esf->x15;
|
|
arch_blk.r.x16 = esf->x16;
|
|
arch_blk.r.x17 = esf->x17;
|
|
arch_blk.r.x18 = esf->x18;
|
|
arch_blk.r.lr = esf->lr;
|
|
arch_blk.r.spsr = esf->spsr;
|
|
arch_blk.r.elr = esf->elr;
|
|
|
|
/* 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_ARM64;
|
|
}
|