Define thread types also for POSIX95.
[kopensolaris-gnu/glibc.git] / sysdeps / unix / sysv / linux / ia64 / sysdep.h
1 /* Copyright (C) 1999, 2000 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Written by Jes Sorensen, <Jes.Sorensen@cern.ch>, April 1999.
4    Based on code originally written by David Mosberger-Tang
5
6    The GNU C Library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU Library General Public License as
8    published by the Free Software Foundation; either version 2 of the
9    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    Library General Public License for more details.
15
16    You should have received a copy of the GNU Library General Public
17    License along with the GNU C Library; see the file COPYING.LIB.  If not,
18    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19    Boston, MA 02111-1307, USA.  */
20
21 #include <sysdeps/unix/sysdep.h>
22 #include <sysdeps/ia64/sysdep.h>
23
24 /* For Linux we can use the system call table in the header file
25         /usr/include/asm/unistd.h
26    of the kernel.  But these symbols do not follow the SYS_* syntax
27    so we have to redefine the `SYS_ify' macro here.  */
28 #undef SYS_ify
29 #ifdef __STDC__
30 # define SYS_ify(syscall_name)  __NR_##syscall_name
31 #else
32 # define SYS_ify(syscall_name)  __NR_/**/syscall_name
33 #endif
34
35 #ifdef __ASSEMBLER__
36
37 /* Linux uses a negative return value to indicate syscall errors, unlike
38    most Unices, which use the condition codes' carry flag.
39
40    Since version 2.1 the return value of a system call might be negative
41    even if the call succeeded.  E.g., the `lseek' system call might return
42    a large offset.  Therefore we must not anymore test for < 0, but test
43    for a real error by making sure the value in %d0 is a real error
44    number.  Linus said he will make sure the no syscall returns a value
45    in -1 .. -4095 as a valid result so we can savely test with -4095.  */
46
47 /* We don't want the label for the error handler to be visible in the symbol
48    table when we define it here.  */
49 #define SYSCALL_ERROR_LABEL __syscall_error
50
51 #ifdef PROF
52 #error "define CALL_MCOUNT"
53 #else
54 #define CALL_MCOUNT
55 #endif
56
57
58 #undef PSEUDO
59 #define PSEUDO(name, syscall_name, args)        \
60   ENTRY(name)                                   \
61     DO_CALL (SYS_ify(syscall_name));            \
62         cmp.eq p6,p0=-1,r10;;                   \
63 (p6)    br.cond.spnt.few __syscall_error;
64
65 #define ENTRY(name)                             \
66         .psr abi64;                             \
67         .psr lsb;                               \
68         .lsb;                                   \
69         .text;                                  \
70         .align 32;                              \
71         .proc C_SYMBOL_NAME(name);              \
72         .global C_SYMBOL_NAME(name);            \
73         C_LABEL(name)                           \
74         CALL_MCOUNT
75
76 #define DO_CALL(num)                            \
77         mov r15=num;                            \
78         break __BREAK_SYSCALL;
79
80 #undef PSEUDO_END
81 #define PSEUDO_END(name)        .endp C_SYMBOL_NAME(name);
82
83 #undef END
84 #define END(name)                                               \
85         .size   C_SYMBOL_NAME(name), . - C_SYMBOL_NAME(name) ;  \
86         .endp   C_SYMBOL_NAME(name)
87
88 #define ret                     br.ret.sptk.few b0
89
90 #else /* not __ASSEMBLER__ */
91
92 /* Define a macro which expands into the inline wrapper code for a system
93    call.  */
94 #if 0
95 #undef INLINE_SYSCALL
96 #define INLINE_SYSCALL(name, nr, args...)       __##name (args)
97 #endif
98
99 #endif /* not __ASSEMBLER__ */