svn commit: r279784 - in head/lib/libc: powerpc/gen powerpc64/gen

Nathan Whitehorn nwhitehorn at FreeBSD.org
Sun Mar 8 19:37:11 UTC 2015


Author: nwhitehorn
Date: Sun Mar  8 19:37:08 2015
New Revision: 279784
URL: https://svnweb.freebsd.org/changeset/base/279784

Log:
  Save and restore non-volatile floating-point registers during longjmp().
  This should also save and restore non-volatile Altivec registers, but that
  needs to wait on solving two problems:
  1. Adding the nonvolatile vector registers means we need 5 more than _JBLEN
     entries in jmp_buf on 32-bit targets (64-bit is OK).
  2. Need to figure out how to determine if saving/restoring vector regs
     is supported on the current CPU from userland.
  
  MFC after:	1 month

Modified:
  head/lib/libc/powerpc/gen/_setjmp.S
  head/lib/libc/powerpc/gen/setjmp.S
  head/lib/libc/powerpc/gen/sigsetjmp.S
  head/lib/libc/powerpc64/gen/_setjmp.S
  head/lib/libc/powerpc64/gen/setjmp.S
  head/lib/libc/powerpc64/gen/sigsetjmp.S

Modified: head/lib/libc/powerpc/gen/_setjmp.S
==============================================================================
--- head/lib/libc/powerpc/gen/_setjmp.S	Sun Mar  8 17:34:06 2015	(r279783)
+++ head/lib/libc/powerpc/gen/_setjmp.S	Sun Mar  8 19:37:08 2015	(r279784)
@@ -56,12 +56,54 @@ ENTRY(_setjmp)
 	mr	%r10,%r1
 	mr	%r9,%r2
 	stmw	%r9,20(%r3)
+
+	/* FPRs */
+	stfd	%f14,92+0*8(%r3)
+	stfd	%f15,92+1*8(%r3)
+	stfd	%f16,92+2*8(%r3)
+	stfd	%f17,92+3*8(%r3)
+	stfd	%f18,92+4*8(%r3)
+	stfd	%f19,92+5*8(%r3)
+	stfd	%f20,92+6*8(%r3)
+	stfd	%f21,92+7*8(%r3)
+	stfd	%f22,92+8*8(%r3)
+	stfd	%f23,92+9*8(%r3)
+	stfd	%f24,92+10*8(%r3)
+	stfd	%f25,92+11*8(%r3)
+	stfd	%f26,92+12*8(%r3)
+	stfd	%f27,92+13*8(%r3)
+	stfd	%f28,93+13*8(%r3)
+	stfd	%f29,93+14*8(%r3)
+	stfd	%f30,93+15*8(%r3)
+	stfd	%f31,93+16*8(%r3)
+
 	li	%r3,0
 	blr
 END(_setjmp)
 
 ENTRY(_longjmp)
 	lmw	%r9,20(%r3)
+
+	/* FPRs */
+	lfd	%f14,92+0*8(%r3)
+	lfd	%f15,92+1*8(%r3)
+	lfd	%f16,92+2*8(%r3)
+	lfd	%f17,92+3*8(%r3)
+	lfd	%f18,92+4*8(%r3)
+	lfd	%f19,92+5*8(%r3)
+	lfd	%f20,92+6*8(%r3)
+	lfd	%f21,92+7*8(%r3)
+	lfd	%f22,92+8*8(%r3)
+	lfd	%f23,92+9*8(%r3)
+	lfd	%f24,92+10*8(%r3)
+	lfd	%f25,92+11*8(%r3)
+	lfd	%f26,92+12*8(%r3)
+	lfd	%f27,92+13*8(%r3)
+	lfd	%f28,93+13*8(%r3)
+	lfd	%f29,93+14*8(%r3)
+	lfd	%f30,93+15*8(%r3)
+	lfd	%f31,93+16*8(%r3)
+
 	mtlr	%r11
 	mtcr	%r12
 	mr	%r1,%r10

