summaryrefslogtreecommitdiff
path: root/crt
diff options
context:
space:
mode:
authorRichard Pennington <rich@pennware.com>2012-11-09 23:32:57 +0100
committerrofl0r <retnyg@gmx.net>2012-11-13 18:15:10 +0100
commit7669d1e334e6b96455eece78da43bf830b93d697 (patch)
tree6649acfaa61ec6780498b55fa8015ca4f7a6cdae /crt
parent1e717ea3d2a864e00e507f1a70a892c551955f1b (diff)
downloadmusl-7669d1e334e6b96455eece78da43bf830b93d697.tar.gz
import preliminary ppc work by rdp.
Diffstat (limited to 'crt')
-rw-r--r--crt/ppc/crt1.S27
1 files changed, 27 insertions, 0 deletions
diff --git a/crt/ppc/crt1.S b/crt/ppc/crt1.S
new file mode 100644
index 00000000..abf64077
--- /dev/null
+++ b/crt/ppc/crt1.S
@@ -0,0 +1,27 @@
+#include <bits/asm.h>
+ .weak _init
+ .weak _fini
+ .global _start
+ .type _start, %function
+_start:
+ mr r9, r1 // Save the original stack pointer.
+ clrrwi r1, r1, 4 // Align the stack to 16 bytes.
+ lis r13, _SDA_BASE_@ha // r13 points to the small data area.
+ addi r13, r13, _SDA_BASE_@l //
+ li r0, 0 // Zero the frame pointer.
+ stwu r1, -16(r1) // The initial stack frame.
+ mtlr r0 // Clear the link register.
+ stw r0, 0(r1) // And save it.
+ lis r3, main@ha // Get main() ...
+ addi r3, r3, main@l
+ lwz r4, 0(r9) // and argc...
+ addi r5, r9, 4 // and argv ...
+ lis r6, _init@ha // and _init() ...
+ addi r6, r6, _init@l
+ lis r7, _fini@ha // and _fini() ...
+ addi r7, r7, _fini@l
+ li r8, 0 // ldso_fini == NULL
+ bl __libc_start_main // Let's go!
+ b . // Never gets here.
+ .end _start
+ .size _start, .-_start