1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright (C) 2020-2022 Loongson Technology Corporation Limited 4 */ 5 #ifndef _ASM_STACKTRACE_H 6 #define _ASM_STACKTRACE_H 7 8 #include <asm/asm.h> 9 #include <asm/ptrace.h> 10 #include <asm/loongarch.h> 11 #include <linux/stringify.h> 12 13 #define STR_LONG_L __stringify(LONG_L) 14 #define STR_LONG_S __stringify(LONG_S) 15 #define STR_LONGSIZE __stringify(LONGSIZE) 16 17 #define STORE_ONE_REG(r) \ 18 STR_LONG_S " $r" __stringify(r)", %1, "STR_LONGSIZE"*"__stringify(r)"\n\t" 19 20 #define CSRRD_ONE_REG(reg) \ 21 __stringify(csrrd) " %0, "__stringify(reg)"\n\t" 22 23 static __always_inline void prepare_frametrace(struct pt_regs *regs) 24 { 25 __asm__ __volatile__( 26 /* Save $ra */ 27 STORE_ONE_REG(1) 28 /* Use $ra to save PC */ 29 "pcaddi $ra, 0\n\t" 30 STR_LONG_S " $ra, %0\n\t" 31 /* Restore $ra */ 32 STR_LONG_L " $ra, %1, "STR_LONGSIZE"\n\t" 33 STORE_ONE_REG(2) 34 STORE_ONE_REG(3) 35 STORE_ONE_REG(4) 36 STORE_ONE_REG(5) 37 STORE_ONE_REG(6) 38 STORE_ONE_REG(7) 39 STORE_ONE_REG(8) 40 STORE_ONE_REG(9) 41 STORE_ONE_REG(10) 42 STORE_ONE_REG(11) 43 STORE_ONE_REG(12) 44 STORE_ONE_REG(13) 45 STORE_ONE_REG(14) 46 STORE_ONE_REG(15) 47 STORE_ONE_REG(16) 48 STORE_ONE_REG(17) 49 STORE_ONE_REG(18) 50 STORE_ONE_REG(19) 51 STORE_ONE_REG(20) 52 STORE_ONE_REG(21) 53 STORE_ONE_REG(22) 54 STORE_ONE_REG(23) 55 STORE_ONE_REG(24) 56 STORE_ONE_REG(25) 57 STORE_ONE_REG(26) 58 STORE_ONE_REG(27) 59 STORE_ONE_REG(28) 60 STORE_ONE_REG(29) 61 STORE_ONE_REG(30) 62 STORE_ONE_REG(31) 63 : "=m" (regs->csr_era) 64 : "r" (regs->regs) 65 : "memory"); 66 __asm__ __volatile__(CSRRD_ONE_REG(LOONGARCH_CSR_BADV) : "=r" (regs->csr_badvaddr)); 67 __asm__ __volatile__(CSRRD_ONE_REG(LOONGARCH_CSR_CRMD) : "=r" (regs->csr_crmd)); 68 __asm__ __volatile__(CSRRD_ONE_REG(LOONGARCH_CSR_PRMD) : "=r" (regs->csr_prmd)); 69 __asm__ __volatile__(CSRRD_ONE_REG(LOONGARCH_CSR_EUEN) : "=r" (regs->csr_euen)); 70 __asm__ __volatile__(CSRRD_ONE_REG(LOONGARCH_CSR_ECFG) : "=r" (regs->csr_ecfg)); 71 __asm__ __volatile__(CSRRD_ONE_REG(LOONGARCH_CSR_ESTAT) : "=r" (regs->csr_estat)); 72 } 73 74 #endif /* _ASM_STACKTRACE_H */ 75