Commit | Line | Data |
---|---|---|
15637ed4 RG |
1 | /*- |
2 | * Copyright (c) 1990 The Regents of the University of California. | |
3 | * All rights reserved. | |
4 | * | |
5 | * This code is derived from software contributed to Berkeley by | |
6 | * William Jolitz. | |
7 | * | |
8 | * Redistribution and use in source and binary forms, with or without | |
9 | * modification, are permitted provided that the following conditions | |
10 | * are met: | |
11 | * 1. Redistributions of source code must retain the above copyright | |
12 | * notice, this list of conditions and the following disclaimer. | |
13 | * 2. Redistributions in binary form must reproduce the above copyright | |
14 | * notice, this list of conditions and the following disclaimer in the | |
15 | * documentation and/or other materials provided with the distribution. | |
16 | * 3. All advertising materials mentioning features or use of this software | |
17 | * must display the following acknowledgement: | |
18 | * This product includes software developed by the University of | |
19 | * California, Berkeley and its contributors. | |
20 | * 4. Neither the name of the University nor the names of its contributors | |
21 | * may be used to endorse or promote products derived from this software | |
22 | * without specific prior written permission. | |
23 | * | |
24 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | |
25 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
26 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
27 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | |
28 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
29 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
30 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
31 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
32 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
33 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
34 | * SUCH DAMAGE. | |
35 | * | |
e73885af RG |
36 | * from: @(#)srt0.c 5.3 (Berkeley) 4/28/91 |
37 | * $Id$ | |
15637ed4 RG |
38 | */ |
39 | ||
40 | /* | |
41 | * Startup code for standalone system | |
42 | * Non-relocating version -- for programs which are loaded by boot | |
43 | * Relocating version for boot | |
44 | * Small relocating version for "micro" boot | |
45 | */ | |
46 | ||
47 | .globl _end | |
48 | .globl _edata | |
49 | .globl _main | |
50 | .globl __rtt | |
51 | .globl _exit | |
52 | .globl _bootdev | |
53 | .globl _cyloffset | |
54 | #define NOP inb $0x84,%al ; inb $0x84,%al | |
55 | ||
56 | #ifdef SMALL | |
57 | /* where the disklabel goes if we have one */ | |
58 | .globl _disklabel | |
59 | _disklabel: | |
60 | .space 512 | |
61 | .globl _scsisn | |
62 | .set _scsisn, RELOC+0x60 | |
63 | #endif | |
64 | ||
65 | .globl entry | |
66 | .set entry,0 | |
67 | .globl start | |
68 | ||
69 | #if defined(REL) && !defined(SMALL) | |
70 | ||
71 | /* relocate program and enter at symbol "start" */ | |
72 | ||
73 | #movl $entry-RELOC,%esi # from beginning of ram | |
74 | movl $0,%esi | |
75 | #movl $entry,%edi # to relocated area | |
76 | movl $ RELOC,%edi # to relocated area | |
77 | # movl $_edata-RELOC,%ecx # this much | |
78 | movl $64*1024,%ecx | |
79 | cld | |
80 | rep | |
81 | movsb | |
82 | # relocate program counter to relocation base | |
83 | pushl $start | |
84 | ret | |
85 | #endif | |
86 | ||
87 | start: | |
88 | ||
89 | /* setup stack pointer */ | |
90 | ||
91 | #ifdef REL | |
92 | leal 4(%esp),%eax /* ignore old pc */ | |
93 | movl $ RELOC-3*4,%ebx | |
94 | /* copy boot parameters */ | |
95 | pushl $3*4 | |
96 | pushl %ebx | |
97 | pushl %eax | |
98 | call _bcopy | |
99 | movl %ebx,%esp | |
100 | #else | |
101 | /* save old stack state */ | |
102 | movl %esp,savearea | |
103 | movl %ebp,savearea+4 | |
104 | movl $ RELOC-0x2400,%esp | |
105 | #endif | |
106 | ||
107 | /* clear memory as needed */ | |
108 | ||
109 | movl %esp,%esi | |
110 | #ifdef REL | |
111 | ||
112 | /* | |
113 | * Clear Bss and up to 64K heap | |
114 | */ | |
115 | movl $64*1024,%ebx | |
116 | movl $_end,%eax # should be movl $_end-_edata but ... | |
117 | subl $_edata,%eax | |
118 | #addl %ebx,%eax | |
119 | pushl %eax | |
120 | pushl $_edata | |
121 | call _bzero | |
122 | ||
123 | /* | |
124 | * Clear 64K of stack | |
125 | */ | |
126 | movl %esi,%eax | |
127 | subl %ebx,%eax | |
128 | subl $5*4,%ebx | |
129 | pushl %ebx | |
130 | pushl %eax | |
131 | call _bzero | |
132 | #else | |
133 | movl $_edata,%edx | |
134 | movl %esp,%eax | |
135 | subl %edx,%eax | |
136 | pushl %edx | |
137 | pushl %esp | |
138 | call _bzero | |
139 | #endif | |
140 | ||
141 | call _kbdreset /* resets keyboard and gatea20 brain damage */ | |
142 | movl %esi,%esp | |
143 | call _main | |
144 | jmp 1f | |
145 | ||
146 | .data | |
147 | _bootdev: .long 0 | |
148 | _cyloffset: .long 0 | |
149 | savearea: .long 0,0 # sp & bp to return to | |
150 | .text | |
151 | .globl _wait | |
152 | ||
153 | __rtt: | |
154 | pushl $1000000 | |
155 | call _wait | |
156 | popl %eax | |
157 | movl $-7,%eax | |
158 | jmp 1f | |
159 | ||
160 | _exit: | |
161 | pushl $1000000 | |
162 | call _wait | |
163 | popl %eax | |
164 | movl 4(%esp),%eax | |
165 | 1: | |
166 | #ifdef REL | |
167 | #ifndef SMALL | |
168 | call _reset_cpu | |
169 | #endif | |
170 | movw $0x1234,%ax | |
171 | movw %ax,0x472 # warm boot | |
172 | movl $0,%esp # segment violation | |
173 | ret | |
174 | #else | |
175 | movl savearea,%esp | |
176 | movl savearea+4,%ebp | |
177 | ret | |
178 | #endif | |
179 | ||
180 | .globl _inb | |
181 | _inb: movl 4(%esp),%edx | |
182 | subl %eax,%eax # clr eax | |
183 | NOP | |
184 | inb %dx,%al | |
185 | ret | |
186 | ||
187 | .globl _outb | |
188 | _outb: movl 4(%esp),%edx | |
189 | NOP | |
190 | movl 8(%esp),%eax | |
191 | outb %al,%dx | |
192 | ret | |
193 | ||
194 | .globl ___udivsi3 | |
195 | ___udivsi3: | |
196 | movl 4(%esp),%eax | |
197 | xorl %edx,%edx | |
198 | divl 8(%esp) | |
199 | ret | |
200 | ||
201 | .globl ___divsi3 | |
202 | ___divsi3: | |
203 | movl 4(%esp),%eax | |
204 | xorl %edx,%edx | |
205 | cltd | |
206 | idivl 8(%esp) | |
207 | ret | |
208 | ||
209 | # | |
210 | # bzero (base,cnt) | |
211 | # | |
212 | ||
213 | .globl _bzero | |
214 | _bzero: | |
215 | pushl %edi | |
216 | movl 8(%esp),%edi | |
217 | movl 12(%esp),%ecx | |
218 | movb $0x00,%al | |
219 | cld | |
220 | rep | |
221 | stosb | |
222 | popl %edi | |
223 | ret | |
224 | ||
225 | # | |
226 | # bcopy (src,dst,cnt) | |
227 | # NOTE: does not (yet) handle overlapped copies | |
228 | # | |
229 | ||
230 | .globl _bcopy | |
231 | _bcopy: | |
232 | pushl %esi | |
233 | pushl %edi | |
234 | movl 12(%esp),%esi | |
235 | movl 16(%esp),%edi | |
236 | movl 20(%esp),%ecx | |
237 | cld | |
238 | rep | |
239 | movsb | |
240 | popl %edi | |
241 | popl %esi | |
242 | ret | |
243 | ||
244 | # insw(port,addr,cnt) | |
245 | .globl _insw | |
246 | _insw: | |
247 | pushl %edi | |
248 | movw 8(%esp),%dx | |
249 | movl 12(%esp),%edi | |
250 | movl 16(%esp),%ecx | |
251 | NOP | |
252 | cld | |
253 | nop | |
254 | .byte 0x66,0xf2,0x6d # rep insw | |
255 | nop | |
256 | movl %edi,%eax | |
257 | popl %edi | |
258 | ret | |
259 | ||
260 | # outsw(port,addr,cnt) | |
261 | .globl _outsw | |
262 | _outsw: | |
263 | pushl %esi | |
264 | movw 8(%esp),%dx | |
265 | movl 12(%esp),%esi | |
266 | movl 16(%esp),%ecx | |
267 | NOP | |
268 | cld | |
269 | nop | |
270 | .byte 0x66,0xf2,0x6f # rep outsw | |
271 | nop | |
272 | movl %esi,%eax | |
273 | popl %esi | |
274 | ret |