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
This commit is contained in:
parent
fa6e0e5334
commit
aeb8eeb590
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=285038
@ -70,6 +70,12 @@ ENTRY(_rtld_bind_start)
|
|||||||
stp x6, x7, [sp, #-16]!
|
stp x6, x7, [sp, #-16]!
|
||||||
stp x8, xzr, [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 */
|
/* Calculate reloff */
|
||||||
ldr x2, [x17, #0] /* Get the address of the entry */
|
ldr x2, [x17, #0] /* Get the address of the entry */
|
||||||
sub x1, x2, x16 /* Find its offset */
|
sub x1, x2, x16 /* Find its offset */
|
||||||
@ -85,12 +91,16 @@ ENTRY(_rtld_bind_start)
|
|||||||
bl _rtld_bind
|
bl _rtld_bind
|
||||||
|
|
||||||
/* Restore the registers saved by the plt code */
|
/* 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 */
|
/* Backup the address to branch to */
|
||||||
mov x16, x0
|
mov x16, x0
|
||||||
|
|
||||||
/* restore the arguments */
|
/* 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 x8, xzr, [sp], #16
|
||||||
ldp x6, x7, [sp], #16
|
ldp x6, x7, [sp], #16
|
||||||
ldp x4, x5, [sp], #16
|
ldp x4, x5, [sp], #16
|
||||||
|
Loading…
Reference in New Issue
Block a user