OSDN Git Service

0e9d2634ae68d51634c1554039bd62e624fc272f
[uclinux-h8/uClibc.git] / libpthread / nptl / sysdeps / unix / sysv / linux / sparc / sparc64 / sysdep-cancel.h
1 /* Copyright (C) 2002, 2003, 2004, 2006 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
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 <pthreadP.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         .text;                                  \
30         .globl          __syscall_error;        \
31 ENTRY(name)                                     \
32         ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1;\
33         brnz,pn %g1, 1f;                        \
34 .type   __##syscall_name##_nocancel,@function;  \
35 .globl  __##syscall_name##_nocancel;            \
36 __##syscall_name##_nocancel:                    \
37          mov SYS_ify(syscall_name), %g1;        \
38         ta 0x6d;                                \
39         bcc,pt %xcc, 8f;                        \
40          mov %o7, %g1;                          \
41         call __syscall_error;                   \
42          mov %g1, %o7;                          \
43 8:      jmpl %o7 + 8, %g0;                      \
44          nop;                                   \
45 .size   __##syscall_name##_nocancel,.-__##syscall_name##_nocancel;\
46 1:      save %sp, -192, %sp;                    \
47         cfi_def_cfa_register(%fp);              \
48         cfi_window_save;                        \
49         cfi_register(%o7, %i7);                 \
50         CENABLE;                                \
51          nop;                                   \
52         mov %o0, %l0;                           \
53         COPY_ARGS_##args                        \
54         mov SYS_ify(syscall_name), %g1;         \
55         ta 0x6d;                                \
56         bcc,pt %xcc, 1f;                        \
57          mov %o0, %l1;                          \
58         CDISABLE;                               \
59          mov %l0, %o0;                          \
60         call __syscall_error;                   \
61          mov %l1, %o0;                          \
62         ba,pt %xcc, 2f;                         \
63          mov -1, %l1;                           \
64 1:      CDISABLE;                               \
65          mov %l0, %o0;                          \
66 2:      jmpl %i7 + 8, %g0;                      \
67          restore %g0, %l1, %o0;
68
69 # ifdef IS_IN_libpthread
70 #  define CENABLE       call __pthread_enable_asynccancel
71 #  define CDISABLE      call __pthread_disable_asynccancel
72 # elif !defined NOT_IN_libc
73 #  define CENABLE       call __libc_enable_asynccancel
74 #  define CDISABLE      call __libc_disable_asynccancel
75 # elif defined IS_IN_librt
76 #  define CENABLE       call __librt_enable_asynccancel
77 #  define CDISABLE      call __librt_disable_asynccancel
78 # else
79 #  error Unsupported library
80 # endif
81
82 #define COPY_ARGS_0     /* Nothing */
83 #define COPY_ARGS_1     COPY_ARGS_0 mov %i0, %o0;
84 #define COPY_ARGS_2     COPY_ARGS_1 mov %i1, %o1;
85 #define COPY_ARGS_3     COPY_ARGS_2 mov %i2, %o2;
86 #define COPY_ARGS_4     COPY_ARGS_3 mov %i3, %o3;
87 #define COPY_ARGS_5     COPY_ARGS_4 mov %i4, %o4;
88 #define COPY_ARGS_6     COPY_ARGS_5 mov %i5, %o5;
89
90 # ifndef __ASSEMBLER__
91 #  define SINGLE_THREAD_P \
92   __builtin_expect (THREAD_GETMEM (THREAD_SELF,                               \
93                                    header.multiple_threads) == 0, 1)
94 # else
95 #  define SINGLE_THREAD_P ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1
96 # endif
97
98 #elif !defined __ASSEMBLER__
99
100 # define SINGLE_THREAD_P (1)
101 # define NO_CANCELLATION 1
102
103 #endif
104
105 #ifndef __ASSEMBLER__
106 # define RTLD_SINGLE_THREAD_P \
107   __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
108                                    header.multiple_threads) == 0, 1)
109 #endif