1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
2 | /* |
3 | * Copyright (C) 1996 Paul Mackerras. |
4 | * |
5 | * NOTE: assert(sizeof(buf) > 23 * sizeof(long)) |
6 | */ |
7 | #include <asm/processor.h> |
8 | #include <asm/ppc_asm.h> |
9 | #include <asm/asm-offsets.h> |
10 | #include <asm/ptrace.h> |
11 | #include <asm/asm-compat.h> |
12 | |
13 | /* |
14 | * Grab the register values as they are now. |
15 | * This won't do a particularly good job because we really |
16 | * want our caller's caller's registers, and our caller has |
17 | * already executed its prologue. |
18 | * ToDo: We could reach back into the caller's save area to do |
19 | * a better job of representing the caller's state (note that |
20 | * that will be different for 32-bit and 64-bit, because of the |
21 | * different ABIs, though). |
22 | */ |
23 | _GLOBAL(ppc_save_regs) |
24 | /* This allows stack frame accessor macros and offsets to be used */ |
25 | subi r3,r3,STACK_INT_FRAME_REGS |
26 | PPC_STL r0,GPR0(r3) |
27 | #ifdef CONFIG_PPC32 |
28 | stmw r2,GPR2(r3) |
29 | #else |
30 | SAVE_GPRS(2, 31, r3) |
31 | lbz r0,PACAIRQSOFTMASK(r13) |
32 | PPC_STL r0,SOFTE(r3) |
33 | #endif |
34 | /* store current SP */ |
35 | PPC_STL r1,GPR1(r3) |
36 | /* get caller's LR */ |
37 | PPC_LL r4,0(r1) |
38 | PPC_LL r0,LRSAVE(r4) |
39 | PPC_STL r0,_LINK(r3) |
40 | mflr r0 |
41 | PPC_STL r0,_NIP(r3) |
42 | mfmsr r0 |
43 | PPC_STL r0,_MSR(r3) |
44 | mfctr r0 |
45 | PPC_STL r0,_CTR(r3) |
46 | mfxer r0 |
47 | PPC_STL r0,_XER(r3) |
48 | mfcr r0 |
49 | PPC_STL r0,_CCR(r3) |
50 | li r0,0 |
51 | PPC_STL r0,_TRAP(r3) |
52 | PPC_STL r0,ORIG_GPR3(r3) |
53 | blr |
54 | |