Commit | Line | Data |
---|---|---|
8d9b6bfd WJ |
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 | * | |
36 | * @(#)srt0.c 5.3 (Berkeley) 4/28/91 | |
37 | */ | |
38 | ||
39 | /* | |
40 | * Startup code for standalone system | |
41 | * Non-relocating version -- for programs which are loaded by boot | |
42 | * Relocating version for boot | |
43 | * Small relocating version for "micro" boot | |
44 | */ | |
45 | ||
46 | .globl _end | |
47 | .globl _edata | |
48 | .globl _main | |
49 | .globl __rtt | |
50 | .globl _exit | |
51 | .globl _bootdev | |
52 | .globl _cyloffset | |
53 | #define NOP inb $0x84,%al ; inb $0x84,%al | |
54 | ||
55 | #ifdef SMALL | |
56 | /* where the disklabel goes if we have one */ | |
57 | .globl _disklabel | |
58 | _disklabel: | |
59 | .space 512 | |
60 | .globl _scsisn | |
61 | .set _scsisn, RELOC+0x60 | |
62 | #endif | |
63 | ||
64 | .globl entry | |
65 | .set entry,0 | |
66 | .globl start | |
67 | ||
68 | #if defined(REL) && !defined(SMALL) | |
69 | ||
70 | /* relocate program and enter at symbol "start" */ | |
71 | ||
72 | #movl $entry-RELOC,%esi # from beginning of ram | |
73 | movl $0,%esi | |
74 | #movl $entry,%edi # to relocated area | |
75 | movl $ RELOC,%edi # to relocated area | |
76 | # movl $_edata-RELOC,%ecx # this much | |
77 | movl $64*1024,%ecx | |
78 | cld | |
79 | rep | |
80 | movsb | |
81 | # relocate program counter to relocation base | |
82 | pushl $start | |
83 | ret | |
84 | #endif | |
85 | ||
86 | start: | |
87 | ||
88 | /* setup stack pointer */ | |
89 | ||
90 | #ifdef REL | |
91 | leal 4(%esp),%eax /* ignore old pc */ | |
92 | movl $ RELOC-3*4,%ebx | |
93 | /* copy boot parameters */ | |
94 | pushl $3*4 | |
95 | pushl %ebx | |
96 | pushl %eax | |
97 | call _bcopy | |
98 | movl %ebx,%esp | |
99 | #else | |
100 | /* save old stack state */ | |
101 | movl %esp,savearea | |
102 | movl %ebp,savearea+4 | |
103 | movl $ RELOC-0x2400,%esp | |
104 | #endif | |
105 | ||
106 | /* clear memory as needed */ | |
107 | ||
108 | movl %esp,%esi | |
109 | #ifdef REL | |
110 | ||
111 | /* | |
112 | * Clear Bss and up to 64K heap | |
113 | */ | |
114 | movl $64*1024,%ebx | |
115 | movl $_end,%eax # should be movl $_end-_edata but ... | |
116 | subl $_edata,%eax | |
117 | #addl %ebx,%eax | |
118 | pushl %eax | |
119 | pushl $_edata | |
120 | call _bzero | |
121 | ||
122 | /* | |
123 | * Clear 64K of stack | |
124 | */ | |
125 | movl %esi,%eax | |
126 | subl %ebx,%eax | |
127 | subl $5*4,%ebx | |
128 | pushl %ebx | |
129 | pushl %eax | |
130 | call _bzero | |
131 | #else | |
132 | movl $_edata,%edx | |
133 | movl %esp,%eax | |
134 | subl %edx,%eax | |
135 | pushl %edx | |
136 | pushl %esp | |
137 | call _bzero | |
138 | #endif | |
139 | ||
140 | call _kbdreset /* resets keyboard and gatea20 brain damage */ | |
141 | movl %esi,%esp | |
142 | call _main | |
143 | jmp 1f | |
144 | ||
145 | .data | |
146 | _bootdev: .long 0 | |
147 | _cyloffset: .long 0 | |
148 | savearea: .long 0,0 # sp & bp to return to | |
149 | .text | |
150 | .globl _wait | |
151 | ||
152 | __rtt: | |
153 | pushl $1000000 | |
154 | call _wait | |
155 | popl %eax | |
156 | movl $-7,%eax | |
157 | jmp 1f | |
158 | ||
159 | _exit: | |
160 | pushl $1000000 | |
161 | call _wait | |
162 | popl %eax | |
163 | movl 4(%esp),%eax | |
164 | 1: | |
165 | #ifdef REL | |
166 | #ifndef SMALL | |
167 | call _reset_cpu | |
168 | #endif | |
169 | movw $0x1234,%ax | |
170 | movw %ax,0x472 # warm boot | |
171 | movl $0,%esp # segment violation | |
172 | ret | |
173 | #else | |
174 | movl savearea,%esp | |
175 | movl savearea+4,%ebp | |
176 | ret | |
177 | #endif | |
178 | ||
179 | .globl _inb | |
180 | _inb: movl 4(%esp),%edx | |
181 | subl %eax,%eax # clr eax | |
182 | NOP | |
183 | inb %dx,%al | |
184 | ret | |
185 | ||
186 | .globl _outb | |
187 | _outb: movl 4(%esp),%edx | |
188 | NOP | |
189 | movl 8(%esp),%eax | |
190 | outb %al,%dx | |
191 | ret | |
192 | ||
193 | .globl ___udivsi3 | |
194 | ___udivsi3: | |
195 | movl 4(%esp),%eax | |
196 | xorl %edx,%edx | |
197 | divl 8(%esp) | |
198 | ret | |
199 | ||
200 | .globl ___divsi3 | |
201 | ___divsi3: | |
202 | movl 4(%esp),%eax | |
203 | xorl %edx,%edx | |
204 | cltd | |
205 | idivl 8(%esp) | |
206 | ret | |
207 | ||
208 | # | |
209 | # bzero (base,cnt) | |
210 | # | |
211 | ||
212 | .globl _bzero | |
213 | _bzero: | |
214 | pushl %edi | |
215 | movl 8(%esp),%edi | |
216 | movl 12(%esp),%ecx | |
217 | movb $0x00,%al | |
218 | cld | |
219 | rep | |
220 | stosb | |
221 | popl %edi | |
222 | ret | |
223 | ||
224 | # | |
225 | # bcopy (src,dst,cnt) | |
226 | # NOTE: does not (yet) handle overlapped copies | |
227 | # | |
228 | ||
229 | .globl _bcopy | |
230 | _bcopy: | |
231 | pushl %esi | |
232 | pushl %edi | |
233 | movl 12(%esp),%esi | |
234 | movl 16(%esp),%edi | |
235 | movl 20(%esp),%ecx | |
236 | cld | |
237 | rep | |
238 | movsb | |
239 | popl %edi | |
240 | popl %esi | |
241 | ret | |
242 | ||
243 | # insw(port,addr,cnt) | |
244 | .globl _insw | |
245 | _insw: | |
246 | pushl %edi | |
247 | movw 8(%esp),%dx | |
248 | movl 12(%esp),%edi | |
249 | movl 16(%esp),%ecx | |
250 | NOP | |
251 | cld | |
252 | nop | |
253 | .byte 0x66,0xf2,0x6d # rep insw | |
254 | nop | |
255 | movl %edi,%eax | |
256 | popl %edi | |
257 | ret | |
258 | ||
259 | # outsw(port,addr,cnt) | |
260 | .globl _outsw | |
261 | _outsw: | |
262 | pushl %esi | |
263 | movw 8(%esp),%dx | |
264 | movl 12(%esp),%esi | |
265 | movl 16(%esp),%ecx | |
266 | NOP | |
267 | cld | |
268 | nop | |
269 | .byte 0x66,0xf2,0x6f # rep outsw | |
270 | nop | |
271 | movl %esi,%eax | |
272 | popl %esi | |
273 | ret |