/* * 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 */