Add Changelog ...
[glibc.git] / sysdeps / unix / sysv / linux / arm / sigrestorer.S
blob63d83b8a65d37840dd07fdc4c24e06d9e78cd985
1 /* Copyright (C) 1999-2012 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library.  If not, see
16    <http://www.gnu.org/licenses/>.  */
18 #include <sysdep.h>
20 /* If no SA_RESTORER function was specified by the application we use
21    one of these.  This avoids the need for the kernel to synthesise a return
22    instruction on the stack, which would involve expensive cache flushes.
24    Nowadays (2.6 series, and somewhat earlier) the kernel uses a high page
25    for signal trampolines, so the cache flushes are not an issue.  But since
26    we do not have a vDSO, continue to use these so that we can provide
27    unwind information.
29    Start the unwind tables at least one instruction before the signal
30    trampoline, because the unwinder will assume we are returning after
31    a call site.
33    Because the signal frame layout changed in 2.6.18, we provide two
34    copies of these functions with different unwind information.  */
36 /* Used in ENTRY.  */
37 #undef cfi_startproc
38 #define cfi_startproc \
39         .cfi_startproc simple; \
40         .cfi_signal_frame
42 /* The CFA is not computed / used correctly here; this is neither trivial to
43    do, nor is it needed.  */
44 #define CFI \
45         cfi_def_cfa (sp, 0); \
46         cfi_offset (r0, OFFSET + 0 * 4); \
47         cfi_offset (r1, OFFSET + 1 * 4); \
48         cfi_offset (r2, OFFSET + 2 * 4); \
49         cfi_offset (r3, OFFSET + 3 * 4); \
50         cfi_offset (r4, OFFSET + 4 * 4); \
51         cfi_offset (r5, OFFSET + 5 * 4); \
52         cfi_offset (r6, OFFSET + 6 * 4); \
53         cfi_offset (r7, OFFSET + 7 * 4); \
54         cfi_offset (r8, OFFSET + 8 * 4); \
55         cfi_offset (r9, OFFSET + 9 * 4); \
56         cfi_offset (r10, OFFSET + 10 * 4); \
57         cfi_offset (r11, OFFSET + 11 * 4); \
58         cfi_offset (r12, OFFSET + 12 * 4); \
59         cfi_offset (r13, OFFSET + 13 * 4); \
60         cfi_offset (r14, OFFSET + 14 * 4); \
61         cfi_offset (r15, OFFSET + 15 * 4)
63 #ifndef __ASSUME_SIGFRAME_V2
64 #define OFFSET 12
65         .fnstart
66         .save {r0-r15}
67         .pad #OFFSET
68         nop
69 ENTRY(__default_sa_restorer_v1)
70         CFI
71         mov     r7, $SYS_ify(sigreturn)
72         swi     0x0
73         .fnend
74 END(__default_sa_restorer_v1)
75 #undef OFFSET
76 #endif /* __ASSUME_SIGFRAME_V2 */
78 #define OFFSET 32
79         .fnstart
80         .save {r0-r15}
81         .pad #OFFSET
82         nop
83 ENTRY(__default_sa_restorer_v2)
84         CFI
85         mov     r7, $SYS_ify(sigreturn)
86         swi     0x0
87         .fnend
88 END(__default_sa_restorer_v2)
89 #undef OFFSET
91 #ifndef __ASSUME_SIGFRAME_V2
92 #define OFFSET 168
93         .fnstart
94         .save {r0-r15}
95         .pad #OFFSET
96         nop
97 ENTRY(__default_rt_sa_restorer_v1)
98         CFI
99         mov     r7, $SYS_ify(rt_sigreturn)
100         swi     0x0
101         .fnend
102 END(__default_rt_sa_restorer_v1)
103 #undef OFFSET
104 #endif /* __ASSUME_SIGFRAME_V2 */
106 #define OFFSET 160
107         .fnstart
108         .save {r0-r15}
109         .pad #OFFSET
110         nop
111 ENTRY(__default_rt_sa_restorer_v2)
112         CFI
113         mov     r7, $SYS_ify(rt_sigreturn)
114         swi     0x0
115         .fnend
116 END(__default_rt_sa_restorer_v2)
117 #undef OFFSET