~ubuntu-branches/ubuntu/quantal/uclibc/quantal

« back to all changes in this revision

Viewing changes to libpthread/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h

  • Committer: Bazaar Package Importer
  • Author(s): Hector Oron
  • Date: 2011-06-11 03:06:20 UTC
  • mfrom: (1.1.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20110611030620-ywjfvyuqvrpsm282
Tags: 0.9.32-1
* New upstream release
* Add myself as maintainer
* Bump standards version 
* Add Vcs-Git, Vcs-Browser and Homepage fields
* Add watch file 

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* Cancellable system call stubs.  Linux/PowerPC64 version.
 
2
   Copyright (C) 2003, 2004, 2006 Free Software Foundation, Inc.
 
3
   This file is part of the GNU C Library.
 
4
   Contributed by Franz Sirl <Franz.Sirl-kernel@lauterbach.com>, 2003.
 
5
 
 
6
   The GNU C Library is free software; you can redistribute it and/or
 
7
   modify it under the terms of the GNU Lesser General Public
 
8
   License as published by the Free Software Foundation; either
 
9
   version 2.1 of the License, or (at your option) any later version.
 
10
 
 
11
   The GNU C Library is distributed in the hope that it will be useful,
 
12
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 
13
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
14
   Lesser General Public License for more details.
 
15
 
 
16
   You should have received a copy of the GNU Lesser General Public
 
17
   License along with the GNU C Library; if not, write to the Free
 
18
   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA
 
19
   02110-1301 USA.  */
 
20
 
 
21
#include <sysdep.h>
 
22
#include <tls.h>
 
23
#ifndef __ASSEMBLER__
 
24
# include <pthreadP.h>
 
25
#endif
 
26
 
 
27
#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
 
28
 
 
29
# ifdef HAVE_ASM_GLOBAL_DOT_NAME
 
30
#  define DASHDASHPFX(str) .__##str
 
31
# else
 
32
#  define DASHDASHPFX(str) __##str
 
33
# endif
 
34
 
 
35
# undef PSEUDO
 
36
# define PSEUDO(name, syscall_name, args)                               \
 
37
  .section ".text";                                                     \
 
38
  ENTRY (name)                                                          \
 
39
    SINGLE_THREAD_P;                                                    \
 
40
    bne- .Lpseudo_cancel;                                               \
 
41
  .type DASHDASHPFX(syscall_name##_nocancel),@function;                 \
 
42
  .globl DASHDASHPFX(syscall_name##_nocancel);                          \
 
43
  DASHDASHPFX(syscall_name##_nocancel):                                 \
 
44
    DO_CALL (SYS_ify (syscall_name));                                   \
 
45
    PSEUDO_RET;                                                         \
 
46
  .size DASHDASHPFX(syscall_name##_nocancel),.-DASHDASHPFX(syscall_name##_nocancel);    \
 
47
  .Lpseudo_cancel:                                                      \
 
48
    stdu 1,-128(1);                                                     \
 
49
    cfi_adjust_cfa_offset (128);                                        \
 
50
    mflr 9;                                                             \
 
51
    std  9,128+16(1);                                                   \
 
52
    cfi_offset (lr, 16);                                                \
 
53
    DOCARGS_##args;     /* save syscall args around CENABLE.  */        \
 
54
    CENABLE;                                                            \
 
55
    std  3,72(1);       /* store CENABLE return value (MASK).  */       \
 
56
    UNDOCARGS_##args;   /* restore syscall args.  */                    \
 
57
    DO_CALL (SYS_ify (syscall_name));                                   \
 
58
    mfcr 0;             /* save CR/R3 around CDISABLE.  */              \
 
59
    std  3,64(1);                                                       \
 
60
    std  0,8(1);                                                        \
 
61
    ld   3,72(1);       /* pass MASK to CDISABLE.  */                   \
 
62
    CDISABLE;                                                           \
 
63
    ld   9,128+16(1);                                                   \
 
64
    ld   0,8(1);        /* restore CR/R3. */                            \
 
65
    ld   3,64(1);                                                       \
 
66
    mtlr 9;                                                             \
 
67
    mtcr 0;                                                             \
 
68
    addi 1,1,128;
 
69
 
 
70
# define DOCARGS_0
 
71
# define UNDOCARGS_0
 
72
 
 
73
# define DOCARGS_1      std 3,80(1); DOCARGS_0
 
74
# define UNDOCARGS_1    ld 3,80(1); UNDOCARGS_0
 
75
 
 
76
# define DOCARGS_2      std 4,88(1); DOCARGS_1
 
77
# define UNDOCARGS_2    ld 4,88(1); UNDOCARGS_1
 
78
 
 
79
# define DOCARGS_3      std 5,96(1); DOCARGS_2
 
80
# define UNDOCARGS_3    ld 5,96(1); UNDOCARGS_2
 
81
 
 
82
# define DOCARGS_4      std 6,104(1); DOCARGS_3
 
83
# define UNDOCARGS_4    ld 6,104(1); UNDOCARGS_3
 
84
 
 
85
# define DOCARGS_5      std 7,112(1); DOCARGS_4
 
86
# define UNDOCARGS_5    ld 7,112(1); UNDOCARGS_4
 
87
 
 
88
# define DOCARGS_6      std 8,120(1); DOCARGS_5
 
89
# define UNDOCARGS_6    ld 8,120(1); UNDOCARGS_5
 
90
 
 
91
# ifdef IS_IN_libpthread
 
92
#  define CENABLE       bl JUMPTARGET(__pthread_enable_asynccancel)
 
93
#  define CDISABLE      bl JUMPTARGET(__pthread_disable_asynccancel)
 
94
# elif !defined NOT_IN_libc
 
95
#  define CENABLE       bl JUMPTARGET(__libc_enable_asynccancel)
 
96
#  define CDISABLE      bl JUMPTARGET(__libc_disable_asynccancel)
 
97
# elif defined IS_IN_librt
 
98
#  define CENABLE       bl JUMPTARGET(__librt_enable_asynccancel)
 
99
#  define CDISABLE      bl JUMPTARGET(__librt_disable_asynccancel)
 
100
# else
 
101
#  error Unsupported library
 
102
# endif
 
103
 
 
104
# ifndef __ASSEMBLER__
 
105
#  define SINGLE_THREAD_P                                               \
 
106
  __builtin_expect (THREAD_GETMEM (THREAD_SELF,                         \
 
107
                                   header.multiple_threads) == 0, 1)
 
108
# else
 
109
#   define SINGLE_THREAD_P                                              \
 
110
  lwz   10,MULTIPLE_THREADS_OFFSET(13);                         \
 
111
  cmpwi 10,0
 
112
# endif
 
113
 
 
114
#elif !defined __ASSEMBLER__
 
115
 
 
116
# define SINGLE_THREAD_P (1)
 
117
# define NO_CANCELLATION 1
 
118
 
 
119
#endif
 
120
 
 
121
#ifndef __ASSEMBLER__
 
122
# define RTLD_SINGLE_THREAD_P \
 
123
  __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
 
124
                                   header.multiple_threads) == 0, 1)
 
125
#endif