]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/l4re-core/uclibc/lib/contrib/uclibc/libpthread/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h
Update
[l4.git] / l4 / pkg / l4re-core / uclibc / lib / contrib / uclibc / libpthread / linuxthreads / sysdeps / unix / sysv / linux / powerpc / powerpc32 / sysdep-cancel.h
1 /* Copyright (C) 2003, 2005 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Franz Sirl <Franz.Sirl-kernel@lauterbach.com>, 2003.
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 <tls.h>
21 #ifndef __ASSEMBLER__
22 # include <linuxthreads/internals.h>
23 #endif
24
25 #if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
26
27 # undef PSEUDO
28 # define PSEUDO(name, syscall_name, args)                               \
29   .section ".text";                                                     \
30   ENTRY (name)                                                          \
31     SINGLE_THREAD_P;                                                    \
32     bne- .Lpseudo_cancel;                                               \
33     DO_CALL (SYS_ify (syscall_name));                                   \
34     PSEUDO_RET;                                                         \
35   .Lpseudo_cancel:                                                      \
36     stwu 1,-48(1);                                                      \
37     mflr 9;                                                             \
38     stw 9,52(1);                                                        \
39     CGOTSETUP;                                                          \
40     DOCARGS_##args;     /* save syscall args around CENABLE.  */        \
41     CENABLE;                                                            \
42     stw 3,16(1);        /* store CENABLE return value (MASK).  */       \
43     UNDOCARGS_##args;   /* restore syscall args.  */                    \
44     DO_CALL (SYS_ify (syscall_name));                                   \
45     mfcr 0;             /* save CR/R3 around CDISABLE.  */              \
46     stw 3,8(1);                                                         \
47     stw 0,12(1);                                                        \
48     lwz 3,16(1);        /* pass MASK to CDISABLE.  */                   \
49     CDISABLE;                                                           \
50     lwz 4,52(1);                                                        \
51     lwz 0,12(1);        /* restore CR/R3. */                            \
52     lwz 3,8(1);                                                         \
53     CGOTRESTORE;                                                        \
54     mtlr 4;                                                             \
55     mtcr 0;                                                             \
56     addi 1,1,48;
57
58 # define DOCARGS_0
59 # define UNDOCARGS_0
60
61 # define DOCARGS_1      stw 3,20(1); DOCARGS_0
62 # define UNDOCARGS_1    lwz 3,20(1); UNDOCARGS_0
63
64 # define DOCARGS_2      stw 4,24(1); DOCARGS_1
65 # define UNDOCARGS_2    lwz 4,24(1); UNDOCARGS_1
66
67 # define DOCARGS_3      stw 5,28(1); DOCARGS_2
68 # define UNDOCARGS_3    lwz 5,28(1); UNDOCARGS_2
69
70 # define DOCARGS_4      stw 6,32(1); DOCARGS_3
71 # define UNDOCARGS_4    lwz 6,32(1); UNDOCARGS_3
72
73 # define DOCARGS_5      stw 7,36(1); DOCARGS_4
74 # define UNDOCARGS_5    lwz 7,36(1); UNDOCARGS_4
75
76 # define DOCARGS_6      stw 8,40(1); DOCARGS_5
77 # define UNDOCARGS_6    lwz 8,40(1); UNDOCARGS_5
78
79 # define CGOTSETUP
80 # define CGOTRESTORE
81
82 # ifdef IS_IN_libpthread
83 #  define CENABLE       bl __pthread_enable_asynccancel@local
84 #  define CDISABLE      bl __pthread_disable_asynccancel@local
85 # elif !defined NOT_IN_libc
86 #  define CENABLE       bl __libc_enable_asynccancel@local
87 #  define CDISABLE      bl __libc_disable_asynccancel@local
88 # else
89 #  define CENABLE       bl JUMPTARGET(__librt_enable_asynccancel)
90 #  define CDISABLE      bl JUMPTARGET(__librt_disable_asynccancel)
91 #  if defined HAVE_AS_REL16 && defined __PIC__
92 #   undef CGOTSETUP
93 #   define CGOTSETUP                                                    \
94     bcl 20,31,1f;                                                       \
95  1: stw 30,44(1);                                                       \
96     mflr 30;                                                            \
97     addis 30,30,_GLOBAL_OFFSET_TABLE-1b@ha;                             \
98     addi 30,30,_GLOBAL_OFFSET_TABLE-1b@l
99 #   undef CGOTRESTORE
100 #   define CGOTRESTORE                                                  \
101     lwz 30,44(1)
102 #  endif
103 # endif
104
105 # ifdef HAVE_TLS_SUPPORT
106 #  ifndef __ASSEMBLER__
107 #   define SINGLE_THREAD_P                                              \
108   __builtin_expect (THREAD_GETMEM (THREAD_SELF, p_multiple_threads) == 0, 1)
109 #  else
110 #   define SINGLE_THREAD_P                                              \
111   lwz 10,MULTIPLE_THREADS_OFFSET(2);                                    \
112   cmpwi 10,0
113 #  endif
114 # else
115 #  if !defined NOT_IN_libc
116 #   define __local_multiple_threads __libc_multiple_threads
117 #  else
118 #   define __local_multiple_threads __librt_multiple_threads
119 #  endif
120 #  ifndef __ASSEMBLER__
121 extern int __local_multiple_threads attribute_hidden;
122 #   define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
123 #  else
124 #   if !defined __PIC__
125 #    define SINGLE_THREAD_P                                             \
126   lis 10,__local_multiple_threads@ha;                                   \
127   lwz 10,__local_multiple_threads@l(10);                                \
128   cmpwi 10,0
129 #   else
130 #    ifdef HAVE_ASM_PPC_REL16
131 #     define SINGLE_THREAD_P                                            \
132   mflr 9;                                                               \
133   bcl 20,31,1f;                                                         \
134 1:mflr 10;                                                              \
135   addis 10,10,__local_multiple_threads-1b@ha;                           \
136   lwz 10,__local_multiple_threads-1b@l(10);                             \
137   mtlr 9;                                                               \
138   cmpwi 10,0
139 #    else
140 #     define SINGLE_THREAD_P                                            \
141   mflr 9;                                                               \
142   bl _GLOBAL_OFFSET_TABLE_@local-4;                                     \
143   mflr 10;                                                              \
144   mtlr 9;                                                               \
145   lwz 10,__local_multiple_threads@got(10);                              \
146   lwz 10,0(10);                                                         \
147   cmpwi 10,0
148 #    endif
149 #   endif
150 #  endif
151 # endif
152
153 #elif !defined __ASSEMBLER__
154
155 /* This code should never be used but we define it anyhow.  */
156 # define SINGLE_THREAD_P (1)
157
158 #endif