This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH/committed] ia64: setjmp/longjmp: stop saving/restoring fpsr [BZ #16379]


The new tst-setjmp-fp test has been failing on IA64 because the setjmp
and longjmp helpers take care of saving/restoring the fpsr register.
Per the C standards, this is incorrect, so disable that logic.

URL: https://sourceware.org/bugzilla/show_bug.cgi?id=16379
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
---
 ports/ChangeLog.ia64                                     | 13 +++++++++++--
 ports/sysdeps/unix/sysv/linux/ia64/__longjmp.S           |  6 +++---
 ports/sysdeps/unix/sysv/linux/ia64/nptl/__ia64_longjmp.S |  6 +++---
 ports/sysdeps/unix/sysv/linux/ia64/setjmp.S              |  8 ++++----
 4 files changed, 21 insertions(+), 12 deletions(-)

diff --git a/ports/ChangeLog.ia64 b/ports/ChangeLog.ia64
index b5c426e..d5e1924 100644
--- a/ports/ChangeLog.ia64
+++ b/ports/ChangeLog.ia64
@@ -1,5 +1,14 @@
 2013-12-30  Mike Frysinger  <vapier@gentoo.org>
 
+	[BZ #16379]
+	* sysdeps/unix/sysv/linux/ia64/__longjmp.S: Comment out loading of
+	fpsr.  Update offsets accordingly.
+	* sysdeps/unix/sysv/linux/ia64/nptl/__ia64_longjmp.S: Likewise.
+	* sysdeps/unix/sysv/linux/ia64/setjmp.S: Comment out saving of
+	fpsr.  Update offsets accordingly.
+
+2013-12-30  Mike Frysinger  <vapier@gentoo.org>
+
 	* sysdeps/unix/sysv/linux/ia64/setjmp.S (setjmp): Call __sigsetjmp
 	via HIDDEN_JUMPTARGET.
 	(_setjmp): Likewise.
diff --git a/ports/sysdeps/unix/sysv/linux/ia64/__longjmp.S b/ports/sysdeps/unix/sysv/linux/ia64/__longjmp.S
index 8a70ae2..4860a8c 100644
--- a/ports/sysdeps/unix/sysv/linux/ia64/__longjmp.S
+++ b/ports/sysdeps/unix/sysv/linux/ia64/__longjmp.S
@@ -82,12 +82,12 @@ LEAF(__longjmp)
 #ifdef CHECK_RSP
 	CHECK_RSP (r28)
 #endif
-	ld8.fill.nta gp=[r3],16		// r1 (gp)
+	ld8.fill.nta gp=[r3],32		// r1 (gp)
 	dep r11=-1,r23,3,6	// r11 <- ia64_rse_rnat_addr(jmpbuf.ar_bsp)
 	mov sp=r28		// r12 (sp)
 	;;
 	ld8.nta r16=[r2],16		// caller's unat
-	ld8.nta r17=[r3],16		// fpsr
+//	ld8.nta r17=[r3],16		// fpsr
 	;;
 	ld8.fill.nta r4=[r2],16	// r4
 	ld8.fill.nta r5=[r3],16		// r5 (gp)
@@ -97,7 +97,7 @@ LEAF(__longjmp)
 	ld8.fill.nta r7=[r3],16		// r7
 	;;
 	mov ar.unat=r16			// restore caller's unat
-	mov ar.fpsr=r17			// restore fpsr
+//	mov ar.fpsr=r17			// restore fpsr
 	;;
 	ld8.nta r16=[r2],16		// b0
 	ld8.nta r17=[r3],16		// b1
diff --git a/ports/sysdeps/unix/sysv/linux/ia64/nptl/__ia64_longjmp.S b/ports/sysdeps/unix/sysv/linux/ia64/nptl/__ia64_longjmp.S
index 41cc303..db61a2c 100644
--- a/ports/sysdeps/unix/sysv/linux/ia64/nptl/__ia64_longjmp.S
+++ b/ports/sysdeps/unix/sysv/linux/ia64/nptl/__ia64_longjmp.S
@@ -75,11 +75,11 @@ LEAF(__ia64_longjmp)
 	mov ar.unat=r25 // setup ar.unat (NaT bits for r1, r4-r7, and r12)
 	;;
 	ld8.fill.nta sp=[r2],16	// r12 (sp)
-	ld8.fill.nta gp=[r3],16 // r1 (gp)
+	ld8.fill.nta gp=[r3],32 // r1 (gp)
 	dep r11=-1,r23,3,6	// r11 <- ia64_rse_rnat_addr(jmpbuf.ar_bsp)
 	;;
 	ld8.nta r16=[r2],16		// caller's unat
-	ld8.nta r17=[r3],16		// fpsr
+//	ld8.nta r17=[r3],16		// fpsr
 	;;
 	ld8.fill.nta r4=[r2],16		// r4
 	ld8.fill.nta r5=[r3],16		// r5 (gp)
@@ -88,7 +88,7 @@ LEAF(__ia64_longjmp)
 	ld8.fill.nta r7=[r3],16		// r7
 	;;
 	mov ar.unat=r16			// restore caller's unat
-	mov ar.fpsr=r17			// restore fpsr
+//	mov ar.fpsr=r17			// restore fpsr
 	;;
 	ld8.nta r16=[r2],16		// b0
 	ld8.nta r17=[r3],16		// b1
diff --git a/ports/sysdeps/unix/sysv/linux/ia64/setjmp.S b/ports/sysdeps/unix/sysv/linux/ia64/setjmp.S
index bf1b980..1be53cc 100644
--- a/ports/sysdeps/unix/sysv/linux/ia64/setjmp.S
+++ b/ports/sysdeps/unix/sysv/linux/ia64/setjmp.S
@@ -25,7 +25,7 @@
   	0x000	stack pointer (r12)	; unchangeable (see _JMPBUF_UNWINDS)
   	0x008	r1 (gp)
 	0x010	caller's unat
-	0x018	fpsr
+	0x018	fpsr			; disabled per the C standard; BZ 16379
   	0x020	r4
   	0x028	r5
   	0x030	r6
@@ -89,15 +89,15 @@ ENTRY(__sigsetjmp)
 	.save ar.unat, loc2
 	mov loc2=ar.unat
 	;;
-	mov r17=ar.fpsr
+//	mov r17=ar.fpsr
 	mov r2=in0
 	add r3=8,in0
 	;;
 .mem.offset 8,0;	st8.spill.nta [r2]=sp,16	// r12 (sp)
-.mem.offset 0,0;	st8.spill.nta [r3]=gp,16	// r1 (gp)
+.mem.offset 0,0;	st8.spill.nta [r3]=gp,32	// r1 (gp)
 	;;
 	st8.nta [r2]=loc2,16		// save caller's unat
-	st8.nta [r3]=r17,16		// save fpsr
+//	st8.nta [r3]=r17,16		// save fpsr
 	add r8=0xa0,in0
 	;;
 .mem.offset 8,0;	st8.spill.nta [r2]=r4,16	// r4
-- 
1.8.4.3


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]