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)
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to