diff options
author | Ulrich Drepper <drepper@redhat.com> | 2005-01-08 07:10:00 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2005-01-08 07:10:00 +0000 |
commit | 4e2d549137c8e9990f446fee58ad78a1c6495fa9 (patch) | |
tree | d571031b5b547ca6172946af0e92227136aa6298 /sysdeps/powerpc/powerpc64 | |
parent | 70cd1f971ba91574980d707a1bd7da29a970158c (diff) | |
download | glibc-4e2d549137c8e9990f446fee58ad78a1c6495fa9.tar.gz glibc-4e2d549137c8e9990f446fee58ad78a1c6495fa9.tar.xz glibc-4e2d549137c8e9990f446fee58ad78a1c6495fa9.zip |
Update.
* sysdeps/powerpc/powerpc64/dl-machine.h (elf_machine_runtime_setup): If profile != 0 does not anymore mean GLRO(dl_profile) != NULL. * sysdeps/powerpc/powerpc64/bits/link.h (struct la_ppc64_regs): Add padding. * sysdeps/powerpc/powerpc64/dl-trampoline.S: (_dl_profile_resolve): Extend _dl_prof_resolve to add pass extra parameters to _dl_profile_fixup and set up structure with register content.
Diffstat (limited to 'sysdeps/powerpc/powerpc64')
-rw-r--r-- | sysdeps/powerpc/powerpc64/bits/link.h | 1 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc64/dl-machine.h | 3 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc64/dl-trampoline.S | 146 |
3 files changed, 115 insertions, 35 deletions
diff --git a/sysdeps/powerpc/powerpc64/bits/link.h b/sysdeps/powerpc/powerpc64/bits/link.h index 34e9a60726..863336241a 100644 --- a/sysdeps/powerpc/powerpc64/bits/link.h +++ b/sysdeps/powerpc/powerpc64/bits/link.h @@ -70,6 +70,7 @@ typedef struct La_ppc64_regs { uint64_t lr_reg[8]; double lr_fp[13]; + uint64_t __padding; uint32_t lr_vreg[12][4]; uint64_t lr_r1; uint64_t lr_lr; diff --git a/sysdeps/powerpc/powerpc64/dl-machine.h b/sysdeps/powerpc/powerpc64/dl-machine.h index 80c7d9f4ec..5ddc22e3c9 100644 --- a/sysdeps/powerpc/powerpc64/dl-machine.h +++ b/sysdeps/powerpc/powerpc64/dl-machine.h @@ -334,7 +334,8 @@ elf_machine_runtime_setup (struct link_map *map, int lazy, int profile) resolve_fd = (Elf64_FuncDesc *) (profile ? _dl_profile_resolve : _dl_runtime_resolve); - if (profile && _dl_name_match_p (GLRO(dl_profile), map)) + if (profile && GLRO(dl_profile) != NULL + && _dl_name_match_p (GLRO(dl_profile), map)) /* This is the object we are looking for. Say that we really want profiling and the timers are started. */ GL(dl_profile_map) = map; diff --git a/sysdeps/powerpc/powerpc64/dl-trampoline.S b/sysdeps/powerpc/powerpc64/dl-trampoline.S index 946ad8a3e3..316f17a405 100644 --- a/sysdeps/powerpc/powerpc64/dl-trampoline.S +++ b/sysdeps/powerpc/powerpc64/dl-trampoline.S @@ -73,46 +73,124 @@ END(_dl_runtime_resolve) EALIGN(_dl_profile_resolve, 4, 0) /* We need to save the registers used to pass parameters, ie. r3 thru r10; the registers are saved in a stack frame. */ - stdu 1,-128(1) - std 3,48(1) - mr 3,11 - std 4,56(1) - sldi 4,0,1 - std 5,64(1) - add 4,4,0 - std 6,72(1) - sldi 4,4,3 - std 7,80(1) - mflr 0 - std 8,88(1) + stdu r1,-448(r1) + /* Stack layout: + + +432 stackframe + +424 lr + +416 r1 + +400 v12 + +384 v11 + +368 v10 + +362 v9 + +336 v8 + +320 v7 + +304 v6 + +288 v5 + +272 v4 + +256 v3 + +240 v2 + +224 v1 + +216 free + +208 fp13 + +200 fp12 + +192 fp11 + +184 fp10 + +176 fp9 + +168 fp8 + +160 fp7 + +152 fp6 + +144 fp5 + +136 fp4 + +128 fp3 + +120 fp2 + +112 fp1 + +104 r10 + +96 r9 + +88 r8 + +80 r7 + +72 r6 + +64 r5 + +56 r4 + +48 r3 + +8 cr + r1 link + */ + std r3,48(r1) + mr r3,r11 + std r4,56(r1) + sldi r4,r0,1 + std r5,64(r1) + add r4,r4,0 + std r6,72(r1) + sldi r4,r4,3 + std r7,80(r1) + mflr r5 + std r8,88(r1) /* Store the LR in the LR Save area of the previous frame. */ - std 0,128+16(1) - mfcr 0 - std 9,96(1) - std 10,104(1) +/* XXX Do we have to do this? */ + std r5,448+16(r1) + std r5,424(r1) + mfcr r0 + std r9,96(r1) + std r10,104(r1) /* I'm almost certain we don't have to save cr... be safe. */ - std 0,8(1) + std r0,8(r1) +/* Save floating registers. */ + stfd fp1,112(r1) + stfd fp2,120(r1) + stfd fp3,128(r1) + stfd fp4,136(r1) + stfd fp5,144(r1) + stfd fp6,152(r1) + stfd fp7,160(r1) + stfd fp8,168(r1) + stfd fp9,176(r1) + stfd fp10,184(r1) + stfd fp11,192(r1) + stfd fp12,200(r1) + stfd fp13,208(r1) +/* XXX TODO: store vmx registers. */ +/* Load the extra parameters. */ + addi r6,r1,48 + addi r7,r1,432 + li r0,-1 + stdu r0,0(r7) bl JUMPTARGET(_dl_profile_fixup) /* Put the registers back. */ - ld 0,128+16(1) - ld 10,104(1) - ld 9,96(1) - ld 8,88(1) - ld 7,80(1) - mtlr 0 - ld 0,8(1) - ld 6,72(1) - ld 5,64(1) - ld 4,56(1) - mtcrf 0xFF,0 + ld r0,448+16(r1) + ld r10,104(r1) + ld r9,96(r1) + ld r8,88(r1) + ld r7,80(r1) + mtlr r0 + ld r0,8(r1) + ld r6,72(r1) + ld r5,64(r1) + ld r4,56(r1) + mtcrf 0xFF,r0 /* Load the target address, toc and static chain reg from the function descriptor returned by fixup. */ - ld 0,0(3) - ld 2,8(3) - mtctr 0 - ld 11,16(3) - ld 3,48(1) + ld r0,0(r3) + ld r2,8(r3) + mtctr r0 + ld r11,16(r3) + ld r3,48(r1) +/* Load the floating point registers. */ + lfd fp1,112(r1) + lfd fp2,120(r1) + lfd fp3,128(r1) + lfd fp4,136(r1) + lfd fp5,144(r1) + lfd fp6,152(r1) + lfd fp7,160(r1) + lfd fp8,168(r1) + lfd fp9,176(r1) + lfd fp10,184(r1) + lfd fp11,192(r1) + lfd fp12,200(r1) + lfd fp13,208(r1) /* Unwind the stack frame, and jump. */ - addi 1,1,128 + addi r1,r1,448 bctr END(_dl_profile_resolve) |