From: David Mosberger <davidm@napali.hpl.hp.com>
To: drepper@redhat.com, Jakub Jelinek <jakub@redhat.com>
Cc: davidm@hpl.hp.com, libc-hacker@sources.redhat.com
Subject: Re: new syscall stub support for ia64 libc
Date: Wed, 12 Nov 2003 22:53:00 -0000 [thread overview]
Message-ID: <16306.47596.371542.356256@napali.hpl.hp.com> (raw)
In-Reply-To: <20031031144724.GY12344@sunsite.ms.mff.cuni.cz>
OK, here is the latest patch to add the new syscall stub support for
ia64. I hope this will be the second-last version. Assuming there
are no huge complaints, I hope the next patch will be the final one
that can be applied. The attached patch seems to work reasonably
well:
- with linuxthreads, make check shows one failure in tst-numeric
(probably an existing issue)
- with nptl, make check shows failures in tst-cancel{6,9,17};
I'll need to look into these as it's likely that I botched
something in sysdep-cancel.h.
What's changed:
- The sysinfo pointer is now stored in tcbhead_t.private, as per
Jakub's suggestion (this means the offset changes from -8 to +8).
The new THREAD_SELF_SYSINFO and THREAD_SYSINFO macros were added
to both x86 and ia64, so the patch shouldn't break x86 (or any other
platform for that matter).
- As per Rich's suggestion, I tweaked DO_INLINE_SYSCALL so GCC
takes care of loading the sysinfo-pointer into the branch-register.
Unfortunately, GCC 3.3.2 inserts an unnecessary stop-bit between
the load to the branch register and the indirect branch, but that's
a compiler bug, so I'm not going to worry about it as far as libc
is concerned.
- The inline-syscall macros are now in a separate file,
sysdep-inline.h which makes it possible for lowlevellock.h and
sysdep.h to share the necessary macros. Also, the thread-pointer
variable __thread_self now gets declared here as a "void *" in
sysdep-inline.h. We can argue whether this is the perfect place,
but it's clear to me that we need to declare the variable in _some_
header-file that can be included anywhere, as anything else causes
lots of headache.
Please take a good look and let me know if you find any issues.
Thanks!
--david
Index: elf/rtld.c
--- elf/rtld.c
+++ elf/rtld.c
@@ -1169,7 +1169,7 @@
l->l_ldnum = ph->p_memsz / sizeof (ElfW(Dyn));
break;
}
- if (ph->p_type == PT_LOAD)
+ if (i == 0 && ph->p_type == PT_LOAD)
assert ((void *) ph->p_vaddr == GL(dl_sysinfo_dso));
}
elf_get_dynamic_info (l, dyn_temp);
Index: linuxthreads/sysdeps/ia64/pt-machine.h
--- linuxthreads/sysdeps/ia64/pt-machine.h
+++ linuxthreads/sysdeps/ia64/pt-machine.h
@@ -22,6 +22,7 @@
#define _PT_MACHINE_H 1
#include <ia64intrin.h>
+#include <sysdep-inline.h>
#ifndef PT_EI
# define PT_EI extern inline __attribute__ ((always_inline))
@@ -51,11 +52,6 @@
#define CURRENT_STACK_FRAME stack_pointer
register char *stack_pointer __asm__ ("sp");
-
-/* Register r13 (tp) is reserved by the ABI as "thread pointer". */
-struct _pthread_descr_struct;
-register struct _pthread_descr_struct *__thread_self __asm__("r13");
-
/* Return the thread descriptor for the current thread. */
#define THREAD_SELF __thread_self
Index: linuxthreads/sysdeps/unix/sysv/linux/ia64/dl-sysdep.h
--- /dev/null
+++ linuxthreads/sysdeps/unix/sysv/linux/ia64/dl-sysdep.h
@@ -0,0 +1,45 @@
+/* System-specific settings for dynamic linker code. IA-64 version.
+ Copyright (C) 2003 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#ifndef _DL_SYSDEP_H
+#define _DL_SYSDEP_H 1
+
+#define NEED_DL_SYSINFO 1
+#undef USE_DL_SYSINFO
+
+#if defined NEED_DL_SYSINFO && !defined __ASSEMBLER__
+/* Don't declare this as a function---we want it's entry-point, not
+ it's function descriptor... */
+extern int _dl_sysinfo_break attribute_hidden;
+# define DL_SYSINFO_DEFAULT ((uintptr_t) &_dl_sysinfo_break)
+# define DL_SYSINFO_IMPLEMENTATION \
+ asm (".text\n\t" \
+ ".hidden _dl_sysinfo_break\n\t" \
+ ".proc _dl_sysinfo_break\n\t" \
+ "_dl_sysinfo_break:\n\t" \
+ ".prologue\n\t" \
+ ".altrp b6\n\t" \
+ ".body\n\t" \
+ "break 0x100000;\n\t" \
+ "br.ret.sptk.many b6;\n\t" \
+ ".endp _dl_sysinfo_break" \
+ ".previous");
+#endif
+
+#endif /* dl-sysdep.h */
Index: nptl/ChangeLog
--- nptl/ChangeLog
+++ nptl/ChangeLog
@@ -1 +1,9 @@
+2003-11-12 <davidm@hpl.hp.com>
+
+ * sysdeps/i386/tls.h (THREAD_SELF_SYSINFO): New macro.
+ (THREAD_SYSINFO): Ditto.
+
+ * sysdeps/ia64/tls.h (THREAD_SELF_SYSINFO): New macro.
+ (THREAD_SYSINFO): Ditto.
+
2003-11-06 Ulrich Drepper <drepper@redhat.com>
Index: nptl/allocatestack.c
--- nptl/allocatestack.c
+++ nptl/allocatestack.c
@@ -352,7 +352,7 @@
#ifdef NEED_DL_SYSINFO
/* Copy the sysinfo value from the parent. */
- pd->header.sysinfo = THREAD_GETMEM (THREAD_SELF, header.sysinfo);
+ THREAD_SYSINFO(pd) = THREAD_SELF_SYSINFO;
#endif
/* The process ID is also the same as that of the caller. */
@@ -488,7 +488,7 @@
#ifdef NEED_DL_SYSINFO
/* Copy the sysinfo value from the parent. */
- pd->header.sysinfo = THREAD_GETMEM (THREAD_SELF, header.sysinfo);
+ THREAD_SYSINFO(pd) = THREAD_SELF_SYSINFO;
#endif
/* The process ID is also the same as that of the caller. */
Index: nptl/descr.h
Index: nptl/sysdeps/i386/tls.h
--- nptl/sysdeps/i386/tls.h
+++ nptl/sysdeps/i386/tls.h
@@ -128,6 +128,8 @@
# define GET_DTV(descr) \
(((tcbhead_t *) (descr))->dtv)
+#define THREAD_SELF_SYSINFO THREAD_GETMEM (THREAD_SELF, header.sysinfo)
+#define THREAD_SYSINFO(pd) ((pd)->header.sysinfo)
/* Macros to load from and store into segment registers. */
# ifndef TLS_GET_GS
Index: nptl/sysdeps/ia64/tcb-offsets.sym
--- nptl/sysdeps/ia64/tcb-offsets.sym
+++ nptl/sysdeps/ia64/tcb-offsets.sym
@@ -2,3 +2,4 @@
#include <tls.h>
MULTIPLE_THREADS_OFFSET offsetof (struct pthread, header.multiple_threads) - sizeof (struct pthread)
+SYSINFO_OFFSET offsetof (tcbhead_t, private)
Index: nptl/sysdeps/ia64/tls.h
--- nptl/sysdeps/ia64/tls.h
+++ nptl/sysdeps/ia64/tls.h
@@ -64,8 +64,6 @@
/* Get system call information. */
# include <sysdep.h>
-register struct pthread *__thread_self __asm__("r13");
-
/* This is the size of the initial TCB. */
# define TLS_INIT_TCB_SIZE sizeof (tcbhead_t)
@@ -100,18 +98,27 @@
# define GET_DTV(descr) \
(((tcbhead_t *) (descr))->dtv)
+#define THREAD_SELF_SYSINFO (((tcbhead_t *) __thread_self)->private)
+#define THREAD_SYSINFO(pd) (((tcbhead_t *) ((pd) + 1))->private)
+
+#if defined NEED_DL_SYSINFO
+# define INIT_SYSINFO THREAD_SELF_SYSINFO = GL(dl_sysinfo)
+#else
+# define INIT_SYSINFO NULL
+#endif
+
/* Code to initially initialize the thread pointer. This might need
special attention since 'errno' is not yet available and if the
operation can cause a failure 'errno' must not be touched. */
# define TLS_INIT_TP(thrdescr, secondcall) \
- (__thread_self = (thrdescr), NULL)
+ (__thread_self = (thrdescr), INIT_SYSINFO, NULL)
/* Return the address of the dtv for the current thread. */
# define THREAD_DTV() \
(((tcbhead_t *)__thread_self)->dtv)
/* Return the thread descriptor for the current thread. */
-# define THREAD_SELF (__thread_self - 1)
+# define THREAD_SELF ((struct pthread *) __thread_self - 1)
/* Magic for libthread_db to know how to do THREAD_SELF. */
# define DB_THREAD_SELF REGISTER (64, 13 * 8, -sizeof (struct pthread))
Index: nptl/sysdeps/pthread/createthread.c
--- nptl/sysdeps/pthread/createthread.c
+++ nptl/sysdeps/pthread/createthread.c
@@ -226,7 +226,7 @@
}
#ifdef NEED_DL_SYSINFO
- assert (THREAD_GETMEM (THREAD_SELF, header.sysinfo) == pd->header.sysinfo);
+ assert (THREAD_SELF_SYSINFO == THREAD_SYSINFO(pd));
#endif
/* Actually create the thread. */
Index: nptl/sysdeps/unix/sysv/linux/ia64/lowlevellock.h
--- nptl/sysdeps/unix/sysv/linux/ia64/lowlevellock.h
+++ nptl/sysdeps/unix/sysv/linux/ia64/lowlevellock.h
@@ -26,7 +26,7 @@
#include <ia64intrin.h>
#include <atomic.h>
-#define SYS_futex 1230
+#define __NR_futex 1230
#define FUTEX_WAIT 0
#define FUTEX_WAKE 1
#define FUTEX_REQUEUE 3
@@ -34,81 +34,30 @@
/* Initializer for compatibility lock. */
#define LLL_MUTEX_LOCK_INITIALIZER (0)
-#define lll_futex_clobbers \
- "out5", "out6", "out7", \
- /* Non-stacked integer registers, minus r8, r10, r15. */ \
- "r2", "r3", "r9", "r11", "r12", "r13", "r14", "r16", "r17", "r18", \
- "r19", "r20", "r21", "r22", "r23", "r24", "r25", "r26", "r27", \
- "r28", "r29", "r30", "r31", \
- /* Predicate registers. */ \
- "p6", "p7", "p8", "p9", "p10", "p11", "p12", "p13", "p14", "p15", \
- /* Non-rotating fp registers. */ \
- "f6", "f7", "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", \
- /* Branch registers. */ \
- "b6", "b7", \
- "memory"
+#define IA64_USE_NEW_STUB
+#include <sysdep-inline.h>
#define lll_futex_wait(futex, val) lll_futex_timed_wait (futex, val, 0)
-#define lll_futex_timed_wait(futex, val, timespec) \
- ({ \
- register long int __o0 asm ("out0") = (long int) (futex); \
- register long int __o1 asm ("out1") = FUTEX_WAIT; \
- register int __o2 asm ("out2") = (int) (val); \
- register long int __o3 asm ("out3") = (long int) (timespec); \
- register long int __r8 asm ("r8"); \
- register long int __r10 asm ("r10"); \
- register long int __r15 asm ("r15") = SYS_futex; \
- \
- __asm __volatile ("break %7;;" \
- : "=r" (__r8), "=r" (__r10), "=r" (__r15), \
- "=r" (__o0), "=r" (__o1), "=r" (__o2), "=r" (__o3) \
- : "i" (0x100000), "2" (__r15), "3" (__o0), "4" (__o1), \
- "5" (__o2), "6" (__o3) \
- : "out4", lll_futex_clobbers); \
- __r10 == -1 ? -__r8 : __r8; \
- })
-
-
-#define lll_futex_wake(futex, nr) \
- ({ \
- register long int __o0 asm ("out0") = (long int) (futex); \
- register long int __o1 asm ("out1") = FUTEX_WAKE; \
- register int __o2 asm ("out2") = (int) (nr); \
- register long int __r8 asm ("r8"); \
- register long int __r10 asm ("r10"); \
- register long int __r15 asm ("r15") = SYS_futex; \
- \
- __asm __volatile ("break %6;;" \
- : "=r" (__r8), "=r" (__r10), "=r" (__r15), \
- "=r" (__o0), "=r" (__o1), "=r" (__o2) \
- : "i" (0x100000), "2" (__r15), "3" (__o0), "4" (__o1), \
- "5" (__o2) \
- : "out3", "out4", lll_futex_clobbers); \
- __r10 == -1 ? -__r8 : __r8; \
- })
-
-
-#define lll_futex_requeue(futex, nr_wake, nr_move, mutex) \
- ({ \
- register long int __o0 asm ("out0") = (long int) (futex); \
- register long int __o1 asm ("out1") = FUTEX_REQUEUE; \
- register int __o2 asm ("out2") = (int) (nr_wake); \
- register int __o3 asm ("out3") = (int) (nr_move); \
- register long int __o4 asm ("out4") = (long int) (mutex); \
- register long int __r8 asm ("r8"); \
- register long int __r10 asm ("r10"); \
- register long int __r15 asm ("r15") = SYS_futex; \
- \
- __asm __volatile ("break %8;;" \
- : "=r" (__r8), "=r" (__r10), "=r" (__r15), \
- "=r" (__o0), "=r" (__o1), "=r" (__o2), "=r" (__o3), \
- "=r" (__o4) \
- : "i" (0x100000), "2" (__r15), "3" (__o0), "4" (__o1), \
- "5" (__o2), "6" (__o3), "7" (__o4) \
- : lll_futex_clobbers); \
- __r10 == -1 ? -__r8 : __r8; \
- })
+#define lll_futex_timed_wait(ftx, val, timespec) \
+({ \
+ DO_INLINE_SYSCALL(futex, 4, (long) (ftx), FUTEX_WAIT, (int) (val), \
+ (long) (timespec)); \
+ _r10 == -1 ? -_retval : _retval; \
+})
+
+#define lll_futex_wake(ftx, nr) \
+({ \
+ DO_INLINE_SYSCALL(futex, 3, (long) (ftx), FUTEX_WAKE, (int) (nr)); \
+ _r10 == -1 ? -_retval : _retval; \
+})
+
+#define lll_futex_requeue(ftx, nr_wake, nr_move, mutex) \
+({ \
+ DO_INLINE_SYSCALL(futex, 5, (long) (ftx), FUTEX_REQUEUE, (int) (nr_wake), \
+ (int) (nr_move), (long) (mutex)); \
+ _r10 == -1 ? -_retval : _retval; \
+})
static inline int
Index: nptl/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h
--- nptl/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h
+++ nptl/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h
@@ -29,13 +29,21 @@
# define PSEUDO(name, syscall_name, args) \
.text; \
ENTRY (name) \
- adds r14 = MULTIPLE_THREADS_OFFSET, r13;; \
+ .prologue; \
+ adds r2 = SYSINFO_OFFSET, r13; \
+ adds r14 = MULTIPLE_THREADS_OFFSET, r13; \
+ .save ar.pfs, r11; \
+ mov r11 = ar.pfs;; \
+ .body; \
ld4 r14 = [r14]; \
+ ld8 r2 = [r2]; \
mov r15 = SYS_ify(syscall_name);; \
cmp4.ne p6, p7 = 0, r14; \
-(p6) br.cond.spnt .Lpseudo_cancel;; \
- break __BREAK_SYSCALL;; \
- cmp.eq p6,p0=-1,r10; \
+ mov b7 = r2; \
+(p6) br.cond.spnt .Lpseudo_cancel; \
+ br.call.sptk.many b6 = b7;; \
+ mov ar.pfs = r11; \
+ cmp.eq p6,p0 = -1, r10; \
(p6) br.cond.spnt.few __syscall_error; \
ret;; \
.endp name; \
@@ -45,17 +53,20 @@
__GC_##name: \
.Lpseudo_cancel: \
.prologue; \
- .regstk args, 5, args, 0; \
+ .regstk args, 6, args, 0; \
.save ar.pfs, loc0; \
- alloc loc0 = ar.pfs, args, 5, args, 0; \
+ alloc loc0 = ar.pfs, args, 6, args, 0; \
+ adds loc5 = SYSINFO_OFFSET, r13; \
.save rp, loc1; \
mov loc1 = rp;; \
.body; \
+ ld8 loc5 = [loc5]; \
CENABLE;; \
mov loc2 = r8; \
+ mov b7 = loc5; \
COPY_ARGS_##args \
mov r15 = SYS_ify(syscall_name); \
- break __BREAK_SYSCALL;; \
+ br.call.sptk.many b6 = b7;; \
mov loc3 = r8; \
mov loc4 = r10; \
mov out0 = loc2; \
Index: sysdeps/ia64/elf/start.S
Index: sysdeps/unix/sysv/linux/ia64/brk.S
--- sysdeps/unix/sysv/linux/ia64/brk.S
+++ sysdeps/unix/sysv/linux/ia64/brk.S
@@ -35,19 +35,17 @@
weak_alias (__curbrk, ___brk_addr)
LEAF(__brk)
- mov r15=__NR_brk
- break.i __BREAK_SYSCALL
+ .regstk 1, 0, 0, 0
+ DO_CALL(__NR_brk)
+ cmp.ltu p6, p0 = ret0, in0
+ addl r9 = @ltoff(__curbrk), gp
;;
- cmp.ltu p6,p0=ret0,r32 /* r32 is the input register, even though we
- haven't allocated a frame */
- addl r9=@ltoff(__curbrk),gp
- ;;
- ld8 r9=[r9]
-(p6) mov ret0=ENOMEM
+ ld8 r9 = [r9]
+(p6) mov ret0 = ENOMEM
(p6) br.cond.spnt.few __syscall_error
;;
- st8 [r9]=ret0
- mov ret0=0
+ st8 [r9] = ret0
+ mov ret0 = 0
ret
END(__brk)
Index: sysdeps/unix/sysv/linux/ia64/getcontext.S
--- sysdeps/unix/sysv/linux/ia64/getcontext.S
+++ sysdeps/unix/sysv/linux/ia64/getcontext.S
@@ -35,26 +35,27 @@
ENTRY(__getcontext)
.prologue
- alloc r16 = ar.pfs, 1, 0, 4, 0
+ .body
+ alloc r11 = ar.pfs, 1, 0, 4, 0
// sigprocmask (SIG_BLOCK, NULL, &sc->sc_mask):
- mov r2 = SC_MASK
- mov r15 = __NR_rt_sigprocmask
- ;;
+ mov r3 = SC_MASK
mov out0 = SIG_BLOCK
- mov out1 = 0
- add out2 = r2, in0
- mov out3 = 8 // sizeof kernel sigset_t
- break __BREAK_SYSCALL
flushrs // save dirty partition on rbs
+ mov out1 = 0
+ add out2 = r3, in0
+
+ mov out3 = 8 // sizeof kernel sigset_t
+ DO_CALL(__NR_rt_sigprocmask)
mov.m rFPSR = ar.fpsr
mov.m rRSC = ar.rsc
add r2 = SC_GR+1*8, r32
;;
mov.m rBSP = ar.bsp
+ .prologue
.save ar.unat, rUNAT
mov.m rUNAT = ar.unat
.body
@@ -63,7 +64,7 @@
.mem.offset 0,0; st8.spill [r2] = r1, (5*8 - 1*8)
.mem.offset 8,0; st8.spill [r3] = r4, 16
- mov.i rPFS = ar.pfs
+ mov rPFS = r11
;;
.mem.offset 0,0; st8.spill [r2] = r5, 16
.mem.offset 8,0; st8.spill [r3] = r6, 48
Index: sysdeps/unix/sysv/linux/ia64/setcontext.S
--- sysdeps/unix/sysv/linux/ia64/setcontext.S
+++ sysdeps/unix/sysv/linux/ia64/setcontext.S
@@ -32,20 +32,21 @@
other than the PRESERVED state. */
ENTRY(__setcontext)
- alloc r16 = ar.pfs, 1, 0, 4, 0
+ .prologue
+ .body
+ alloc r11 = ar.pfs, 1, 0, 4, 0
// sigprocmask (SIG_SETMASK, &sc->sc_mask, NULL):
- mov r2 = SC_MASK
- mov r15 = __NR_rt_sigprocmask
- ;;
+ mov r3 = SC_MASK
mov out0 = SIG_SETMASK
- add out1 = r2, in0
+ ;;
+ add out1 = r3, in0
mov out2 = 0
mov out3 = 8 // sizeof kernel sigset_t
invala
- break __BREAK_SYSCALL
+ DO_CALL(__NR_rt_sigprocmask)
add r2 = SC_NAT, r32
add r3 = SC_RNAT, r32 // r3 <- &sc_ar_rnat
Index: sysdeps/unix/sysv/linux/ia64/sysdep-inline.h
--- /dev/null
+++ sysdeps/unix/sysv/linux/ia64/sysdep-inline.h
@@ -0,0 +1,155 @@
+#ifndef _LINUX_IA64_SYSDEP_INLINE_H
+#define _LINUX_IA64_SYSDEP_INLINE_H 1
+
+/* On IA-64 we have stacked registers for passing arguments. The
+ "out" registers end up being the called function's "in"
+ registers.
+
+ Also, since we have plenty of registers we have two return values
+ from a syscall. r10 is set to -1 on error, whilst r8 contains the
+ (non-negative) errno on error or the return value on success.
+ */
+
+#include <dl-sysdep.h>
+
+#if defined USE_DL_SYSINFO \
+ && (!defined NOT_IN_libc || defined IS_IN_libpthread)
+# define IA64_USE_NEW_STUB
+#else
+# undef IA64_USE_NEW_STUB
+#endif
+
+#ifndef __ASSEMBLER__
+
+#include <asm/unistd.h>
+
+#define BREAK_INSN_1(num) "break " #num ";;\n\t"
+#define BREAK_INSN(num) BREAK_INSN_1(num)
+
+register void *__thread_self __asm__("r13");
+
+#ifdef IA64_USE_NEW_STUB
+
+struct _ia64_tcb {
+ void *dtv;
+ void *private;
+};
+
+#define DO_INLINE_SYSCALL(name, nr, args...) \
+ register long _r8 __asm ("r8"); \
+ register long _r10 __asm ("r10"); \
+ register long _r15 __asm ("r15") = __NR_##name; \
+ register void *_b7 __asm ("b7") = \
+ ((struct _ia64_tcb *) __thread_self)->private; \
+ long _retval; \
+ LOAD_ARGS_##nr (args); \
+ /* \
+ * Don't specify any unwind info here. We mark ar.pfs as \
+ * clobbered. This will force the compiler to save ar.pfs \
+ * somewhere and emit appropriate unwind info for that save. \
+ */ \
+ __asm __volatile ("br.call.sptk.many b6=%0;;\n" \
+ : "=b"(_b7), "=r" (_r8), "=r" (_r10), "=r" (_r15) \
+ ASM_OUTARGS_##nr \
+ : "0" (_b7), "3" (_r15) ASM_ARGS_##nr \
+ : "memory", "ar.pfs" ASM_CLOBBERS_##nr); \
+ _retval = _r8;
+
+#else /* !IA64_USE_NEW_STUB */
+
+#define DO_INLINE_SYSCALL(name, nr, args...) \
+ register long _r8 asm ("r8"); \
+ register long _r10 asm ("r10"); \
+ register long _r15 asm ("r15") = __NR_##name; \
+ long _retval; \
+ LOAD_ARGS_##nr (args); \
+ __asm __volatile (BREAK_INSN (__BREAK_SYSCALL) \
+ : "=r" (_r8), "=r" (_r10), "=r" (_r15) \
+ ASM_OUTARGS_##nr \
+ : "2" (_r15) ASM_ARGS_##nr \
+ : "memory" ASM_CLOBBERS_##nr); \
+ _retval = _r8;
+
+#endif /* !IA64_USE_NEW_STUB */
+
+#undef INTERNAL_SYSCALL_DECL
+#define INTERNAL_SYSCALL_DECL(err) long int err
+
+#undef INTERNAL_SYSCALL_ERROR_P
+#define INTERNAL_SYSCALL_ERROR_P(val, err) (err == -1)
+
+#undef INTERNAL_SYSCALL_ERRNO
+#define INTERNAL_SYSCALL_ERRNO(val, err) (val)
+
+#define LOAD_ARGS_0() do { } while (0)
+#define LOAD_ARGS_1(out0) \
+ register long _out0 asm ("out0") = (long) (out0); \
+ LOAD_ARGS_0 ()
+#define LOAD_ARGS_2(out0, out1) \
+ register long _out1 asm ("out1") = (long) (out1); \
+ LOAD_ARGS_1 (out0)
+#define LOAD_ARGS_3(out0, out1, out2) \
+ register long _out2 asm ("out2") = (long) (out2); \
+ LOAD_ARGS_2 (out0, out1)
+#define LOAD_ARGS_4(out0, out1, out2, out3) \
+ register long _out3 asm ("out3") = (long) (out3); \
+ LOAD_ARGS_3 (out0, out1, out2)
+#define LOAD_ARGS_5(out0, out1, out2, out3, out4) \
+ register long _out4 asm ("out4") = (long) (out4); \
+ LOAD_ARGS_4 (out0, out1, out2, out3)
+#define LOAD_ARGS_6(out0, out1, out2, out3, out4, out5) \
+ register long _out5 asm ("out5") = (long) (out5); \
+ LOAD_ARGS_5 (out0, out1, out2, out3, out4)
+
+#define ASM_OUTARGS_0
+#define ASM_OUTARGS_1 ASM_OUTARGS_0, "=r" (_out0)
+#define ASM_OUTARGS_2 ASM_OUTARGS_1, "=r" (_out1)
+#define ASM_OUTARGS_3 ASM_OUTARGS_2, "=r" (_out2)
+#define ASM_OUTARGS_4 ASM_OUTARGS_3, "=r" (_out3)
+#define ASM_OUTARGS_5 ASM_OUTARGS_4, "=r" (_out4)
+#define ASM_OUTARGS_6 ASM_OUTARGS_5, "=r" (_out5)
+
+#ifdef IA64_USE_NEW_STUB
+# define ASM_ARGS_0
+# define ASM_ARGS_1 ASM_ARGS_0, "4" (_out0)
+# define ASM_ARGS_2 ASM_ARGS_1, "5" (_out1)
+# define ASM_ARGS_3 ASM_ARGS_2, "6" (_out2)
+# define ASM_ARGS_4 ASM_ARGS_3, "7" (_out3)
+# define ASM_ARGS_5 ASM_ARGS_4, "8" (_out4)
+# define ASM_ARGS_6 ASM_ARGS_5, "9" (_out5)
+#else
+# define ASM_ARGS_0
+# define ASM_ARGS_1 ASM_ARGS_0, "3" (_out0)
+# define ASM_ARGS_2 ASM_ARGS_1, "4" (_out1)
+# define ASM_ARGS_3 ASM_ARGS_2, "5" (_out2)
+# define ASM_ARGS_4 ASM_ARGS_3, "6" (_out3)
+# define ASM_ARGS_5 ASM_ARGS_4, "7" (_out4)
+# define ASM_ARGS_6 ASM_ARGS_5, "8" (_out5)
+#endif
+
+#define ASM_CLOBBERS_0 ASM_CLOBBERS_1, "out0"
+#define ASM_CLOBBERS_1 ASM_CLOBBERS_2, "out1"
+#define ASM_CLOBBERS_2 ASM_CLOBBERS_3, "out2"
+#define ASM_CLOBBERS_3 ASM_CLOBBERS_4, "out3"
+#define ASM_CLOBBERS_4 ASM_CLOBBERS_5, "out4"
+#define ASM_CLOBBERS_5 ASM_CLOBBERS_6, "out5"
+#define ASM_CLOBBERS_6_COMMON , "out6", "out7", \
+ /* Non-stacked integer registers, minus r8, r10, r15. */ \
+ "r2", "r3", "r9", "r11", "r12", "r13", "r14", "r16", "r17", "r18", \
+ "r19", "r20", "r21", "r22", "r23", "r24", "r25", "r26", "r27", \
+ "r28", "r29", "r30", "r31", \
+ /* Predicate registers. */ \
+ "p6", "p7", "p8", "p9", "p10", "p11", "p12", "p13", "p14", "p15", \
+ /* Non-rotating fp registers. */ \
+ "f6", "f7", "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", \
+ /* Branch registers. */ \
+ "b6"
+
+#ifdef IA64_USE_NEW_STUB
+# define ASM_CLOBBERS_6 ASM_CLOBBERS_6_COMMON
+#else
+# define ASM_CLOBBERS_6 ASM_CLOBBERS_6_COMMON , "b7"
+#endif
+
+#endif /* __ASSEMBLER__ */
+#endif /* _LINUX_IA64_SYSDEP_INLINE_H */
Index: sysdeps/unix/sysv/linux/ia64/vfork.S
--- sysdeps/unix/sysv/linux/ia64/vfork.S
+++ sysdeps/unix/sysv/linux/ia64/vfork.S
@@ -34,9 +34,8 @@
mov out0=CLONE_VM+CLONE_VFORK+SIGCHLD
mov out1=0 /* Standard sp value. */
;;
- DO_CALL (SYS_ify (clone))
+ DO_CALL_VIA_BREAK (SYS_ify (clone))
cmp.eq p6,p0=-1,r10
- ;;
(p6) br.cond.spnt.few __syscall_error
ret
PSEUDO_END(__vfork)
next prev parent reply other threads:[~2003-11-12 22:53 UTC|newest]
Thread overview: 98+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-10-29 4:26 David Mosberger
2003-10-29 9:51 ` Jakub Jelinek
2003-10-30 8:04 ` David Mosberger
2003-10-30 9:09 ` Jakub Jelinek
2003-10-30 19:38 ` Roland McGrath
2003-10-30 19:59 ` David Mosberger
2003-10-30 20:23 ` Jakub Jelinek
2003-10-30 22:35 ` David Mosberger
2003-10-31 8:45 ` Richard Henderson
2003-10-31 9:07 ` Jakub Jelinek
2003-10-31 16:45 ` David Mosberger
2003-10-31 16:54 ` Jakub Jelinek
2003-10-31 18:29 ` David Mosberger
2003-11-03 21:46 ` David Mosberger
2003-11-12 22:53 ` David Mosberger [this message]
2003-11-12 23:10 ` Ulrich Drepper
2003-11-12 23:47 ` David Mosberger
2003-11-12 23:57 ` Jakub Jelinek
2003-11-13 2:38 ` David Mosberger
2003-11-13 3:46 ` Ulrich Drepper
2003-11-13 3:53 ` David Mosberger
2003-11-13 8:23 ` Jakub Jelinek
2003-11-13 7:32 ` David Mosberger
2003-11-13 9:24 ` Ulrich Drepper
2003-11-13 17:30 ` David Mosberger
2003-11-13 17:56 ` Ulrich Drepper
2003-11-13 18:47 ` David Mosberger
2003-11-13 20:16 ` Ulrich Drepper
2003-11-13 21:34 ` David Mosberger
2003-11-13 21:44 ` Jakub Jelinek
2003-11-13 21:58 ` David Mosberger
2003-11-13 23:45 ` David Mosberger
2003-11-14 1:44 ` Ulrich Drepper
2003-11-14 1:54 ` David Mosberger
2003-11-14 2:18 ` David Mosberger
2003-11-14 2:57 ` Ulrich Drepper
2003-11-14 3:22 ` David Mosberger
2003-11-14 3:39 ` Ulrich Drepper
2003-11-14 5:29 ` Ulrich Drepper
2003-11-14 5:49 ` David Mosberger
2003-11-14 6:04 ` Ulrich Drepper
2003-11-14 6:43 ` David Mosberger
2003-11-14 19:53 ` Ulrich Drepper
2003-11-14 19:56 ` David Mosberger
2003-11-14 20:36 ` Ulrich Drepper
2003-11-15 0:51 ` David Mosberger
2003-11-15 9:38 ` David Mosberger
2003-11-17 18:21 ` Ulrich Drepper
2003-11-17 18:35 ` David Mosberger
2003-11-18 7:54 ` David Mosberger
2003-11-18 8:22 ` Ulrich Drepper
2003-11-18 16:45 ` David Mosberger
2003-11-19 23:37 ` unwind failures due to __pthread_initialize_minimal David Mosberger
2003-11-19 23:54 ` Ulrich Drepper
2003-11-20 0:30 ` Roland McGrath
2003-11-20 2:35 ` David Mosberger
2003-11-20 4:01 ` Ulrich Drepper
2003-11-20 21:20 ` David Mosberger
2003-12-07 1:46 ` Ulrich Drepper
2003-12-08 17:40 ` David Mosberger
2003-12-08 19:27 ` Ulrich Drepper
2003-12-08 22:22 ` David Mosberger
2003-11-26 9:40 ` new syscall stub support for ia64 libc David Mosberger
2003-12-03 7:25 ` David Mosberger
2003-12-08 18:16 ` Jakub Jelinek
2003-12-08 19:23 ` David Mosberger
2003-12-08 21:17 ` Jakub Jelinek
2003-12-08 22:10 ` David Mosberger
2003-12-09 4:41 ` David Mosberger
2003-12-08 22:17 ` David Mosberger
2003-12-08 22:46 ` Jakub Jelinek
2003-12-08 23:03 ` David Mosberger
2003-12-10 23:22 ` Ulrich Drepper
2003-12-11 0:37 ` David Mosberger
2003-12-11 21:00 ` Ulrich Drepper
2003-11-17 22:15 ` David Mosberger
2003-11-15 19:05 ` David Mosberger
2003-11-17 18:14 ` Ulrich Drepper
2003-11-18 0:47 ` David Mosberger
2003-11-18 1:02 ` Ulrich Drepper
2003-11-18 1:22 ` David Mosberger
2003-11-18 1:37 ` Ulrich Drepper
2003-11-18 1:46 ` David Mosberger
2003-11-18 2:17 ` Ulrich Drepper
2003-11-18 5:44 ` David Mosberger
2003-11-18 19:18 ` David Mosberger
2003-11-18 19:35 ` Ulrich Drepper
2003-11-18 20:08 ` David Mosberger
2003-11-14 20:13 ` patch to fix unwind info for ia64 David Mosberger
2003-11-14 20:21 ` David Mosberger
2003-11-14 20:24 ` Roland McGrath
2003-11-14 21:12 ` David Mosberger
2003-11-15 17:42 ` Andreas Schwab
2003-11-15 18:52 ` David Mosberger
2003-11-19 6:19 ` David Mosberger
2003-11-19 15:25 ` Ulrich Drepper
2003-10-31 16:43 ` new syscall stub support for ia64 libc David Mosberger
2003-10-29 17:54 ` Ulrich Drepper
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=16306.47596.371542.356256@napali.hpl.hp.com \
--to=davidm@napali.hpl.hp.com \
--cc=davidm@hpl.hp.com \
--cc=drepper@redhat.com \
--cc=jakub@redhat.com \
--cc=libc-hacker@sources.redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).