Modified: head/lib/libc/powerpc/gen/setjmp.S
==============================================================================
--- head/lib/libc/powerpc/gen/setjmp.S	Sun Mar  8 17:34:06 2015	(r279783)
+++ head/lib/libc/powerpc/gen/setjmp.S	Sun Mar  8 19:37:08 2015	(r279784)
@@ -66,6 +66,27 @@ ENTRY(setjmp)
 	mr	%r10,%r1		/* r10 <- stackptr */
 	mr	%r9,%r2			/*  r9 <- global ptr */
 	stmw	%r9,20(%r6)
+
+	/* FPRs */
+	stfd	%f14,92+0*8(%r6)
+	stfd	%f15,92+1*8(%r6)
+	stfd	%f16,92+2*8(%r6)
+	stfd	%f17,92+3*8(%r6)
+	stfd	%f18,92+4*8(%r6)
+	stfd	%f19,92+5*8(%r6)
+	stfd	%f20,92+6*8(%r6)
+	stfd	%f21,92+7*8(%r6)
+	stfd	%f22,92+8*8(%r6)
+	stfd	%f23,92+9*8(%r6)
+	stfd	%f24,92+10*8(%r6)
+	stfd	%f25,92+11*8(%r6)
+	stfd	%f26,92+12*8(%r6)
+	stfd	%f27,92+13*8(%r6)
+	stfd	%f28,93+13*8(%r6)
+	stfd	%f29,93+14*8(%r6)
+	stfd	%f30,93+15*8(%r6)
+	stfd	%f31,93+16*8(%r6)
+
 	li	%r3,0			/* return (0) */
 	blr
 END(setjmp)
@@ -73,6 +94,27 @@ END(setjmp)
 	WEAK_REFERENCE(CNAME(__longjmp), longjmp)
 ENTRY(__longjmp)
 	lmw	%r9,20(%r3)		/* restore regs */
+
+	/* FPRs */
+	lfd	%f14,92+0*8(%r3)
+	lfd	%f15,92+1*8(%r3)
+	lfd	%f16,92+2*8(%r3)
+	lfd	%f17,92+3*8(%r3)
+	lfd	%f18,92+4*8(%r3)
+	lfd	%f19,92+5*8(%r3)
+	lfd	%f20,92+6*8(%r3)
+	lfd	%f21,92+7*8(%r3)
+	lfd	%f22,92+8*8(%r3)
+	lfd	%f23,92+9*8(%r3)
+	lfd	%f24,92+10*8(%r3)
+	lfd	%f25,92+11*8(%r3)
+	lfd	%f26,92+12*8(%r3)
+	lfd	%f27,92+13*8(%r3)
+	lfd	%f28,93+13*8(%r3)
+	lfd	%f29,93+14*8(%r3)
+	lfd	%f30,93+15*8(%r3)
+	lfd	%f31,93+16*8(%r3)
+
 	mr	%r6,%r4			/* save val param */
 	mtlr	%r11			/* r11 -> link reg */
 	mtcr	%r12			/* r12 -> condition reg */

Modified: head/lib/libc/powerpc/gen/sigsetjmp.S
==============================================================================
--- head/lib/libc/powerpc/gen/sigsetjmp.S	Sun Mar  8 17:34:06 2015	(r279783)
+++ head/lib/libc/powerpc/gen/sigsetjmp.S	Sun Mar  8 19:37:08 2015	(r279784)
@@ -71,12 +71,54 @@ ENTRY(sigsetjmp)
 	mr	%r10,%r1
 	mr	%r9,%r2
 	stmw	%r9,20(%r6)
+
+	/* FPRs */
+	stfd	%f14,92+0*8(%r6)
+	stfd	%f15,92+1*8(%r6)
+	stfd	%f16,92+2*8(%r6)
+	stfd	%f17,92+3*8(%r6)
+	stfd	%f18,92+4*8(%r6)
+	stfd	%f19,92+5*8(%r6)
+	stfd	%f20,92+6*8(%r6)
+	stfd	%f21,92+7*8(%r6)
+	stfd	%f22,92+8*8(%r6)
+	stfd	%f23,92+9*8(%r6)
+	stfd	%f24,92+10*8(%r6)
+	stfd	%f25,92+11*8(%r6)
+	stfd	%f26,92+12*8(%r6)
+	stfd	%f27,92+13*8(%r6)
+	stfd	%f28,93+13*8(%r6)
+	stfd	%f29,93+14*8(%r6)
+	stfd	%f30,93+15*8(%r6)
+	stfd	%f31,93+16*8(%r6)
+
 	li	%r3,0
 	blr
 END(sigsetjmp)
 
 ENTRY(siglongjmp)
 	lmw	%r9,20(%r3)
