svn commit: r285038 - head/libexec/rtld-elf/aarch64
Andrew Turner
andrew at FreeBSD.org
Thu Jul 2 14:00:08 UTC 2015
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
More information about the svn-src-all
mailing list