Line data Source code
1 : /**
2 : * Copyright (c) 2025 Huawei Technologies Co., Ltd.
3 : * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
4 : * CANN Open Software License Agreement Version 2.0 (the "License").
5 : * Please refer to the License for details. You may not use this file except in compliance with the License.
6 : * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
7 : * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
8 : * See LICENSE in the root of the software repository for the full text of the License.
9 : */
10 :
11 : #include "scd_regs.h"
12 : #include "securec.h"
13 :
14 : #ifdef __x86_64__
15 :
16 : #define SCD_REGS_SP SCD_REGS_RSP
17 : #define SCD_REGS_PC SCD_REGS_RIP
18 :
19 240 : void ScdRegsLoadFromUcontext(ScdRegs *regs, ucontext_t *uc)
20 : {
21 240 : GET_REGISTER_FROM_CONTEXT(regs->r, &uc->uc_mcontext);
22 240 : }
23 :
24 15 : uintptr_t ScdRegsGetPc(ScdRegs *regs)
25 : {
26 15 : return regs->r[SCD_REGS_PC];
27 : }
28 :
29 15 : void ScdRegsSetPc(ScdRegs *regs, uintptr_t pc)
30 : {
31 15 : regs->r[SCD_REGS_PC] = pc;
32 15 : }
33 :
34 15 : uintptr_t ScdRegsGetSp(ScdRegs *regs)
35 : {
36 15 : return regs->r[SCD_REGS_SP];
37 : }
38 :
39 15 : void ScdRegsSetSp(ScdRegs *regs, uintptr_t sp)
40 : {
41 15 : regs->r[SCD_REGS_SP] = sp;
42 15 : }
43 :
44 15 : uintptr_t ScdRegsGetFp(ScdRegs *regs)
45 : {
46 15 : return regs->r[SCD_REGS_RBP];
47 : }
48 :
49 15 : void ScdRegsSetFp(ScdRegs *regs, uintptr_t fp)
50 : {
51 15 : regs->r[SCD_REGS_RBP] = fp;
52 15 : }
53 :
54 315 : TraStatus ScdRegsGetString(const ScdRegs *regs, char *buf, size_t bufSize)
55 : {
56 315 : if (regs == NULL || buf == NULL || bufSize == 0) {
57 45 : return TRACE_INVALID_PARAM;
58 : }
59 270 : int32_t ret = snprintf_s(buf, bufSize, bufSize - 1U,
60 : "crash registers:\n"
61 : " rax 0x%016lx rbx 0x%016lx rcx 0x%016lx rdx 0x%016lx\n"
62 : " r8 0x%016lx r9 0x%016lx r10 0x%016lx r11 0x%016lx\n"
63 : " r12 0x%016lx r13 0x%016lx r14 0x%016lx r15 0x%016lx\n"
64 : " rdi 0x%016lx rsi 0x%016lx\n"
65 : " rbp 0x%016lx rsp 0x%016lx rip 0x%016lx\n\n",
66 270 : regs->r[SCD_REGS_RAX], regs->r[SCD_REGS_RBX], regs->r[SCD_REGS_RCX], regs->r[SCD_REGS_RDX],
67 270 : regs->r[SCD_REGS_R8], regs->r[SCD_REGS_R9], regs->r[SCD_REGS_R10], regs->r[SCD_REGS_R11],
68 270 : regs->r[SCD_REGS_R12], regs->r[SCD_REGS_R13], regs->r[SCD_REGS_R14], regs->r[SCD_REGS_R15],
69 270 : regs->r[SCD_REGS_RDI], regs->r[SCD_REGS_RSI],
70 270 : regs->r[SCD_REGS_RBP], regs->r[SCD_REGS_RSP], regs->r[SCD_REGS_RIP]);
71 270 : if (ret == -1) {
72 105 : return TRACE_FAILURE;
73 : }
74 165 : return TRACE_SUCCESS;
75 : }
76 :
77 : #endif
|