/* Copyright (C) 1994, 1996, 1997 Free Software Foundation, Inc. Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil), On-Line Applications Research Corporation. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* entry.s * * This file contains the entry point for the application. * The name of this entry point is compiler dependent. * It jumps to the BSP which is responsible for performing * all initialization. */ .text .globl start | Default entry point .globl _start | Default entry point .globl M68Kvec | Vector Table .globl _M68Kvec | Vector Table start: _start: M68Kvec: | standard location for vectors _M68Kvec: | standard location for vectors nop | for linkers with problem | using location zero as entry jmp around .space 4088 | to avoid initial intr stack | from 135BUG on MVME13? as entry | and start code at 0x4000 around: move.w %sr,initial_sr | save initial values movec %isp,%a0 movel %a0,initial_isp movec %usp,%a0 movel %a0,initial_usp movec %msp,%a0 movel %a0,initial_msp oriw #0x0700,%sr | INTERRUPTS OFF!!! | | zero out uninitialized data area | zerobss: moveal #end,%a0 | find end of .bss moveal #_bss_start,%a1 | find beginning of .bss movel #0,%d0 loop: movel #0,%a1@+ | to zero out uninitialized cmpal %a0,%a1 jlt loop | loop until _end reached movel #heap_size,__C_heap_size | set ___C_heap_size movel #heap_memory,__C_heap_start | set ___C_heap_start moveal #interrupt_stack_end,%a0 | set interrupt stack pointer movec %a0,%isp moveal #stack_end,%a0 | set master stack pointer movec %a0,%msp moveal #stack_end,%a6 | set base pointer movw #0x3000,%sr | SUPV MODE,INTERRUPTS ON!!! #ifdef NEED_UNDERSCORES jsr __Board_Initialize | initialize the board #else jsr _Board_Initialize | initialize the board #endif move.l #0,%sp@- | envp = NULL move.l #0,%sp@- | argv = NULL move.l #0,%sp@- | argc = NULL #ifdef NEED_UNDERSCORES jsr ___libc_init | initialize the library and | call main #else jsr __libc_init | initialize the library and | call main #endif add.l #12,%sp move.l #0,%sp@- | argc = NULL jsr __exit | call the Board specific exit addq.l #4,%sp move.l initial_isp,%a0 | if __exit returns then we can movec %a0,%isp | restore the initial values move.l initial_usp,%a0 movec %a0,%usp move.l initial_msp,%a0 movec %a0,%msp move.w initial_sr,%sr rts .bss /* * So initial stack registers and status register can be saved. */ #define DECLARE_SPACE(_name,_space,_align) \ .globl _name ; \ .align _align ; \ _name##: .space _space #define DECLARE_LABEL(_name) \ .globl _name ; \ _name##: #define DECLARE_PTR(_name) DECLARE_SPACE(_name,4,2) #define DECLARE_U32(_name) DECLARE_SPACE(_name,4,2) #define DECLARE_U16(_name) DECLARE_SPACE(_name,2,1) DECLARE_U32(initial_isp) DECLARE_U32(initial_msp) DECLARE_U32(initial_usp) DECLARE_U16(initial_sr) /* * Require environment stuff */ DECLARE_LABEL(_environ) DECLARE_PTR(environ) DECLARE_LABEL(__errno) DECLARE_LABEL(_errno) DECLARE_U32(errno) /* * Stack Size and Space */ .set stack_size, 0x20000 DECLARE_SPACE(stack_memory,stack_size,4) DECLARE_LABEL(stack_end) DECLARE_SPACE(interrupt_stack_memory,0x1000,4) DECLARE_LABEL(interrupt_stack_end)