From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15951 invoked by alias); 20 Jan 2006 11:53:46 -0000 Received: (qmail 15935 invoked by uid 22791); 20 Jan 2006 11:53:45 -0000 X-Spam-Check-By: sourceware.org Received: from mo00.iij4u.or.jp (HELO mo00.iij4u.or.jp) (210.130.0.19) by sourceware.org (qpsmtpd/0.31) with ESMTP; Fri, 20 Jan 2006 11:53:44 +0000 Received: MO(mo00) for id k0KBrfN5014715; Fri, 20 Jan 2006 20:53:41 +0900 (JST) Received: from localhost (220.30.30.125.dy.iij4u.or.jp [125.30.30.220]) by r-rr.iij4u.or.jp (4U-MR/r-rr) id k0KBrfK7020739 for ; Fri, 20 Jan 2006 20:53:41 +0900 (JST) Date: Fri, 20 Jan 2006 11:53:00 -0000 Message-Id: <20060120.205339.25163296.kkojima@rr.iij4u.or.jp> To: libc-hacker@sources.redhat.com Subject: [PATCH] Fixup setjmp/longjmp on SH From: Kaz Kojima Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Mailing-List: contact libc-hacker-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-hacker-owner@sourceware.org X-SW-Source: 2006-01/txt/msg00082.txt.bz2 The attached patch updates the support of pointer mangling on SH corresponding to the recent change of jmpbuf-unwind stuff. Regards, kaz -- 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. diff -upr ORIG/libc/sysdeps/sh/sh3/__longjmp.S LOCAL/libc/sysdeps/sh/sh3/__longjmp.S --- ORIG/libc/sysdeps/sh/sh3/__longjmp.S 2005-12-23 22:38:50.000000000 +0900 +++ LOCAL/libc/sysdeps/sh/sh3/__longjmp.S 2006-01-20 19:00:41.000000000 +0900 @@ -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 -upr ORIG/libc/sysdeps/sh/sh3/setjmp.S LOCAL/libc/sysdeps/sh/sh3/setjmp.S --- ORIG/libc/sysdeps/sh/sh3/setjmp.S 2006-01-19 08:45:42.000000000 +0900 +++ LOCAL/libc/sysdeps/sh/sh3/setjmp.S 2006-01-20 18:53:38.000000000 +0900 @@ -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 -upr ORIG/libc/sysdeps/sh/sh4/__longjmp.S LOCAL/libc/sysdeps/sh/sh4/__longjmp.S --- ORIG/libc/sysdeps/sh/sh4/__longjmp.S 2005-12-23 22:38:50.000000000 +0900 +++ LOCAL/libc/sysdeps/sh/sh4/__longjmp.S 2006-01-20 19:00:37.000000000 +0900 @@ -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 -upr ORIG/libc/sysdeps/sh/sh4/setjmp.S LOCAL/libc/sysdeps/sh/sh4/setjmp.S --- ORIG/libc/sysdeps/sh/sh4/setjmp.S 2006-01-19 08:45:42.000000000 +0900 +++ LOCAL/libc/sysdeps/sh/sh4/setjmp.S 2006-01-20 18:52:19.000000000 +0900 @@ -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 -upr ORIG/libc/sysdeps/unix/sysv/linux/sh/sysdep.h LOCAL/libc/sysdeps/unix/sysv/linux/sh/sysdep.h --- ORIG/libc/sysdeps/unix/sysv/linux/sh/sysdep.h 2005-12-31 07:16:41.000000000 +0900 +++ LOCAL/libc/sysdeps/unix/sysv/linux/sh/sysdep.h 2006-01-20 18:57:15.000000000 +0900 @@ -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 ())