diff options
Diffstat (limited to 'libgloss/rx/crt0.S')
-rw-r--r-- | libgloss/rx/crt0.S | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/libgloss/rx/crt0.S b/libgloss/rx/crt0.S new file mode 100644 index 000000000..26955f991 --- /dev/null +++ b/libgloss/rx/crt0.S @@ -0,0 +1,176 @@ +/* Copyright (c) 2008, 2009 Red Hat Incorporated. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 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. + + The name of Red Hat Incorporated may not 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 Red Hat + incorporated 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. */ + + .text + + .global _start +_start: +.LFB2: + mvtc #0, psw + /* Enable the DN bit - this should have been done for us by + the CPU reset, but it is best to make sure for ourselves. */ + mvtc #0x100, fpsw + mov #__stack, r0 + mvtc #__vectors, intb + + mov #__datastart, r1 + mov #__romdatastart, r2 + mov #__romdatacopysize, r3 + smovf + + mov #__bssstart, r1 + mov #0, r2 + mov #__bsssize, r3 + sstr.l + + /* Initialise the small data area pointer. + The register used here must agree with the definition of + GP_BASE_REGNUM in gcc/config/rx/rx.h. */ + mov #__gp, r13 + + bsr.a __rx_init + +#ifdef PROFILE_SUPPORT /* Defined in gcrt0.S. */ + mov # _start, r1 + mov # _etext, r2 + bsr.a __monstartup +#endif + + mov #0, r1 /* argc */ + mov #0, r2 /* argv */ + mov #0, r3 /* envv */ + bsr.a _main +.LFE2: + +#ifdef PROFILE_SUPPORT + mov r1, r13 ; Save return code. + bsr.a __mcleanup + mov r13, r1 +#endif + + bsr.a _exit + + .global _rx_run_preinit_array + .type _rx_run_preinit_array,@function +_rx_run_preinit_array: + mov #__preinit_array_start,r1 + mov #__preinit_array_end,r2 + bra.a _rx_run_inilist + + .global _rx_run_init_array + .type _rx_run_init_array,@function +_rx_run_init_array: + mov #__init_array_start,r1 + mov #__init_array_end,r2 + mov #4, r3 + bra.a _rx_run_inilist + + .global _rx_run_fini_array + .type _rx_run_fini_array,@function +_rx_run_fini_array: + mov #__fini_array_start,r2 + mov #__fini_array_end,r1 + mov #-4, r3 + /* fall through */ + +_rx_run_inilist: +next_inilist: + cmp r1,r2 + beq.b done_inilist + mov.l [r1],r4 + cmp #-1, r4 + beq.b skip_inilist + cmp #0, r4 + beq.b skip_inilist + pushm r1-r3 + jsr r4 + popm r1-r3 +skip_inilist: + add r3,r1 + bra.b next_inilist +done_inilist: + rts + + .section .init,"ax" + + .global __rx_init +__rx_init: + + .section .fini,"ax" + + .global __rx_fini +__rx_fini: + bsr.a _rx_run_fini_array + + .section .sdata + .balign 4 + .global __gp + .weak __gp +__gp: + + .section .data + .global ___dso_handle + .weak ___dso_handle +___dso_handle: + .long 0 + +;;; Provide Dwarf unwinding information that will help GDB stop +;;; backtraces at the right place. This is stolen from assembly +;;; code generated by GCC with -dA. + .section .debug_frame,"",@progbits +.Lframe0: + .4byte .LECIE0-.LSCIE0 ; Length of Common Information Entry +.LSCIE0: + .4byte 0xffffffff ; CIE Identifier Tag + .byte 0x1 ; CIE Version + .ascii "\0" ; CIE Augmentation + .uleb128 0x1 ; CIE Code Alignment Factor + .sleb128 -1 ; CIE Data Alignment Factor + .byte 0xd ; CIE RA Column + .byte 0xc ; DW_CFA_def_cfa + .uleb128 0xc + .uleb128 0x3 + .byte 0x8d ; DW_CFA_offset, column 0xd + .uleb128 0x3 + .p2align 2 +.LECIE0: +.LSFDE0: + .4byte .LEFDE0-.LASFDE0 ; FDE Length +.LASFDE0: + .4byte .Lframe0 ; FDE CIE offset + .4byte .LFB2 ; FDE initial location + .4byte .LFE2-.LFB2 ; FDE address range + .byte 0xf ; DW_CFA_def_cfa_expression + .uleb128 1 ; length of expression + .byte 0x30 ; DW_OP_lit0 + .p2align 2 +.LEFDE0: + + .text |