1/* SPDX-License-Identifier: GPL-2.0 */ 2/* Copyright (C) 2017 Andes Technology Corporation */ 3 4#include <linux/init.h> 5#include <linux/linkage.h> 6#include <asm/asm.h> 7#include <asm/csr.h> 8#include <asm/unistd.h> 9#include <asm/thread_info.h> 10#include <asm/asm-offsets.h> 11#include <asm-generic/export.h> 12#include <asm/ftrace.h> 13 14 .text 15 16#define FENTRY_RA_OFFSET 12 17#define ABI_SIZE_ON_STACK 72 18#define ABI_A0 0 19#define ABI_A1 8 20#define ABI_A2 16 21#define ABI_A3 24 22#define ABI_A4 32 23#define ABI_A5 40 24#define ABI_A6 48 25#define ABI_A7 56 26#define ABI_RA 64 27 28 .macro SAVE_ABI 29 addi sp, sp, -SZREG 30 addi sp, sp, -ABI_SIZE_ON_STACK 31 32 REG_S a0, ABI_A0(sp) 33 REG_S a1, ABI_A1(sp) 34 REG_S a2, ABI_A2(sp) 35 REG_S a3, ABI_A3(sp) 36 REG_S a4, ABI_A4(sp) 37 REG_S a5, ABI_A5(sp) 38 REG_S a6, ABI_A6(sp) 39 REG_S a7, ABI_A7(sp) 40 REG_S ra, ABI_RA(sp) 41 .endm 42 43 .macro RESTORE_ABI 44 REG_L a0, ABI_A0(sp) 45 REG_L a1, ABI_A1(sp) 46 REG_L a2, ABI_A2(sp) 47 REG_L a3, ABI_A3(sp) 48 REG_L a4, ABI_A4(sp) 49 REG_L a5, ABI_A5(sp) 50 REG_L a6, ABI_A6(sp) 51 REG_L a7, ABI_A7(sp) 52 REG_L ra, ABI_RA(sp) 53 54 addi sp, sp, ABI_SIZE_ON_STACK 55 addi sp, sp, SZREG 56 .endm 57 58#ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS 59 .macro SAVE_ALL 60 addi sp, sp, -SZREG 61 addi sp, sp, -PT_SIZE_ON_STACK 62 63 REG_S x1, PT_EPC(sp) 64 addi sp, sp, PT_SIZE_ON_STACK 65 REG_L x1, (sp) 66 addi sp, sp, -PT_SIZE_ON_STACK 67 REG_S x1, PT_RA(sp) 68 REG_L x1, PT_EPC(sp) 69 70 REG_S x2, PT_SP(sp) 71 REG_S x3, PT_GP(sp) 72 REG_S x4, PT_TP(sp) 73 REG_S x5, PT_T0(sp) 74 REG_S x6, PT_T1(sp) 75 REG_S x7, PT_T2(sp) 76 REG_S x8, PT_S0(sp) 77 REG_S x9, PT_S1(sp) 78 REG_S x10, PT_A0(sp) 79 REG_S x11, PT_A1(sp) 80 REG_S x12, PT_A2(sp) 81 REG_S x13, PT_A3(sp) 82 REG_S x14, PT_A4(sp) 83 REG_S x15, PT_A5(sp) 84 REG_S x16, PT_A6(sp) 85 REG_S x17, PT_A7(sp) 86 REG_S x18, PT_S2(sp) 87 REG_S x19, PT_S3(sp) 88 REG_S x20, PT_S4(sp) 89 REG_S x21, PT_S5(sp) 90 REG_S x22, PT_S6(sp) 91 REG_S x23, PT_S7(sp) 92 REG_S x24, PT_S8(sp) 93 REG_S x25, PT_S9(sp) 94 REG_S x26, PT_S10(sp) 95 REG_S x27, PT_S11(sp) 96 REG_S x28, PT_T3(sp) 97 REG_S x29, PT_T4(sp) 98 REG_S x30, PT_T5(sp) 99 REG_S x31, PT_T6(sp) 100 .endm 101 102 .macro RESTORE_ALL 103 REG_L x1, PT_RA(sp) 104 addi sp, sp, PT_SIZE_ON_STACK 105 REG_S x1, (sp) 106 addi sp, sp, -PT_SIZE_ON_STACK 107 REG_L x1, PT_EPC(sp) 108 REG_L x2, PT_SP(sp) 109 REG_L x3, PT_GP(sp) 110 REG_L x4, PT_TP(sp) 111 REG_L x5, PT_T0(sp) 112 REG_L x6, PT_T1(sp) 113 REG_L x7, PT_T2(sp) 114 REG_L x8, PT_S0(sp) 115 REG_L x9, PT_S1(sp) 116 REG_L x10, PT_A0(sp) 117 REG_L x11, PT_A1(sp) 118 REG_L x12, PT_A2(sp) 119 REG_L x13, PT_A3(sp) 120 REG_L x14, PT_A4(sp) 121 REG_L x15, PT_A5(sp) 122 REG_L x16, PT_A6(sp) 123 REG_L x17, PT_A7(sp) 124 REG_L x18, PT_S2(sp) 125 REG_L x19, PT_S3(sp) 126 REG_L x20, PT_S4(sp) 127 REG_L x21, PT_S5(sp) 128 REG_L x22, PT_S6(sp) 129 REG_L x23, PT_S7(sp) 130 REG_L x24, PT_S8(sp) 131 REG_L x25, PT_S9(sp) 132 REG_L x26, PT_S10(sp) 133 REG_L x27, PT_S11(sp) 134 REG_L x28, PT_T3(sp) 135 REG_L x29, PT_T4(sp) 136 REG_L x30, PT_T5(sp) 137 REG_L x31, PT_T6(sp) 138 139 addi sp, sp, PT_SIZE_ON_STACK 140 addi sp, sp, SZREG 141 .endm 142#endif /* CONFIG_DYNAMIC_FTRACE_WITH_REGS */ 143 144ENTRY(ftrace_caller) 145 SAVE_ABI 146 147 addi a0, ra, -FENTRY_RA_OFFSET 148 la a1, function_trace_op 149 REG_L a2, 0(a1) 150 REG_L a1, ABI_SIZE_ON_STACK(sp) 151 mv a3, sp 152 153ftrace_call: 154 .global ftrace_call 155 call ftrace_stub 156 157#ifdef CONFIG_FUNCTION_GRAPH_TRACER 158 addi a0, sp, ABI_SIZE_ON_STACK 159 REG_L a1, ABI_RA(sp) 160 addi a1, a1, -FENTRY_RA_OFFSET 161#ifdef HAVE_FUNCTION_GRAPH_FP_TEST 162 mv a2, s0 163#endif 164ftrace_graph_call: 165 .global ftrace_graph_call 166 call ftrace_stub 167#endif 168 RESTORE_ABI 169 ret 170ENDPROC(ftrace_caller) 171 172#ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS 173ENTRY(ftrace_regs_caller) 174 SAVE_ALL 175 176 addi a0, ra, -FENTRY_RA_OFFSET 177 la a1, function_trace_op 178 REG_L a2, 0(a1) 179 REG_L a1, PT_SIZE_ON_STACK(sp) 180 mv a3, sp 181 182ftrace_regs_call: 183 .global ftrace_regs_call 184 call ftrace_stub 185 186#ifdef CONFIG_FUNCTION_GRAPH_TRACER 187 addi a0, sp, PT_RA 188 REG_L a1, PT_EPC(sp) 189 addi a1, a1, -FENTRY_RA_OFFSET 190#ifdef HAVE_FUNCTION_GRAPH_FP_TEST 191 mv a2, s0 192#endif 193ftrace_graph_regs_call: 194 .global ftrace_graph_regs_call 195 call ftrace_stub 196#endif 197 198 RESTORE_ALL 199 ret 200ENDPROC(ftrace_regs_caller) 201#endif /* CONFIG_DYNAMIC_FTRACE_WITH_REGS */ 202