xref: /csrg-svn/sys/i386/stand/srt0.c (revision 41083)
1*41083Swilliam /*-
2*41083Swilliam  * Copyright (c) 1990 The Regents of the University of California.
3*41083Swilliam  * All rights reserved.
4*41083Swilliam  *
5*41083Swilliam  * This code is derived from software contributed to Berkeley by
6*41083Swilliam  * William Jolitz.
7*41083Swilliam  *
8*41083Swilliam  * %sccs.include.noredist.c%
9*41083Swilliam  *
10*41083Swilliam  *	@(#)srt0.c	7.1 (Berkeley) 04/24/90
11*41083Swilliam  */
12*41083Swilliam 
13*41083Swilliam /*
14*41083Swilliam  * Startup code for standalone system
15*41083Swilliam  * Non-relocating version -- for programs which are loaded by boot
16*41083Swilliam  * Relocating version for boot
17*41083Swilliam  */
18*41083Swilliam 
19*41083Swilliam 	.globl	_end
20*41083Swilliam 	.globl	_edata
21*41083Swilliam 	.globl	_main
22*41083Swilliam 	.globl	__rtt
23*41083Swilliam 	.globl	_exit
24*41083Swilliam 	.globl	_howto
25*41083Swilliam 	.globl	_bootdev
26*41083Swilliam 	.globl	_unit
27*41083Swilliam 
28*41083Swilliam 
29*41083Swilliam entry:	.globl	entry
30*41083Swilliam 	cli				# no interrupts
31*41083Swilliam #ifdef REL
32*41083Swilliam 	movl	$RELOC,%esp
33*41083Swilliam #else
34*41083Swilliam 	movl	%esp,savearea
35*41083Swilliam 	movl	%ebp,savearea+4
36*41083Swilliam 	movl	$RELOC-0x2400,%esp
37*41083Swilliam #endif
38*41083Swilliam 	movl	%esp,%ecx
39*41083Swilliam start:
40*41083Swilliam 	movl	$_edata,%eax
41*41083Swilliam #ifndef foo
42*41083Swilliam #else
43*41083Swilliam 	subl	%eax,%ecx
44*41083Swilliam 1:
45*41083Swilliam 	movl	$0,(%eax)
46*41083Swilliam 	addl	$4,%eax
47*41083Swilliam 	loopnz	1f
48*41083Swilliam #endif
49*41083Swilliam #ifdef REL
50*41083Swilliam 	# movl	$entry-RELOC,%esi	# from beginning of ram
51*41083Swilliam 	movl	$0,%esi
52*41083Swilliam 	movl	$entry,%edi		# to relocated area
53*41083Swilliam 	# movl	$_edata-RELOC,%ecx	# this much
54*41083Swilliam 	movl	$64*1024,%ecx
55*41083Swilliam 	cld
56*41083Swilliam 	rep
57*41083Swilliam 	movsb
58*41083Swilliam 	.globl	begin
59*41083Swilliam 	# jmp	*$begin	-- does not work, why!?
60*41083Swilliam 	pushl	$begin
61*41083Swilliam 	ret
62*41083Swilliam begin:
63*41083Swilliam #endif
64*41083Swilliam 	# movl	%esi,_howto
65*41083Swilliam 	# movl	%edi,_bootdev
66*41083Swilliam 	# movl	%ebx,_unit
67*41083Swilliam 1:
68*41083Swilliam 	# calls	$0,_configure
69*41083Swilliam 	movl	$1,_openfirst
70*41083Swilliam 	pushl	$0
71*41083Swilliam 	popf
72*41083Swilliam 	call	_main
73*41083Swilliam #ifdef REL
74*41083Swilliam 	jmp	1b
75*41083Swilliam #else
76*41083Swilliam 	jmp	1f
77*41083Swilliam #endif
78*41083Swilliam 
79*41083Swilliam 	.data
80*41083Swilliam _openfirst:	.long	0
81*41083Swilliam _bootdev:	.long	0
82*41083Swilliam _howto:		.long	0
83*41083Swilliam _unit:		.long	0
84*41083Swilliam savearea:	.long	0,0	# sp & bp to return to
85*41083Swilliam 	.text
86*41083Swilliam 	.globl _getchar
87*41083Swilliam 	.globl _wait
88*41083Swilliam 
89*41083Swilliam __rtt:
90*41083Swilliam 	call	_getchar
91*41083Swilliam 	pushl	$1000000
92*41083Swilliam 	call	_wait
93*41083Swilliam 	popl	%eax
94*41083Swilliam 	movl	$-7,%eax
95*41083Swilliam 	jmp	1f
96*41083Swilliam _exit:
97*41083Swilliam 	call	_getchar
98*41083Swilliam 	pushl	$1000000
99*41083Swilliam 	call	_wait
100*41083Swilliam 	popl	%eax
101*41083Swilliam 	movl	4(sp),%eax
102*41083Swilliam 1:
103*41083Swilliam #ifdef	REL
104*41083Swilliam 	movw	$0x1234,%ax
105*41083Swilliam 	movw	%ax,0x472	# warm boot
106*41083Swilliam 	movl	$0,%esp		# segment violation
107*41083Swilliam 	ret
108*41083Swilliam 	# jump	PA_Monitor		# jump to startup code in ROM
109*41083Swilliam #else
110*41083Swilliam 	movl	savearea,%esp
111*41083Swilliam 	movl	savearea+4,%ebp
112*41083Swilliam 	ret
113*41083Swilliam #endif
114*41083Swilliam 	.globl _setregs
115*41083Swilliam _setregs:
116*41083Swilliam 	movl	_howto,%esi
117*41083Swilliam 	movl	_bootdev,%edi
118*41083Swilliam 	movl	_unit,%ebx
119*41083Swilliam 	ret
120*41083Swilliam 
121*41083Swilliam 	.globl	_inb
122*41083Swilliam _inb:	movl	4(%esp),%edx
123*41083Swilliam 	subl	%eax,%eax	# clr eax
124*41083Swilliam 	nop
125*41083Swilliam 	inb	%dx,%al
126*41083Swilliam 	nop
127*41083Swilliam 	ret
128*41083Swilliam 
129*41083Swilliam 	.globl	_outb
130*41083Swilliam _outb:	movl	4(%esp),%edx
131*41083Swilliam 	movl	8(%esp),%eax
132*41083Swilliam 	nop
133*41083Swilliam 	outb	%al,%dx
134*41083Swilliam 	nop
135*41083Swilliam 	ret
136*41083Swilliam 
137*41083Swilliam 	.globl ___udivsi3
138*41083Swilliam ___udivsi3:
139*41083Swilliam 	movl 4(%esp),%eax
140*41083Swilliam 	xorl %edx,%edx
141*41083Swilliam 	divl 8(%esp)
142*41083Swilliam 	ret
143*41083Swilliam 
144*41083Swilliam 	.globl ___divsi3
145*41083Swilliam ___divsi3:
146*41083Swilliam 	movl 4(%esp),%eax
147*41083Swilliam 	xorl %edx,%edx
148*41083Swilliam 	cltd
149*41083Swilliam 	idivl 8(%esp)
150*41083Swilliam 	ret
151*41083Swilliam 
152*41083Swilliam 	#
153*41083Swilliam 	# bzero (base,cnt)
154*41083Swilliam 	#
155*41083Swilliam 
156*41083Swilliam 	.globl _bzero
157*41083Swilliam _bzero:
158*41083Swilliam 	pushl	%edi
159*41083Swilliam 	movl	8(%esp),%edi
160*41083Swilliam 	movl	12(%esp),%ecx
161*41083Swilliam 	movb	$0x00,%al
162*41083Swilliam 	cld
163*41083Swilliam 	rep
164*41083Swilliam 	stosb
165*41083Swilliam 	popl	%edi
166*41083Swilliam 	ret
167*41083Swilliam 
168*41083Swilliam 	#
169*41083Swilliam 	# bcopy (src,dst,cnt)
170*41083Swilliam 	# NOTE: does not (yet) handle overlapped copies
171*41083Swilliam 	#
172*41083Swilliam 
173*41083Swilliam 	.globl	_bcopy
174*41083Swilliam _bcopy:
175*41083Swilliam 	pushl	%esi
176*41083Swilliam 	pushl	%edi
177*41083Swilliam 	movl	12(%esp),%esi
178*41083Swilliam 	movl	16(%esp),%edi
179*41083Swilliam 	movl	20(%esp),%ecx
180*41083Swilliam 	cld
181*41083Swilliam 	rep
182*41083Swilliam 	movsb
183*41083Swilliam 	popl	%edi
184*41083Swilliam 	popl	%esi
185*41083Swilliam 	ret
186*41083Swilliam 
187*41083Swilliam 	# insw(port,addr,cnt)
188*41083Swilliam 	.globl	_insw
189*41083Swilliam _insw:
190*41083Swilliam 	pushl	%edi
191*41083Swilliam 	movw	8(%esp),%dx
192*41083Swilliam 	movl	12(%esp),%edi
193*41083Swilliam 	movl	16(%esp),%ecx
194*41083Swilliam 	cld
195*41083Swilliam 	nop
196*41083Swilliam 	.byte 0x66,0xf2,0x6d	# rep insw
197*41083Swilliam 	nop
198*41083Swilliam 	movl	%edi,%eax
199*41083Swilliam 	popl	%edi
200*41083Swilliam 	ret
201*41083Swilliam 
202*41083Swilliam 	# outsw(port,addr,cnt)
203*41083Swilliam 	.globl	_outsw
204*41083Swilliam _outsw:
205*41083Swilliam 	pushl	%esi
206*41083Swilliam 	movw	8(%esp),%dx
207*41083Swilliam 	movl	12(%esp),%esi
208*41083Swilliam 	movl	16(%esp),%ecx
209*41083Swilliam 	cld
210*41083Swilliam 	nop
211*41083Swilliam 	.byte 0x66,0xf2,0x6f	# rep outsw
212*41083Swilliam 	nop
213*41083Swilliam 	movl	%esi,%eax
214*41083Swilliam 	popl	%esi
215*41083Swilliam 	ret
216*41083Swilliam 
217