| /* Copyright (c) 2008, 2009, 2011 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 |
| |
| /* Initialize data pointer register(s). |
| Note: The registers used here should agree with the definition of |
| GP_BASE_REGNUM in gcc/config/rx/rx.h. |
| Note: We are assuming that -mint-register has not been used when |
| compiling the application. */ |
| #ifdef _RX_PID |
| /* Initialise the constant data pointer and small data pointers. */ |
| mov #__pid_base, r13 |
| mov #__gp, r12 |
| #else |
| /* Initialise the small data area pointer. */ |
| mov #__gp, r13 |
| #endif |
| |
| 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 .rodata |
| .balign 4 |
| .global __pid_base |
| .weak __pid_base |
| __pid_base: |
| |
| .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 |