+
+	/* FPRs */
+	lfd	%f14,92+0*8(%r3)
+	lfd	%f15,92+1*8(%r3)
+	lfd	%f16,92+2*8(%r3)
+	lfd	%f17,92+3*8(%r3)
+	lfd	%f18,92+4*8(%r3)
+	lfd	%f19,92+5*8(%r3)
+	lfd	%f20,92+6*8(%r3)
+	lfd	%f21,92+7*8(%r3)
+	lfd	%f22,92+8*8(%r3)
+	lfd	%f23,92+9*8(%r3)
+	lfd	%f24,92+10*8(%r3)
+	lfd	%f25,92+11*8(%r3)
+	lfd	%f26,92+12*8(%r3)
+	lfd	%f27,92+13*8(%r3)
+	lfd	%f28,93+13*8(%r3)
+	lfd	%f29,93+14*8(%r3)
+	lfd	%f30,93+15*8(%r3)
+	lfd	%f31,93+16*8(%r3)
+
 	lwz	%r7,0(%r3)
 	mr	%r6,%r4
 	mtlr	%r11

Modified: head/lib/libc/powerpc64/gen/_setjmp.S
==============================================================================
--- head/lib/libc/powerpc64/gen/_setjmp.S	Sun Mar  8 17:34:06 2015	(r279783)
+++ head/lib/libc/powerpc64/gen/_setjmp.S	Sun Mar  8 19:37:08 2015	(r279784)
@@ -56,23 +56,41 @@ ENTRY(_setjmp)
 	mr	%r10,%r1
 	mr	%r9,%r2
 	std	%r9,40 + 0*8(%r3)
+	stfd	%f14,40 + 23*8(%r3)
 	std	%r10,40 + 1*8(%r3)
+	stfd	%f15,40 + 24*8(%r3)
 	std	%r11,40 + 2*8(%r3)
+	stfd	%f16,40 + 25*8(%r3)
 	std	%r12,40 + 3*8(%r3)
+	stfd	%f17,40 + 26*8(%r3)
 	std	%r13,40 + 4*8(%r3)
+	stfd	%f18,40 + 27*8(%r3)
 	std	%r14,40 + 5*8(%r3)
+	stfd	%f19,40 + 28*8(%r3)
 	std	%r15,40 + 6*8(%r3)
+	stfd	%f20,40 + 29*8(%r3)
 	std	%r16,40 + 7*8(%r3)
+	stfd	%f21,40 + 30*8(%r3)
 	std	%r17,40 + 8*8(%r3)
+	stfd	%f22,40 + 31*8(%r3)
 	std	%r18,40 + 9*8(%r3)
+	stfd	%f23,40 + 32*8(%r3)
 	std	%r19,40 + 10*8(%r3)
+	stfd	%f24,40 + 33*8(%r3)
 	std	%r20,40 + 11*8(%r3)
+	stfd	%f25,40 + 34*8(%r3)
 	std	%r21,40 + 12*8(%r3)
+	stfd	%f26,40 + 35*8(%r3)
 	std	%r22,40 + 13*8(%r3)
+	stfd	%f27,40 + 36*8(%r3)
 	std	%r23,40 + 14*8(%r3)
+	stfd	%f28,40 + 37*8(%r3)
 	std	%r24,40 + 15*8(%r3)
+	stfd	%f29,40 + 38*8(%r3)
 	std	%r25,40 + 16*8(%r3)
+	stfd	%f30,40 + 39*8(%r3)
 	std	%r26,40 + 17*8(%r3)
+	stfd	%f31,40 + 40*8(%r3)
 	std	%r27,40 + 18*8(%r3)
 	std	%r28,40 + 19*8(%r3)
 	std	%r29,40 + 20*8(%r3)
