diff options
Diffstat (limited to 'libgloss/arc64/crt0.S')
-rw-r--r-- | libgloss/arc64/crt0.S | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/libgloss/arc64/crt0.S b/libgloss/arc64/crt0.S new file mode 100644 index 0000000..c5fe57b --- /dev/null +++ b/libgloss/arc64/crt0.S @@ -0,0 +1,160 @@ +/* + Copyright (c) 2024, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + The startup code for the ARC family of processors does the following before + transferring control to user defined main label: + 1. Set sp to __stack_top (link time variable) + 2. Zero out the bss section (for uninitialized globals) + After returning from main, the processor is halted and the pipeline is + flushed out. +*/ + +#include "asm.h" +#include "../arc/arc-symbols.h" + + .macro initfp from=0, to=31 + fmvi2s f0+\from,r0 + .if \to-\from + initfp "(\from+1)",\to + .endif + .endm + + .extern main + + .section .text.__startup, "ax", @progbits + .global __start + .type __start, @function + .align 4 +__start: + MOVRI_S sp, STACK_TOP ; Stack address + + ; Allow unaligned accesses. + lr r2, [0xA] + bset r2, r2, 19 + flag r2 + +;;; Clear the bss segment. + MOVRI_S r0, SMALL_DATA_BSS_START ; r0 = start of the bss section + MOVRI_S r2, SMALL_DATA_BSS_END + SUBR r2, r2, r0 ; r2 = size of the bss section in bytes + MOVR_S r1, 0 ; r1 = bytes to fill in + bl memset + +;;; Clear the registers. + MOVR_S r0, 0 + MOVR_S r1, 0 + MOVR_S r2, 0 + MOVR_S r3, 0 + MOVR_S r4, 0 + MOVR_S r5, 0 + MOVR_S r6, 0 + MOVR_S r7, 0 + MOVR_S r8, 0 + MOVR_S r9, 0 + MOVR_S r10, 0 + MOVR_S r11, 0 + MOVR_S r12, 0 + MOVR_S r13, 0 + MOVR_S r14, 0 + MOVR_S r15, 0 + MOVR_S r16, 0 + MOVR_S r17, 0 + MOVR_S r18, 0 + MOVR_S r19, 0 + MOVR_S r20, 0 + MOVR_S r21, 0 + MOVR_S r22, 0 + MOVR_S r23, 0 + MOVR_S r24, 0 + MOVR_S r25, 0 + MOVR_S r26, 0 + MOVR_S r27, 0 + ;; SP (r28) is initialized + MOVR_S ilink, 0 + MOVR r30, 0 + +#if defined(__ARC_FPU_DP__) || defined (__ARC_FPU_SP__) + initfp 0,31 +#endif + + ;; Call constructors. + jl _init + +;;; Setup fini routines to be called from exit + MOVRI_S r0, _fini + jl atexit + + jl __setup_argv_and_call_main + + j exit + .size __start, .-__start + +;;; arc-main-helper.o object can be used to replace this function +;;; and properly set up arguments and/or other low-level stuff. + .section .text.__setup_argv_and_call_main,"ax",@progbits + .weak __setup_argv_and_call_main + .type __setup_argv_and_call_main, @function + .align 4 + +__setup_argv_and_call_main: + PUSHR blink +;;; Call main() with argv[0] set to "baremetal", argv[1] to NULL and empty envp + MOVR_S r0, 1 ; Set argc to 1 + ADDPCL r1,.argv_data ; Set argv to the appropriate pointer + MOVR_S r2, 0 + MOVR_S r3, 0 + + MOVRI_S blink, main + jl [blink] + + POPR blink + j_s [blink] + + .align 4 + ;; Dummy program name +.prog_name: + .string "baremetal" +;; argv data +.argv_data: + WORD @.prog_name + WORD 0x00 + .size __setup_argv_and_call_main, .-__setup_argv_and_call_main + + .section .text._exit_halt,"ax",@progbits + .global _exit_halt + .type _exit_halt, @function + .align 4 +_exit_halt: + ; r0 contains exit code + mov r0, r0 + flag 1 + b _exit_halt + .size _exit_halt, .-_exit_halt |