98 lines
2.7 KiB
ArmAsm
98 lines
2.7 KiB
ArmAsm
|
/*
|
||
|
* crt0_redboot.S -- Minimal startup file for MN10300 targets running Redboot.
|
||
|
*
|
||
|
* Copyright (c) 2001 Red Hat, Inc.
|
||
|
* Derived from crt0_cygmon.S - Copyright (c) 1995, 1996, 1997, 2000 Red Hat, Inc.
|
||
|
*
|
||
|
* The authors hereby grant permission to use, copy, modify, distribute,
|
||
|
* and license this software and its documentation for any purpose, provided
|
||
|
* that existing copyright notices are retained in all copies and that this
|
||
|
* notice is included verbatim in any distributions. No written agreement,
|
||
|
* license, or royalty fee is required for any of the authorized uses.
|
||
|
* Modifications to this software may be copyrighted by their authors
|
||
|
* and need not follow the licensing terms described here, provided that
|
||
|
* the new terms are clearly indicated on the first page of each file where
|
||
|
* they apply.
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* This file contains the minimal startup code necessary.
|
||
|
* This will not do any hardware initialization. It is assumed that we are talking to Redboot
|
||
|
* and therefore the hardware will be initialized properly.
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* Set up some room for a stack. We just grab a chunk of memory.
|
||
|
*/
|
||
|
#define STACK_SIZE 0x4000
|
||
|
#define GLOBAL_SIZE 0x2000
|
||
|
|
||
|
#define STARTUP_STACK_SIZE 0x0100
|
||
|
|
||
|
.comm __memsize, 12
|
||
|
.comm __lstack, STARTUP_STACK_SIZE
|
||
|
.comm __stackbase,4
|
||
|
|
||
|
.section .text
|
||
|
.global _start
|
||
|
_start:
|
||
|
/*
|
||
|
* Setup a small stack so we can run some C code,
|
||
|
* and get the usable memory size.
|
||
|
*/
|
||
|
mov __lstack,a0
|
||
|
add STARTUP_STACK_SIZE-4,a0
|
||
|
mov a0,sp
|
||
|
|
||
|
/*
|
||
|
* zero out the bss section.
|
||
|
*/
|
||
|
.global __memsize
|
||
|
.global _get_mem_info
|
||
|
zerobss:
|
||
|
mov __bss_start, a0 # These variables are defined in the linker script
|
||
|
mov _end, a1
|
||
|
|
||
|
cmp a0, a1 # If no bss, then do nothing
|
||
|
beq 7f
|
||
|
|
||
|
clr d0
|
||
|
3:
|
||
|
movbu d0,(a0) # Clear a byte and bump pointer
|
||
|
inc a0
|
||
|
cmp a0, a1
|
||
|
bne 3b
|
||
|
|
||
|
7:
|
||
|
/*
|
||
|
* Setup the stack pointer --
|
||
|
* get_mem_info returns the top of memory, so just use that In
|
||
|
* addition, we must subtract 24 bytes for the 3 8 byte
|
||
|
* arguments to main, in case main wants to write them back to
|
||
|
* the stack. The caller is supposed to allocate stack space
|
||
|
* for parameters in registers in the old MIPS ABIs. We must
|
||
|
* do this even though we aren't passing arguments, because
|
||
|
* main might be declared to have them.
|
||
|
* Some ports need a larger alignment for the stack, so we
|
||
|
* subtract 32, which satisifes the stack for the arguments and
|
||
|
* keeps the stack pointer better aligned.
|
||
|
*/
|
||
|
mov __memsize, d0
|
||
|
call _get_mem_info,[],0
|
||
|
|
||
|
sub 32, a0
|
||
|
mov a0, sp
|
||
|
|
||
|
mov __stackbase, a1
|
||
|
mov a0, (a1) # keep this for future ref
|
||
|
|
||
|
call ___main,[],0 # Call __main to run ctors/dtors
|
||
|
clr d0
|
||
|
clr d1
|
||
|
mov d0, (4,sp)
|
||
|
or 0x0800,psw # Enable interrupts
|
||
|
call _main,[],0 # Call main program
|
||
|
call _exit,[],0
|
||
|
|
||
|
/* EOF crt0_redboot.S */
|