From aeb8eeb590a0263dce0aed0659ec81b43c1a0984 Mon Sep 17 00:00:00 2001 From: Andrew Turner Date: Thu, 2 Jul 2015 14:00:07 +0000 Subject: [PATCH] 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 --- libexec/rtld-elf/aarch64/rtld_start.S | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/libexec/rtld-elf/aarch64/rtld_start.S b/libexec/rtld-elf/aarch64/rtld_start.S index a5e0df59fd74..2270efcb87d9 100644 --- a/libexec/rtld-elf/aarch64/rtld_start.S +++ b/libexec/rtld-elf/aarch64/rtld_start.S @@ -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