@@ -84,23 +102,41 @@ END(_setjmp)
 
 ENTRY(_longjmp)
 	ld	%r9,40 + 0*8(%r3)
+	lfd	%f14,40 + 23*8(%r3)
 	ld	%r10,40 + 1*8(%r3)
+	lfd	%f15,40 + 24*8(%r3)
 	ld	%r11,40 + 2*8(%r3)
+	lfd	%f16,40 + 25*8(%r3)
 	ld	%r12,40 + 3*8(%r3)
+	lfd	%f17,40 + 26*8(%r3)
 	ld	%r14,40 + 5*8(%r3)
+	lfd	%f18,40 + 27*8(%r3)
 	ld	%r15,40 + 6*8(%r3)
+	lfd	%f19,40 + 28*8(%r3)
 	ld	%r16,40 + 7*8(%r3)
+	lfd	%f20,40 + 29*8(%r3)
 	ld	%r17,40 + 8*8(%r3)
+	lfd	%f21,40 + 30*8(%r3)
 	ld	%r18,40 + 9*8(%r3)
+	lfd	%f22,40 + 31*8(%r3)
 	ld	%r19,40 + 10*8(%r3)
+	lfd	%f23,40 + 32*8(%r3)
 	ld	%r20,40 + 11*8(%r3)
+	lfd	%f24,40 + 33*8(%r3)
 	ld	%r21,40 + 12*8(%r3)
+	lfd	%f25,40 + 34*8(%r3)
 	ld	%r22,40 + 13*8(%r3)
+	lfd	%f26,40 + 35*8(%r3)
 	ld	%r23,40 + 14*8(%r3)
+	lfd	%f27,40 + 36*8(%r3)
 	ld	%r24,40 + 15*8(%r3)
+	lfd	%f28,40 + 37*8(%r3)
 	ld	%r25,40 + 16*8(%r3)
+	lfd	%f29,40 + 38*8(%r3)
 	ld	%r26,40 + 17*8(%r3)
+	lfd	%f30,40 + 39*8(%r3)
 	ld	%r27,40 + 18*8(%r3)
+	lfd	%f31,40 + 40*8(%r3)
 	ld	%r28,40 + 19*8(%r3)
 	ld	%r29,40 + 20*8(%r3)
 	ld	%r30,40 + 21*8(%r3)

Modified: head/lib/libc/powerpc64/gen/setjmp.S
==============================================================================
--- head/lib/libc/powerpc64/gen/setjmp.S	Sun Mar  8 17:34:06 2015	(r279783)
+++ head/lib/libc/powerpc64/gen/setjmp.S	Sun Mar  8 19:37:08 2015	(r279784)
@@ -67,29 +67,49 @@ ENTRY(setjmp)
 	mr	%r9,%r2			/*  r9 <- global ptr */
 
 	std	%r9,40 + 0*8(%r6)
+	stfd	%f14,40 + 23*8(%r6)
 	std	%r10,40 + 1*8(%r6)
+	stfd	%f15,40 + 24*8(%r6)
 	std	%r11,40 + 2*8(%r6)
+	stfd	%f16,40 + 25*8(%r6)
 	std	%r12,40 + 3*8(%r6)
+	stfd	%f17,40 + 26*8(%r6)
 	std	%r13,40 + 4*8(%r6)
+	stfd	%f18,40 + 27*8(%r6)
 	std	%r14,40 + 5*8(%r6)
+	stfd	%f19,40 + 28*8(%r6)
 	std	%r15,40 + 6*8(%r6)
+	stfd	%f20,40 + 29*8(%r6)
 	std	%r16,40 + 7*8(%r6)
+	stfd	%f21,40 + 30*8(%r6)
 	std	%r17,40 + 8*8(%r6)
+	stfd	%f22,40 + 31*8(%r6)
 	std	%r18,40 + 9*8(%r6)
+	stfd	%f23,40 + 32*8(%r6)
 	std	%r19,40 + 10*8(%r6)
+	stfd	%f24,40 + 33*8(%r6)
 	std	%r20,40 + 11*8(%r6)
+	stfd	%f25,40 + 34*8(%r6)
 	std	%r21,40 + 12*8(%r6)
