Author: andrew
Date: Thu Jul  2 14:00:07 2015
New Revision: 285038
URL: https://svnweb.freebsd.org/changeset/base/285038

Log:
  Save & restore the floating-pont argument registers before calling
  _rtld_bind. The compiler may generate code using these registers and not
  save them. Unfortunately, as we make use of libc, we are unable to disallow
  rtld from using floating-point register without also doing the same for the
  parts of libc we use, or by limiting what _rtld_bind is able to call.
  
  Obtained from:        ABT Systems Ltd
  Sponsored by: The FReeBSD Foundation

Modified:
  head/libexec/rtld-elf/aarch64/rtld_start.S

Modified: head/libexec/rtld-elf/aarch64/rtld_start.S
==============================================================================
--- head/libexec/rtld-elf/aarch64/rtld_start.S  Thu Jul  2 13:57:26 2015        
(r285037)
+++ head/libexec/rtld-elf/aarch64/rtld_start.S  Thu Jul  2 14:00:07 2015        
(r285038)
@@ -70,6 +70,12 @@ ENTRY(_rtld_bind_start)
        stp     x6, x7, [sp, #-16]!
        stp     x8, xzr, [sp, #-16]!
 
+       /* Save any floating-point arguments */
+       stp     q0, q1, [sp, #-32]!
+       stp     q2, q3, [sp, #-32]!
+       stp     q4, q5, [sp, #-32]!
+       stp     q6, q7, [sp, #-32]!
+
        /* Calculate reloff */
        ldr     x2, [x17, #0]   /* Get the address of the entry */
        sub     x1, x2, x16     /* Find its offset */
@@ -85,12 +91,16 @@ ENTRY(_rtld_bind_start)
        bl      _rtld_bind
 
        /* Restore the registers saved by the plt code */
-       ldp     xzr, x30, [sp, #(5 * 16)]
+       ldp     xzr, x30, [sp, #(5 * 16 + 4 * 32)]
 
        /* Backup the address to branch to */
        mov     x16, x0
 
        /* restore the arguments */
+       ldp     q6, q7, [sp], #32
+       ldp     q4, q5, [sp], #32
+       ldp     q2, q3, [sp], #32
+       ldp     q0, q1, [sp], #32
        ldp     x8, xzr, [sp], #16
        ldp     x6, x7, [sp], #16
        ldp     x4, x5, [sp], #16
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to