| /* |
| |
| Copyright (c) 2005,2008 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. |
| |
| */ |
| |
| #if defined(__r8c_cpu__) || defined(__m16c_cpu__) |
| #define A16 |
| #define A(n,w) n |
| #define W w |
| #define ALIGN 1 |
| #else |
| #define A24 |
| #define A(n,w) w |
| #define W l |
| #define ALIGN 2 |
| #endif |
| |
| .section ".resetvec","ax",@progbits |
| .long _start |
| |
| .text |
| |
| .global _start |
| _start: |
| .LFB2: |
| fclr U /* One stack for user and interrupts */ |
| ldc #__stack,sp |
| |
| #ifdef A16 |
| mov.b #%hi8(__romdatastart),r1h |
| mov.w #%lo16(__romdatastart),a0 |
| mov.w #__datastart,a1 |
| #else |
| mov.l #__romdatastart,a0 |
| mov.l #__datastart,a1 |
| #endif |
| mov.w #__romdatacopysize,r3 |
| shl.w #-1,r3 |
| smovf.w |
| |
| #ifdef A16 |
| mov.w #__bssstart,a1 |
| #else |
| mov.l #__bssstart,a1 |
| #endif |
| mov.w #__bsssize,r3 |
| shl.w #-1,r3 |
| mov.w #0,r0 |
| sstr.w |
| |
| #ifdef A16 |
| ldc #%lo16(__var_vects),intbl |
| ldc #%hi16(__var_vects),intbh |
| #else |
| ldc #__var_vects,intb |
| #endif |
| |
| fset I |
| jsr.a __m32c_init |
| |
| jsr.a _main |
| .LFE2: |
| |
| #ifdef A24 |
| /* rv in r0, ok for arg0 */ |
| #else |
| mov.w r0,r1 |
| #endif |
| |
| jsr.a _exit |
| |
| .text |
| |
| .global _m32c_run_preinit_array |
| .type _m32c_run_preinit_array,@function |
| _m32c_run_preinit_array: |
| mov.W #__preinit_array_start,a0 |
| mov.W #__preinit_array_end,a1 |
| jmp.w _m32c_run_inilist |
| |
| .global _m32c_run_init_array |
| .type _m32c_run_init_array,@function |
| _m32c_run_init_array: |
| mov.W #__init_array_start,a0 |
| mov.W #__init_array_end,a1 |
| jmp.w _m32c_run_inilist |
| |
| .global _m32c_run_fini_array |
| .type _m32c_run_fini_array,@function |
| _m32c_run_fini_array: |
| mov.W #__fini_array_start,a0 |
| mov.W #__fini_array_end,a1 |
| /* fall through */ |
| |
| _m32c_run_inilist: |
| next_inilist: |
| cmp.W a0,a1 |
| jeq done_inilist |
| pushm a0,a1 |
| mov.W [a0],a0 |
| #ifdef A16 |
| mov.b:s #0,a1 /* zero extends */ |
| jsri.a a1a0 |
| #else |
| jsri.a a0 |
| #endif |
| popm a0,a1 |
| add.W A(#2,#4),a0 |
| jmp.b next_inilist |
| done_inilist: |
| rts |
| |
| .section .init,"ax",@progbits |
| |
| .global __m32c_init |
| __m32c_init: |
| enter #0 |
| |
| .section .fini,"ax",@progbits |
| |
| .global __m32c_fini |
| __m32c_fini: |
| enter #0 |
| jsr.a _m32c_run_fini_array |
| |
| |
| ;;; 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 ALIGN |
| .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 ALIGN |
| .LEFDE0: |
| |
| .text |