+	stfd	%f26,40 + 35*8(%r6)
 	std	%r22,40 + 13*8(%r6)
+	stfd	%f27,40 + 36*8(%r6)
 	std	%r23,40 + 14*8(%r6)
+	stfd	%f28,40 + 37*8(%r6)
 	std	%r24,40 + 15*8(%r6)
+	stfd	%f29,40 + 38*8(%r6)
 	std	%r25,40 + 16*8(%r6)
+	stfd	%f30,40 + 39*8(%r6)
 	std	%r26,40 + 17*8(%r6)
+	stfd	%f31,40 + 40*8(%r6)
 	std	%r27,40 + 18*8(%r6)
 	std	%r28,40 + 19*8(%r6)
 	std	%r29,40 + 20*8(%r6)
 	std	%r30,40 + 21*8(%r6)
 	std	%r31,40 + 22*8(%r6)
 
+	/* XXX Altivec regs */
+
 	li	%r3,0			/* return (0) */
 	blr
 END(setjmp)
@@ -97,23 +117,41 @@ END(setjmp)
 	WEAK_REFERENCE(__longjmp, longjmp)
 ENTRY(__longjmp)
 	ld	%r9,40 + 0*8(%r3)
+	lfd	%f14,40 + 23*8(%r3)
 	ld	%r10,40 + 1*8(%r3)
+	lfd	%f15,40 + 24*8(%r3)
 	ld	%r11,40 + 2*8(%r3)
+	lfd	%f16,40 + 25*8(%r3)
 	ld	%r12,40 + 3*8(%r3)
+	lfd	%f17,40 + 26*8(%r3)
 	ld	%r14,40 + 5*8(%r3)
+	lfd	%f18,40 + 27*8(%r3)
 	ld	%r15,40 + 6*8(%r3)
+	lfd	%f19,40 + 28*8(%r3)
 	ld	%r16,40 + 7*8(%r3)
+	lfd	%f20,40 + 29*8(%r3)
 	ld	%r17,40 + 8*8(%r3)
+	lfd	%f21,40 + 30*8(%r3)
 	ld	%r18,40 + 9*8(%r3)
+	lfd	%f22,40 + 31*8(%r3)
 	ld	%r19,40 + 10*8(%r3)
+	lfd	%f23,40 + 32*8(%r3)
 	ld	%r20,40 + 11*8(%r3)
+	lfd	%f24,40 + 33*8(%r3)
 	ld	%r21,40 + 12*8(%r3)
+	lfd	%f25,40 + 34*8(%r3)
 	ld	%r22,40 + 13*8(%r3)
+	lfd	%f26,40 + 35*8(%r3)
 	ld	%r23,40 + 14*8(%r3)
+	lfd	%f27,40 + 36*8(%r3)
 	ld	%r24,40 + 15*8(%r3)
+	lfd	%f28,40 + 37*8(%r3)
 	ld	%r25,40 + 16*8(%r3)
+	lfd	%f29,40 + 38*8(%r3)
 	ld	%r26,40 + 17*8(%r3)
+	lfd	%f30,40 + 39*8(%r3)
 	ld	%r27,40 + 18*8(%r3)
+	lfd	%f31,40 + 40*8(%r3)
 	ld	%r28,40 + 19*8(%r3)
 	ld	%r29,40 + 20*8(%r3)
 	ld	%r30,40 + 21*8(%r3)

Modified: head/lib/libc/powerpc64/gen/sigsetjmp.S
==============================================================================
--- head/lib/libc/powerpc64/gen/sigsetjmp.S	Sun Mar  8 17:34:06 2015	(r279783)
+++ head/lib/libc/powerpc64/gen/sigsetjmp.S	Sun Mar  8 19:37:08 2015	(r279784)
@@ -72,23 +72,41 @@ ENTRY(sigsetjmp)
 	mr	%r9,%r2
 
 	std	%r9,40 + 0*8(%r6)
+	stfd	%f14,40 + 23*8(%r6)
 	std	%r10,40 + 1*8(%r6)
+	stfd	%f15,40 + 24*8(%r6)
 	std	%r11,40 + 2*8(%r6)
+	stfd	%f16,40 + 25*8(%r6)
 	std	%r12,40 + 3*8(%r6)
