diff options
Diffstat (limited to 'libgloss/ms1/crt0.S')
-rw-r--r-- | libgloss/ms1/crt0.S | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/libgloss/ms1/crt0.S b/libgloss/ms1/crt0.S new file mode 100644 index 000000000..276124f5c --- /dev/null +++ b/libgloss/ms1/crt0.S @@ -0,0 +1,63 @@ +# Startup Code for the Morpho ms1 + +# Create a label for the start of the eh_frame section. + .section .eh_frame +__eh_frame_begin: + + .section .text + .global _start +_start: + + ;; Initialise the stack pointer + ldui sp, #%hi16(__stack) + addui sp, sp, #%lo16(__stack) + or fp, sp, sp + + ;; Zero the data space + ldui r9, #%hi16(_edata) + addui r9, r9, #%lo16(_edata) + ldui r10, #%hi16(_end) + addui r10, r10, #%lo16(_end) + addi r5, r0, #0 + +.L0: + stw r5, r9, #0 + addi r9, r9, #4 + or r0, r0, r0 ; nop + brle r9, r10, .L0 + or r0, r0, r0 ; nop + + ;; Call global and static constructors + ldui r10, #%hi16(_init) + addui r10, r10, #%lo16(_init) + or r0, r0, r0 ; nop + jal r14, r10 + or r0, r0, r0 ; nop + ;; Setup destructors to be called from exit. + ;; (Just in case main never returns....) + ldui r10, #%hi16(atexit) + addui r10, r10, #%lo16(atexit) + ldui r1, #%hi16(_fini) + addui r1, r1, #%lo16(_fini) + or r0, r0, r0 ; nop + jal r14, r10 + or r0, r0, r0 ; nop + + ;; Initialise argc, argv and envp to empty + addi r1, r0, #0 + addi r2, r0, #0 + addi r3, r0, #0 + + ;; Call main + ldui r10, #%hi16(main) + addui r10, r10, #%lo16(main) + or r0, r0, r0 ; nop + jal r14, r10 + or r0, r0, r0 ; nop + + ;; Jump to exit + ldui r10, #%hi16(exit) + addui r10, r10, #%lo16(exit) + or r0, r0, r0 ; nop + jal r14, r10 + or r0, r0, r0 ; nop |