]> git.ipfire.org Git - thirdparty/glibc.git/blob - sysdeps/powerpc/powerpc32/__longjmp-common.S
0423e3ee8894ba197397288a131b55e1a4b4ba24
[thirdparty/glibc.git] / sysdeps / powerpc / powerpc32 / __longjmp-common.S
1 /* longjmp for PowerPC.
2 Copyright (C) 1995-2018 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <http://www.gnu.org/licenses/>. */
18
19 #include <sysdep.h>
20 #include <stap-probe.h>
21 #define _ASM
22 #ifdef __NO_VMX__
23 # include <novmxsetjmp.h>
24 #else
25 # include <jmpbuf-offsets.h>
26 #endif
27
28 #if defined __SPE__ || (defined __NO_FPRS__ && !defined _SOFT_FLOAT)
29 # define LOAD_GP(N) evldd r##N,((JB_FPRS+((N)-14)*2)*4)(r3)
30 #else
31 # define LOAD_GP(N) lwz r##N,((JB_GPRS+(N)-14)*4)(r3)
32 #endif
33
34 ENTRY (__longjmp_symbol)
35
36 #if defined PTR_DEMANGLE || defined CHECK_SP
37 lwz r24,(JB_GPR1*4)(r3)
38 # ifdef CHECK_SP
39 # ifdef PTR_DEMANGLE
40 PTR_DEMANGLE3 (r24, r24, r25)
41 # endif
42 CHECK_SP (r24)
43 mr r1,r24
44 # endif
45 #else
46 lwz r1,(JB_GPR1*4)(r3)
47 #endif
48 lwz r0,(JB_LR*4)(r3)
49 LOAD_GP (14)
50 LOAD_GP (15)
51 LOAD_GP (16)
52 LOAD_GP (17)
53 LOAD_GP (18)
54 LOAD_GP (19)
55 LOAD_GP (20)
56 #ifdef PTR_DEMANGLE
57 # ifndef CHECK_SP
58 PTR_DEMANGLE3 (r1, r24, r25)
59 # endif
60 PTR_DEMANGLE2 (r0, r25)
61 #endif
62 /* longjmp/longjmp_target probe expects longjmp first argument (4@3),
63 second argument (-4@4), and target address (4@0), respectively. */
64 LIBC_PROBE (longjmp, 3, 4@3, -4@4, 4@0)
65 mtlr r0
66 LOAD_GP (21)
67 LOAD_GP (22)
68 lwz r5,(JB_CR*4)(r3)
69 LOAD_GP (23)
70 LOAD_GP (24)
71 LOAD_GP (25)
72 mtcrf 0xFF,r5
73 LOAD_GP (26)
74 LOAD_GP (27)
75 LOAD_GP (28)
76 LOAD_GP (29)
77 LOAD_GP (30)
78 LOAD_GP (31)
79 LIBC_PROBE (longjmp_target, 3, 4@3, -4@4, 4@0)
80 mr r3,r4
81 blr
82 END (__longjmp_symbol)