From a6df738797825b5d19448903b9b7c35b091e13c2 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Fri, 20 Jan 2006 16:49:36 +0000 Subject: [PATCH] * sysdeps/sh/sh4/__longjmp.S: Demangle also r14 and r15. * sysdeps/sh/sh3/__longjmp.S: Likewise. * sysdeps/sh/sh4/setjmp.S: Mangle also r14 and r15. * sysdeps/sh/sh3/setjmp.S: Likewise. * sysdeps/unix/sysv/linux/sh/sysdep.h [__ASSEMBLER__] (PTR_MANGLE): Add temporary register as the second parameter. (PTR_DEMANGLE): Likewize. (PTR_MANGLE2, PTR_DEMANGLE2): Define. --- ChangeLog | 11 ++++++++++ nptl/ChangeLog | 6 ++++++ nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h | 28 +++++++++++++++++++++----- sysdeps/sh/sh3/__longjmp.S | 17 +++++++++++----- sysdeps/sh/sh3/setjmp.S | 11 ++++++++-- sysdeps/sh/sh4/__longjmp.S | 17 +++++++++++----- sysdeps/sh/sh4/setjmp.S | 11 ++++++++-- sysdeps/unix/sysv/linux/sh/sysdep.h | 10 +++++---- 8 files changed, 88 insertions(+), 23 deletions(-) diff --git a/ChangeLog b/ChangeLog index 78148a6..ed696fd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2006-01-20 Kaz Kojima + + * sysdeps/sh/sh4/__longjmp.S: Demangle also r14 and r15. + * sysdeps/sh/sh3/__longjmp.S: Likewise. + * sysdeps/sh/sh4/setjmp.S: Mangle also r14 and r15. + * sysdeps/sh/sh3/setjmp.S: Likewise. + * sysdeps/unix/sysv/linux/sh/sysdep.h [__ASSEMBLER__] + (PTR_MANGLE): Add temporary register as the second parameter. + (PTR_DEMANGLE): Likewize. + (PTR_MANGLE2, PTR_DEMANGLE2): Define. + 2006-01-19 Ulrich Drepper * include/fcntl.h: Declare __have_atfcts. diff --git a/nptl/ChangeLog b/nptl/ChangeLog index dd87226..54e7ff4 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,9 @@ +2006-01-20 Kaz Kojima + + * sysdeps/unix/sysv/linux/sh/lowlevellock.h (lll_futex_wait): + Return status. + (lll_futex_timed_wait): Define. + 2006-01-19 Ulrich Drepper * tst-cancel4.c: Test ppoll. diff --git a/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h b/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h index d9376d4..e3e3777 100644 --- a/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h +++ b/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2003, 2004 Free Software Foundation, Inc. +/* Copyright (C) 2003, 2004, 2006 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 @@ -181,19 +181,37 @@ typedef int lll_lock_t; # endif #define lll_futex_wait(futex, val) \ - do { \ - int __ignore; \ + ({ \ + int __status; \ register unsigned long __r3 asm ("r3") = SYS_futex; \ register unsigned long __r4 asm ("r4") = (unsigned long) (futex); \ register unsigned long __r5 asm ("r5") = FUTEX_WAIT; \ register unsigned long __r6 asm ("r6") = (unsigned long) (val); \ register unsigned long __r7 asm ("r7") = 0; \ __asm __volatile (SYSCALL_WITH_INST_PAD \ - : "=z" (__ignore) \ + : "=z" (__status) \ : "r" (__r3), "r" (__r4), "r" (__r5), \ "r" (__r6), "r" (__r7) \ : "memory", "t"); \ - } while (0) + __status; \ + }) + + +#define lll_futex_timed_wait(futex, val, timeout) \ + ({ \ + int __status; \ + register unsigned long __r3 asm ("r3") = SYS_futex; \ + register unsigned long __r4 asm ("r4") = (unsigned long) (futex); \ + register unsigned long __r5 asm ("r5") = FUTEX_WAIT; \ + register unsigned long __r6 asm ("r6") = (unsigned long) (val); \ + register unsigned long __r7 asm ("r7") = (timeout); \ + __asm __volatile (SYSCALL_WITH_INST_PAD \ + : "=z" (__status) \ + : "r" (__r3), "r" (__r4), "r" (__r5), \ + "r" (__r6), "r" (__r7) \ + : "memory", "t"); \ + __status; \ + }) #define lll_futex_wake(futex, nr) \ diff --git a/sysdeps/sh/sh3/__longjmp.S b/sysdeps/sh/sh3/__longjmp.S index 08d39d0..c6d8a32 100644 --- a/sysdeps/sh/sh3/__longjmp.S +++ b/sysdeps/sh/sh3/__longjmp.S @@ -1,5 +1,5 @@ /* longjmp for SH. - Copyright (C) 1999, 2000, 2005 Free Software Foundation, Inc. + Copyright (C) 1999, 2000, 2005, 2006 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 @@ -30,19 +30,26 @@ ENTRY (__longjmp) mov.l @r4+, r10 mov.l @r4+, r11 mov.l @r4+, r12 - mov.l @r4+, r13 - mov.l @r4+, r14 mov r5, r0 /* get the return value in place */ tst r0, r0 bf.s 1f - mov.l @r4+, r15 + mov.l @r4+, r13 mov #1,r0 /* can't let setjmp() return zero! */ 1: #ifdef PTR_DEMANGLE mov.l @r4+, r2 - PTR_DEMANGLE (r2) + PTR_DEMANGLE (r2, r1) + mov r2, r14 + mov.l @r4+, r2 + PTR_DEMANGLE2 (r2, r1) + mov r2, r15 + mov.l @r4+, r2 + PTR_DEMANGLE2 (r2, r1) lds r2, pr + mov #0, r1 #else + mov.l @r4+, r14 + mov.l @r4+, r15 lds.l @r4+, pr #endif rts diff --git a/sysdeps/sh/sh3/setjmp.S b/sysdeps/sh/sh3/setjmp.S index c125b29..d04e4b8 100644 --- a/sysdeps/sh/sh3/setjmp.S +++ b/sysdeps/sh/sh3/setjmp.S @@ -26,13 +26,20 @@ ENTRY (__sigsetjmp) stc.l gbr, @-r4 #ifdef PTR_MANGLE sts pr, r2 - PTR_MANGLE (r2) + PTR_MANGLE (r2, r1) mov.l r2, @-r4 + mov r15, r2 + PTR_MANGLE2 (r2, r1) + mov.l r2, @-r4 + mov r14, r2 + PTR_MANGLE2 (r2, r1) + mov.l r2, @-r4 + mov #0, r1 #else sts.l pr, @-r4 -#endif mov.l r15, @-r4 mov.l r14, @-r4 +#endif mov.l r13, @-r4 mov.l r12, @-r4 mov.l r11, @-r4 diff --git a/sysdeps/sh/sh4/__longjmp.S b/sysdeps/sh/sh4/__longjmp.S index cc52595..320a7d1 100644 --- a/sysdeps/sh/sh4/__longjmp.S +++ b/sysdeps/sh/sh4/__longjmp.S @@ -1,5 +1,5 @@ /* longjmp for SH. - Copyright (C) 1999, 2000, 2005 Free Software Foundation, Inc. + Copyright (C) 1999, 2000, 2005, 2006 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 @@ -30,19 +30,26 @@ ENTRY (__longjmp) mov.l @r4+, r10 mov.l @r4+, r11 mov.l @r4+, r12 - mov.l @r4+, r13 - mov.l @r4+, r14 mov r5, r0 /* get the return value in place */ tst r0, r0 bf.s 1f - mov.l @r4+, r15 + mov.l @r4+, r13 mov #1,r0 /* can't let setjmp() return zero! */ 1: #ifdef PTR_DEMANGLE mov.l @r4+, r2 - PTR_DEMANGLE (r2) + PTR_DEMANGLE (r2, r1) + mov r2, r14 + mov.l @r4+, r2 + PTR_DEMANGLE2 (r2, r1) + mov r2, r15 + mov.l @r4+, r2 + PTR_DEMANGLE2 (r2, r1) lds r2, pr + mov #0, r1 #else + mov.l @r4+, r14 + mov.l @r4+, r15 lds.l @r4+, pr #endif ldc.l @r4+, gbr diff --git a/sysdeps/sh/sh4/setjmp.S b/sysdeps/sh/sh4/setjmp.S index cd7e3aa..f9a4f0a 100644 --- a/sysdeps/sh/sh4/setjmp.S +++ b/sysdeps/sh/sh4/setjmp.S @@ -31,13 +31,20 @@ ENTRY (__sigsetjmp) stc.l gbr, @-r4 #ifdef PTR_MANGLE sts pr, r2 - PTR_MANGLE (r2) + PTR_MANGLE (r2, r1) mov.l r2, @-r4 + mov r15, r2 + PTR_MANGLE2 (r2, r1) + mov.l r2, @-r4 + mov r14, r2 + PTR_MANGLE2 (r2, r1) + mov.l r2, @-r4 + mov #0, r1 #else sts.l pr, @-r4 -#endif mov.l r15, @-r4 mov.l r14, @-r4 +#endif mov.l r13, @-r4 mov.l r12, @-r4 mov.l r11, @-r4 diff --git a/sysdeps/unix/sysv/linux/sh/sysdep.h b/sysdeps/unix/sysv/linux/sh/sysdep.h index b412362..f0be37e 100644 --- a/sysdeps/unix/sysv/linux/sh/sysdep.h +++ b/sysdeps/unix/sysv/linux/sh/sysdep.h @@ -1,5 +1,5 @@ /* Copyright (C) 1992,1993,1995,1996,1997,1998,1999,2000,2002,2003,2004, - 2005 Free Software Foundation, Inc. + 2005,2006 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper, , August 1995. Changed by Kaz Kojima, . @@ -376,9 +376,11 @@ is too complicated here since we have no PC-relative addressing mode. */ #else # ifdef __ASSEMBLER__ -# define PTR_MANGLE(reg) \ - stc gbr,r1; mov.l @(POINTER_GUARD,r1),r1; xor r1,reg -# define PTR_DEMANGLE(reg) PTR_MANGLE (reg) +# define PTR_MANGLE(reg, tmp) \ + stc gbr,tmp; mov.l @(POINTER_GUARD,tmp),tmp; xor tmp,reg +# define PTR_MANGLE2(reg, tmp) xor tmp,reg +# define PTR_DEMANGLE(reg, tmp) PTR_MANGLE (reg, tmp) +# define PTR_DEMANGLE2(reg, tmp) PTR_MANGLE2 (reg, tmp) # else # define PTR_MANGLE(var) \ (var) = (void *) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ()) -- 2.7.4