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) /*