Page MenuHomeFreeBSD

D32024.diff
No OneTemporary

D32024.diff

Index: libexec/rtld-elf/aarch64/rtld_start.S
===================================================================
--- libexec/rtld-elf/aarch64/rtld_start.S
+++ libexec/rtld-elf/aarch64/rtld_start.S
@@ -58,30 +58,51 @@
mov x17, sp
/* Save frame pointer and SP */
- stp x29, x30, [sp, #-16]!
- mov x29, sp
- .cfi_def_cfa x29, 16
- .cfi_offset x30, -8
- .cfi_offset x29, -16
+#define FRAME_SIZE (6 * 16 + 4 * 32)
+#define VFP_OFFSET (6 * 16)
+ stp x29, x30, [sp, #(-FRAME_SIZE)]!
/* Save the arguments */
- stp x0, x1, [sp, #-16]!
- stp x2, x3, [sp, #-16]!
- stp x4, x5, [sp, #-16]!
- stp x6, x7, [sp, #-16]!
- stp x8, xzr, [sp, #-16]!
+ stp x0, x1, [sp, #(1 * 16)]
+ stp x2, x3, [sp, #(2 * 16)]
+ stp x4, x5, [sp, #(3 * 16)]
+ stp x6, x7, [sp, #(4 * 16)]
+ str x8, [sp, #(5 * 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]!
+ stp q0, q1, [sp, #(0 * 32 + VFP_OFFSET)]
+ stp q2, q3, [sp, #(1 * 32 + VFP_OFFSET)]
+ stp q4, q5, [sp, #(2 * 32 + VFP_OFFSET)]
+ stp q6, q7, [sp, #(3 * 32 + VFP_OFFSET)]
+
+ mov x29, sp
+ .cfi_def_cfa x29, FRAME_SIZE
+ .cfi_offset q7, (3 * 32 + 16 + VFP_OFFSET) - FRAME_SIZE
+ .cfi_offset q6, (3 * 32 + 0 + VFP_OFFSET) - FRAME_SIZE
+ .cfi_offset q5, (2 * 32 + 16 + VFP_OFFSET) - FRAME_SIZE
+ .cfi_offset q4, (2 * 32 + 0 + VFP_OFFSET) - FRAME_SIZE
+ .cfi_offset q3, (1 * 32 + 16 + VFP_OFFSET) - FRAME_SIZE
+ .cfi_offset q2, (1 * 32 + 0 + VFP_OFFSET) - FRAME_SIZE
+ .cfi_offset q1, (0 * 32 + 16 + VFP_OFFSET) - FRAME_SIZE
+ .cfi_offset q0, (0 * 32 + 0 + VFP_OFFSET) - FRAME_SIZE
+
+ .cfi_offset x8, (5 * 16 + 0) - FRAME_SIZE
+ .cfi_offset x7, (4 * 16 + 8) - FRAME_SIZE
+ .cfi_offset x6, (4 * 16 + 0) - FRAME_SIZE
+ .cfi_offset x5, (3 * 16 + 8) - FRAME_SIZE
+ .cfi_offset x4, (3 * 16 + 0) - FRAME_SIZE
+ .cfi_offset x3, (2 * 16 + 8) - FRAME_SIZE
+ .cfi_offset x2, (2 * 16 + 0) - FRAME_SIZE
+ .cfi_offset x1, (1 * 16 + 8) - FRAME_SIZE
+ .cfi_offset x0, (1 * 16 + 0) - FRAME_SIZE
+ .cfi_offset x30, (0 * 16 + 8) - FRAME_SIZE
+ .cfi_offset x29, (0 * 16 + 0) - FRAME_SIZE
/* Calculate reloff */
ldr x2, [x17, #0] /* Get the address of the entry */
sub x1, x2, x16 /* Find its offset */
sub x1, x1, #8 /* Adjust for x16 not being at offset 0 */
- /* Each rela item has 3 entriesso we need reloff = 3 * index */
+ /* Each rela item has 3 entries so we need reloff = 3 * index */
lsl x3, x1, #1 /* x3 = 2 * offset */
add x1, x1, x3 /* x1 = x3 + offset = 3 * offset */
@@ -95,24 +116,27 @@
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
- ldp x2, x3, [sp], #16
- ldp x0, x1, [sp], #16
+ ldp q6, q7, [sp, #(3 * 32 + VFP_OFFSET)]
+ ldp q4, q5, [sp, #(2 * 32 + VFP_OFFSET)]
+ ldp q2, q3, [sp, #(1 * 32 + VFP_OFFSET)]
+ ldp q0, q1, [sp, #(0 * 32 + VFP_OFFSET)]
+
+ ldr x8, [sp, #(5 * 16)]
+ ldp x6, x7, [sp, #(4 * 16)]
+ ldp x4, x5, [sp, #(3 * 16)]
+ ldp x2, x3, [sp, #(2 * 16)]
+ ldp x0, x1, [sp, #(1 * 16)]
/* Restore frame pointer */
- ldp x29, xzr, [sp], #16
+ ldr x29, [sp], #FRAME_SIZE
/* Restore link register saved by the plt code */
ldp xzr, x30, [sp], #16
/* Call into the correct function */
br x16
+#undef FRAME_SIZE
+#undef VFP_OFFSET
END(_rtld_bind_start)
/*

File Metadata

Mime Type
text/plain
Expires
Wed, Sep 9, 2:09 AM (6 h, 1 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
38554705
Default Alt Text
D32024.diff (3 KB)

Event Timeline