386BSD 0.1 development
[unix-history] / usr / src / sys.386bsd / i386 / stand / srt0.c
CommitLineData
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
86start:
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
148savearea: .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
1641:
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