]>
Commit | Line | Data |
---|---|---|
b168057a | 1 | /* Copyright (C) 2003-2015 Free Software Foundation, Inc. |
a54e8d33 UD |
2 | This file is part of the GNU C Library. |
3 | ||
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. | |
8 | ||
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. | |
13 | ||
14 | You should have received a copy of the GNU Lesser General Public | |
59ba27a6 PE |
15 | License along with the GNU C Library; if not, see |
16 | <http://www.gnu.org/licenses/>. */ | |
a54e8d33 UD |
17 | |
18 | #include <sysdep.h> | |
19 | #include <tls.h> | |
20 | #ifndef __ASSEMBLER__ | |
21 | # include <nptl/pthreadP.h> | |
22 | #endif | |
23 | ||
4f41c682 | 24 | #if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) |
a54e8d33 UD |
25 | |
26 | # define _IMM12 #-12 | |
27 | # define _IMM16 #-16 | |
28 | # define _IMP16 #16 | |
29 | # undef PSEUDO | |
30 | # define PSEUDO(name, syscall_name, args) \ | |
31 | .text; \ | |
32 | ENTRY (name); \ | |
07bd2a3f | 33 | .Lpseudo_start: \ |
a54e8d33 UD |
34 | SINGLE_THREAD_P; \ |
35 | bf .Lpseudo_cancel; \ | |
fa3cbe3d UD |
36 | .type __##syscall_name##_nocancel,@function; \ |
37 | .globl __##syscall_name##_nocancel; \ | |
38 | __##syscall_name##_nocancel: \ | |
a54e8d33 UD |
39 | DO_CALL (syscall_name, args); \ |
40 | mov r0,r1; \ | |
41 | mov _IMM12,r2; \ | |
42 | shad r2,r1; \ | |
43 | not r1,r1; \ | |
44 | tst r1,r1; \ | |
45 | bt .Lsyscall_error; \ | |
46 | bra .Lpseudo_end; \ | |
47 | nop; \ | |
fa3cbe3d | 48 | .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \ |
a54e8d33 UD |
49 | .Lpseudo_cancel: \ |
50 | sts.l pr,@-r15; \ | |
db0a00d3 UD |
51 | cfi_adjust_cfa_offset (4); \ |
52 | cfi_rel_offset (pr, 0); \ | |
a54e8d33 | 53 | add _IMM16,r15; \ |
db0a00d3 | 54 | cfi_adjust_cfa_offset (16); \ |
a54e8d33 UD |
55 | SAVE_ARGS_##args; \ |
56 | CENABLE; \ | |
57 | LOAD_ARGS_##args; \ | |
58 | add _IMP16,r15; \ | |
db0a00d3 | 59 | cfi_adjust_cfa_offset (-16); \ |
a54e8d33 | 60 | lds.l @r15+,pr; \ |
db0a00d3 UD |
61 | cfi_adjust_cfa_offset (-4); \ |
62 | cfi_restore (pr); \ | |
a54e8d33 UD |
63 | DO_CALL(syscall_name, args); \ |
64 | SYSCALL_INST_PAD; \ | |
65 | sts.l pr,@-r15; \ | |
db0a00d3 UD |
66 | cfi_adjust_cfa_offset (4); \ |
67 | cfi_rel_offset (pr, 0); \ | |
a54e8d33 | 68 | mov.l r0,@-r15; \ |
db0a00d3 UD |
69 | cfi_adjust_cfa_offset (4); \ |
70 | cfi_rel_offset (r0, 0); \ | |
a54e8d33 UD |
71 | CDISABLE; \ |
72 | mov.l @r15+,r0; \ | |
db0a00d3 | 73 | cfi_adjust_cfa_offset (-4); \ |
d701a1ab | 74 | cfi_restore (r0); \ |
a54e8d33 | 75 | lds.l @r15+,pr; \ |
db0a00d3 UD |
76 | cfi_adjust_cfa_offset (-4); \ |
77 | cfi_restore (pr); \ | |
a54e8d33 UD |
78 | mov r0,r1; \ |
79 | mov _IMM12,r2; \ | |
80 | shad r2,r1; \ | |
81 | not r1,r1; \ | |
82 | tst r1,r1; \ | |
83 | bf .Lpseudo_end; \ | |
84 | .Lsyscall_error: \ | |
85 | SYSCALL_ERROR_HANDLER; \ | |
db0a00d3 | 86 | .Lpseudo_end: |
a54e8d33 UD |
87 | |
88 | # undef PSEUDO_END | |
89 | # define PSEUDO_END(sym) \ | |
90 | END (sym) | |
91 | ||
92 | # define SAVE_ARGS_0 /* Nothing. */ | |
db0a00d3 UD |
93 | # define SAVE_ARGS_1 SAVE_ARGS_0; mov.l r4,@(0,r15); cfi_offset (r4,-4) |
94 | # define SAVE_ARGS_2 SAVE_ARGS_1; mov.l r5,@(4,r15); cfi_offset (r5,-8) | |
95 | # define SAVE_ARGS_3 SAVE_ARGS_2; mov.l r6,@(8,r15); cfi_offset (r6,-12) | |
96 | # define SAVE_ARGS_4 SAVE_ARGS_3; mov.l r7,@(12,r15); cfi_offset (r7,-16) | |
a54e8d33 UD |
97 | # define SAVE_ARGS_5 SAVE_ARGS_4 |
98 | # define SAVE_ARGS_6 SAVE_ARGS_5 | |
99 | ||
100 | # define LOAD_ARGS_0 /* Nothing. */ | |
d701a1ab CLT |
101 | # define LOAD_ARGS_1 LOAD_ARGS_0; mov.l @(0,r15),r4; cfi_restore (r4) |
102 | # define LOAD_ARGS_2 LOAD_ARGS_1; mov.l @(4,r15),r5; cfi_restore (r5) | |
103 | # define LOAD_ARGS_3 LOAD_ARGS_2; mov.l @(8,r15),r6; cfi_restore (r6) | |
104 | # define LOAD_ARGS_4 LOAD_ARGS_3; mov.l @(12,r15),r7; cfi_restore (r7) | |
a54e8d33 UD |
105 | # define LOAD_ARGS_5 LOAD_ARGS_4 |
106 | # define LOAD_ARGS_6 LOAD_ARGS_5 | |
107 | ||
ce9f10f7 | 108 | # if IS_IN (libpthread) |
a54e8d33 UD |
109 | # define __local_enable_asynccancel __pthread_enable_asynccancel |
110 | # define __local_disable_asynccancel __pthread_disable_asynccancel | |
4f41c682 | 111 | # elif IS_IN (libc) |
a54e8d33 UD |
112 | # define __local_enable_asynccancel __libc_enable_asynccancel |
113 | # define __local_disable_asynccancel __libc_disable_asynccancel | |
016afc75 | 114 | # elif IS_IN (librt) |
4a17085f UD |
115 | # define __local_enable_asynccancel __librt_enable_asynccancel |
116 | # define __local_disable_asynccancel __librt_disable_asynccancel | |
117 | # else | |
118 | # error Unsupported library | |
a54e8d33 UD |
119 | # endif |
120 | ||
121 | # define CENABLE \ | |
122 | mov.l 1f,r0; \ | |
123 | bsrf r0; \ | |
124 | nop; \ | |
125 | 0: bra 2f; \ | |
3abb1ff7 | 126 | mov r0,r2; \ |
a54e8d33 UD |
127 | .align 2; \ |
128 | 1: .long __local_enable_asynccancel - 0b; \ | |
129 | 2: | |
130 | ||
131 | # define CDISABLE \ | |
132 | mov.l 1f,r0; \ | |
133 | bsrf r0; \ | |
3abb1ff7 | 134 | mov r2,r4; \ |
a54e8d33 UD |
135 | 0: bra 2f; \ |
136 | nop; \ | |
137 | .align 2; \ | |
138 | 1: .long __local_disable_asynccancel - 0b; \ | |
139 | 2: | |
140 | ||
141 | # ifndef __ASSEMBLER__ | |
142 | # define SINGLE_THREAD_P \ | |
468777e1 UD |
143 | __builtin_expect (THREAD_GETMEM (THREAD_SELF, \ |
144 | header.multiple_threads) == 0, 1) | |
a54e8d33 UD |
145 | # else |
146 | # define SINGLE_THREAD_P \ | |
147 | stc gbr,r0; \ | |
148 | mov.w 0f,r1; \ | |
149 | sub r1,r0; \ | |
150 | mov.l @(MULTIPLE_THREADS_OFFSET,r0),r0; \ | |
151 | bra 1f; \ | |
152 | tst r0,r0; \ | |
153 | 0: .word TLS_PRE_TCB_SIZE; \ | |
154 | 1: | |
155 | ||
156 | # endif | |
157 | ||
158 | #elif !defined __ASSEMBLER__ | |
159 | ||
6e627806 | 160 | # define SINGLE_THREAD_P (1) |
ce6e047f | 161 | # define NO_CANCELLATION 1 |
a54e8d33 UD |
162 | |
163 | #endif | |
6e627806 UD |
164 | |
165 | #ifndef __ASSEMBLER__ | |
166 | # define RTLD_SINGLE_THREAD_P \ | |
167 | __builtin_expect (THREAD_GETMEM (THREAD_SELF, \ | |
168 | header.multiple_threads) == 0, 1) | |
169 | #endif |