# Startup Code for the Morpho mt # 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