+	stfd	%f17,40 + 26*8(%r6)
 	std	%r13,40 + 4*8(%r6)
+	stfd	%f18,40 + 27*8(%r6)
 	std	%r14,40 + 5*8(%r6)
+	stfd	%f19,40 + 28*8(%r6)
 	std	%r15,40 + 6*8(%r6)
+	stfd	%f20,40 + 29*8(%r6)
 	std	%r16,40 + 7*8(%r6)
+	stfd	%f21,40 + 30*8(%r6)
 	std	%r17,40 + 8*8(%r6)
+	stfd	%f22,40 + 31*8(%r6)
 	std	%r18,40 + 9*8(%r6)
+	stfd	%f23,40 + 32*8(%r6)
 	std	%r19,40 + 10*8(%r6)
+	stfd	%f24,40 + 33*8(%r6)
 	std	%r20,40 + 11*8(%r6)
+	stfd	%f25,40 + 34*8(%r6)
 	std	%r21,40 + 12*8(%r6)
+	stfd	%f26,40 + 35*8(%r6)
 	std	%r22,40 + 13*8(%r6)
+	stfd	%f27,40 + 36*8(%r6)
 	std	%r23,40 + 14*8(%r6)
+	stfd	%f28,40 + 37*8(%r6)
 	std	%r24,40 + 15*8(%r6)
+	stfd	%f29,40 + 38*8(%r6)
 	std	%r25,40 + 16*8(%r6)
+	stfd	%f30,40 + 39*8(%r6)
 	std	%r26,40 + 17*8(%r6)
+	stfd	%f31,40 + 40*8(%r6)
 	std	%r27,40 + 18*8(%r6)
 	std	%r28,40 + 19*8(%r6)
 	std	%r29,40 + 20*8(%r6)
@@ -101,23 +119,41 @@ END(sigsetjmp)
 
 ENTRY(siglongjmp)
 	ld	%r9,40 + 0*8(%r3)
+	lfd	%f14,40 + 23*8(%r3)
 	ld	%r10,40 + 1*8(%r3)
+	lfd	%f15,40 + 24*8(%r3)
 	ld	%r11,40 + 2*8(%r3)
+	lfd	%f16,40 + 25*8(%r3)
 	ld	%r12,40 + 3*8(%r3)
+	lfd	%f17,40 + 26*8(%r3)
 	ld	%r14,40 + 5*8(%r3)
+	lfd	%f18,40 + 27*8(%r3)
 	ld	%r15,40 + 6*8(%r3)
+	lfd	%f19,40 + 28*8(%r3)
 	ld	%r16,40 + 7*8(%r3)
+	lfd	%f20,40 + 29*8(%r3)
 	ld	%r17,40 + 8*8(%r3)
+	lfd	%f21,40 + 30*8(%r3)
 	ld	%r18,40 + 9*8(%r3)
+	lfd	%f22,40 + 31*8(%r3)
 	ld	%r19,40 + 10*8(%r3)
+	lfd	%f23,40 + 32*8(%r3)
 	ld	%r20,40 + 11*8(%r3)
+	lfd	%f24,40 + 33*8(%r3)
 	ld	%r21,40 + 12*8(%r3)
+	lfd	%f25,40 + 34*8(%r3)
 	ld	%r22,40 + 13*8(%r3)
+	lfd	%f26,40 + 35*8(%r3)
 	ld	%r23,40 + 14*8(%r3)
+	lfd	%f27,40 + 36*8(%r3)
 	ld	%r24,40 + 15*8(%r3)
+	lfd	%f28,40 + 37*8(%r3)
 	ld	%r25,40 + 16*8(%r3)
+	lfd	%f29,40 + 38*8(%r3)
 	ld	%r26,40 + 17*8(%r3)
+	lfd	%f30,40 + 39*8(%r3)
 	ld	%r27,40 + 18*8(%r3)
+	lfd	%f31,40 + 40*8(%r3)
 	ld	%r28,40 + 19*8(%r3)
 	ld	%r29,40 + 20*8(%r3)
 	ld	%r30,40 + 21*8(%r3)


More information about the svn-src-head mailing list