about summary refs log tree commit diff
path: root/sysdeps/standalone/m68k/m68020/start.S
blob: 9d7d779e044c9fa8cfe524117d521a8ba900c859 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/* Copyright (C) 1994, 1996 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., 675 Mass Ave,
Cambridge, MA 02139, 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)