summaryrefslogtreecommitdiff
path: root/src/ldso/powerpc/start.s
diff options
context:
space:
mode:
Diffstat (limited to 'src/ldso/powerpc/start.s')
-rw-r--r--src/ldso/powerpc/start.s33
1 files changed, 16 insertions, 17 deletions
diff --git a/src/ldso/powerpc/start.s b/src/ldso/powerpc/start.s
index ac2c20c8..08b5979a 100644
--- a/src/ldso/powerpc/start.s
+++ b/src/ldso/powerpc/start.s
@@ -1,22 +1,21 @@
-# FIXME : does not work, the small data array needs to be relocated.
-# see elfspec_ppc.pdf, page 76-84
.global _start
.type _start,@function
_start:
- mr 9, 1 # Save the original stack pointer.
- clrrwi 1, 1, 4 # Align the stack to 16 bytes.
- lis 13, _SDA_BASE_@ha # r13 points to the small data area.
- addi 13, 13, _SDA_BASE_@l
- li 0, 0 # Zero the frame pointer.
- lwz 3, 0(9) # and argc...
- addi 4, 9, 4 # and argv ...
- mtlr 0 # Clear the link register.
- # Go to the musl dynamic linker entry point.
+ bl 1f
+2: .long _DYNAMIC-2b
+1: mflr 5
+ lwz 0, 0(5)
+ add 5, 0, 5
+ lwz 3, 0(1)
+ addi 4, 1, 4
+ addi 1, 1, -16
+ bl __reloc_self
+
+ lwz 3, 16(1)
+ addi 4, 1, 20
bl __dynlink
- cmpi 4, 0, 3, 1 # Check for a 1.
- bne 4, . # Stay here
- mtlr 3 # Set the link address...
+ addi 1, 1, 16
+
+ mtlr 3
li 3, 0
- blr # and go.
- .end _start
- .size _start, .-_start
+ blr