Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F170995676
D32024.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D32024.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D32024: Clean up the arm64 _rtld_bind stack creation
Attached
Detach File
Event Timeline
Log In to Comment