From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7055 invoked by alias); 14 Jun 2013 21:43:28 -0000 Mailing-List: contact libc-ports-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: libc-ports-owner@sourceware.org Received: (qmail 7046 invoked by uid 89); 14 Jun 2013 21:43:28 -0000 X-Spam-SWARE-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_50,KHOP_RCVD_UNTRUST,RCVD_IN_HOSTKARMA_W,RCVD_IN_HOSTKARMA_WL,TW_GJ,TW_TJ autolearn=no version=3.3.1 Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Fri, 14 Jun 2013 21:43:28 +0000 Received: from svr-orw-fem-01.mgc.mentorg.com ([147.34.98.93]) by relay1.mentorg.com with esmtp id 1UnbmI-0000Sc-Fs from joseph_myers@mentor.com for libc-ports@sourceware.org; Fri, 14 Jun 2013 14:43:26 -0700 Received: from SVR-IES-FEM-01.mgc.mentorg.com ([137.202.0.104]) by svr-orw-fem-01.mgc.mentorg.com over TLS secured channel with Microsoft SMTPSVC(6.0.3790.4675); Fri, 14 Jun 2013 14:43:25 -0700 Received: from digraph.polyomino.org.uk (137.202.0.76) by SVR-IES-FEM-01.mgc.mentorg.com (137.202.0.104) with Microsoft SMTP Server id 14.2.247.3; Fri, 14 Jun 2013 22:43:24 +0100 Received: from jsm28 (helo=localhost) by digraph.polyomino.org.uk with local-esmtp (Exim 4.76) (envelope-from ) id 1UnbmF-0002hR-2q for libc-ports@sourceware.org; Fri, 14 Jun 2013 21:43:23 +0000 Date: Fri, 14 Jun 2013 21:43:00 -0000 From: "Joseph S. Myers" To: Subject: Stop MIPS setjmp / longjmp saving / restoring floating-point flags (bug 14909) Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" X-SW-Source: 2013-06/txt/msg00019.txt.bz2 I've applied this patch to fix bug 14909, MIPS setjmp / longjmp wrongly saving and restoring floating-point exceptions and rounding modes. 2013-06-14 Joseph Myers [BZ #14909] * sysdeps/mips/bits/setjmp.h (struct __jmp_buf_internal_tag): Rename __fpc_csr field to __glibc_reserved1. * sysdeps/mips/setjmp_aux.c (__sigsetjmp_aux) [__mips_hard_float]: Do not set __fpc_csr. * sysdeps/mips/mips64/setjmp_aux.c (__sigsetjmp_aux) [__mips_hard_float]: Likewise. * sysdeps/mips/__longjmp.c (____longjmp) [__mips_hard_float]: Do not use __fpc_csr. * sysdeps/mips/mips64/__longjmp.c (__longjmp) [__mips_hard_float]: Likewise. diff --git a/ports/sysdeps/mips/__longjmp.c b/ports/sysdeps/mips/__longjmp.c index 67bdb86..d1d7d64 100644 --- a/ports/sysdeps/mips/__longjmp.c +++ b/ports/sysdeps/mips/__longjmp.c @@ -47,10 +47,6 @@ ____longjmp (env_arg, val_arg) asm volatile ("l.d $f26, %0" : : "m" (env[0].__fpregs[3])); asm volatile ("l.d $f28, %0" : : "m" (env[0].__fpregs[4])); asm volatile ("l.d $f30, %0" : : "m" (env[0].__fpregs[5])); - - /* Get and reconstruct the floating point csr. */ - asm volatile ("lw $2, %0" : : "m" (env[0].__fpc_csr)); - asm volatile ("ctc1 $2, $31"); #endif /* Get the GP. */ diff --git a/ports/sysdeps/mips/bits/setjmp.h b/ports/sysdeps/mips/bits/setjmp.h index d35b12d..437848f 100644 --- a/ports/sysdeps/mips/bits/setjmp.h +++ b/ports/sysdeps/mips/bits/setjmp.h @@ -59,8 +59,8 @@ typedef struct __jmp_buf_internal_tag __extension__ long long __gp; #endif - /* Floating point status register. */ - int __fpc_csr; + /* Unused (was floating point status register). */ + int __glibc_reserved1; /* Callee-saved floating point registers. */ #if _MIPS_SIM == _ABI64 diff --git a/ports/sysdeps/mips/mips64/__longjmp.c b/ports/sysdeps/mips/mips64/__longjmp.c index 1e42e9c..bffb113 100644 --- a/ports/sysdeps/mips/mips64/__longjmp.c +++ b/ports/sysdeps/mips/mips64/__longjmp.c @@ -59,10 +59,6 @@ __longjmp (env_arg, val_arg) asm volatile ("l.d $f28, %0" : : "m" (env[0].__fpregs[4])); asm volatile ("l.d $f30, %0" : : "m" (env[0].__fpregs[5])); #endif - - /* Get and reconstruct the floating point csr. */ - asm volatile ("lw $2, %0" : : "m" (env[0].__fpc_csr)); - asm volatile ("ctc1 $2, $31"); #endif /* Get the GP. */ diff --git a/ports/sysdeps/mips/mips64/setjmp_aux.c b/ports/sysdeps/mips/mips64/setjmp_aux.c index 9515f44..9318303 100644 --- a/ports/sysdeps/mips/mips64/setjmp_aux.c +++ b/ports/sysdeps/mips/mips64/setjmp_aux.c @@ -71,11 +71,6 @@ __sigsetjmp_aux (jmp_buf env, int savemask, long long sp, long long fp, asm volatile ("sd $22, %0" : : "m" (env[0].__jmpbuf[0].__regs[6])); asm volatile ("sd $23, %0" : : "m" (env[0].__jmpbuf[0].__regs[7])); -#ifdef __mips_hard_float - /* .. and finally get and reconstruct the floating point csr. */ - asm ("cfc1 %0, $31" : "=r" (env[0].__jmpbuf[0].__fpc_csr)); -#endif - /* Save the signal mask if requested. */ return __sigjmp_save (env, savemask); } diff --git a/ports/sysdeps/mips/setjmp_aux.c b/ports/sysdeps/mips/setjmp_aux.c index cb9ea24..26715b7 100644 --- a/ports/sysdeps/mips/setjmp_aux.c +++ b/ports/sysdeps/mips/setjmp_aux.c @@ -58,11 +58,6 @@ __sigsetjmp_aux (jmp_buf env, int savemask, int sp, int fp) asm volatile ("sw $22, %0" : : "m" (env[0].__jmpbuf[0].__regs[6])); asm volatile ("sw $23, %0" : : "m" (env[0].__jmpbuf[0].__regs[7])); -#ifdef __mips_hard_float - /* .. and finally get and reconstruct the floating point csr. */ - asm ("cfc1 %0, $31" : "=r" (env[0].__jmpbuf[0].__fpc_csr)); -#endif - /* Save the signal mask if requested. */ return __sigjmp_save (env, savemask); } -- Joseph S. Myers joseph@codesourcery.com