xref: /csrg-svn/sys/i386/stand/srt0.c (revision 48824)
141083Swilliam /*-
241083Swilliam  * Copyright (c) 1990 The Regents of the University of California.
341083Swilliam  * All rights reserved.
441083Swilliam  *
541083Swilliam  * This code is derived from software contributed to Berkeley by
641083Swilliam  * William Jolitz.
741083Swilliam  *
841083Swilliam  * %sccs.include.noredist.c%
941083Swilliam  *
10*48824Swilliam  *	@(#)srt0.c	7.2 (Berkeley) 04/28/91
1141083Swilliam  */
1241083Swilliam 
1341083Swilliam /*
1441083Swilliam  * Startup code for standalone system
1541083Swilliam  * Non-relocating version -- for programs which are loaded by boot
1641083Swilliam  * Relocating version for boot
17*48824Swilliam  * Small relocating version for "micro" boot
1841083Swilliam  */
1941083Swilliam 
2041083Swilliam 	.globl	_end
2141083Swilliam 	.globl	_edata
2241083Swilliam 	.globl	_main
2341083Swilliam 	.globl	__rtt
2441083Swilliam 	.globl	_exit
2541083Swilliam 	.globl	_bootdev
26*48824Swilliam 	.globl	_cyloffset
2741083Swilliam 
28*48824Swilliam #ifdef SMALL
29*48824Swilliam 	/* where the disklabel goes if we have one */
30*48824Swilliam 	.globl	_disklabel
31*48824Swilliam _disklabel:
32*48824Swilliam 	.space 512
33*48824Swilliam #endif
3441083Swilliam 
3541083Swilliam entry:	.globl	entry
36*48824Swilliam 	.globl	start
37*48824Swilliam 
38*48824Swilliam #if	defined(REL) && !defined(SMALL)
39*48824Swilliam 
40*48824Swilliam 	/* relocate program and enter at symbol "start" */
41*48824Swilliam 
42*48824Swilliam 	#movl	$entry-RELOC,%esi	# from beginning of ram
4341083Swilliam 	movl	$0,%esi
44*48824Swilliam 	#movl	$entry,%edi		# to relocated area
45*48824Swilliam 	movl	$ RELOC,%edi		# to relocated area
4641083Swilliam 	# movl	$_edata-RELOC,%ecx	# this much
4741083Swilliam 	movl	$64*1024,%ecx
4841083Swilliam 	cld
4941083Swilliam 	rep
5041083Swilliam 	movsb
51*48824Swilliam 	# relocate program counter to relocation base
52*48824Swilliam 	pushl	$start
5341083Swilliam 	ret
5441083Swilliam #endif
55*48824Swilliam 
56*48824Swilliam start:
57*48824Swilliam 
58*48824Swilliam 	/* setup stack pointer */
59*48824Swilliam 
60*48824Swilliam #ifdef REL
61*48824Swilliam 	leal	4(%esp),%eax	/* ignore old pc */
62*48824Swilliam 	movl	$ RELOC-4*4,%esp
63*48824Swilliam 	/* copy down boot parameters */
64*48824Swilliam 	movl	%esp,%ebx
65*48824Swilliam 	pushl	$3*4
66*48824Swilliam 	pushl	%ebx
67*48824Swilliam 	pushl	%eax
68*48824Swilliam 	call	_bcopy
69*48824Swilliam 	movl	%ebx,%esp
70*48824Swilliam #else
71*48824Swilliam 	/* save old stack state */
72*48824Swilliam 	movl	%esp,savearea
73*48824Swilliam 	movl	%ebp,savearea+4
74*48824Swilliam 	movl	$ RELOC-0x2400,%esp
75*48824Swilliam #endif
76*48824Swilliam 
77*48824Swilliam 	/* clear memory as needed */
78*48824Swilliam 
79*48824Swilliam 	movl	%esp,%esi
80*48824Swilliam #ifdef	REL
81*48824Swilliam 
82*48824Swilliam 	/*
83*48824Swilliam 	 * Clear Bss and up to 64K heap
84*48824Swilliam 	 */
85*48824Swilliam 	movl	$64*1024,%ebx
86*48824Swilliam 	movl	$_end,%eax	# should be movl $_end-_edata but ...
87*48824Swilliam 	subl	$_edata,%eax
88*48824Swilliam 	addl	%ebx,%eax
89*48824Swilliam 	pushl	%eax
90*48824Swilliam 	pushl	$_edata
91*48824Swilliam 	call	_bzero
92*48824Swilliam 
93*48824Swilliam 	/*
94*48824Swilliam 	 * Clear 64K of stack
95*48824Swilliam 	 */
96*48824Swilliam 	movl	%esi,%eax
97*48824Swilliam 	subl	%ebx,%eax
98*48824Swilliam 	subl	$5*4,%ebx
99*48824Swilliam 	pushl	%ebx
100*48824Swilliam 	pushl	%eax
101*48824Swilliam 	call	_bzero
102*48824Swilliam #else
103*48824Swilliam 	movl	$_edata,%edx
104*48824Swilliam 	movl	%esp,%eax
105*48824Swilliam 	subl	%edx,%eax
106*48824Swilliam 	pushl	%edx
107*48824Swilliam 	pushl	%esp
108*48824Swilliam 	call	_bzero
109*48824Swilliam #endif
110*48824Swilliam 	movl	%esi,%esp
111*48824Swilliam 
11241083Swilliam 	pushl	$0
11341083Swilliam 	popf
114*48824Swilliam 
115*48824Swilliam #ifndef	SMALL
116*48824Swilliam 	call	_kbdreset	/* resets keyboard and gatea20 brain damage */
117*48824Swilliam #endif
118*48824Swilliam 
11941083Swilliam 	call	_main
12041083Swilliam 	jmp	1f
12141083Swilliam 
12241083Swilliam 	.data
12341083Swilliam _bootdev:	.long	0
124*48824Swilliam _cyloffset:	.long	0
12541083Swilliam savearea:	.long	0,0	# sp & bp to return to
12641083Swilliam 	.text
127*48824Swilliam #ifndef	SMALL
12841083Swilliam 	.globl _getchar
129*48824Swilliam #endif
13041083Swilliam 	.globl _wait
13141083Swilliam 
13241083Swilliam __rtt:
133*48824Swilliam #ifndef	SMALL
13441083Swilliam 	call	_getchar
135*48824Swilliam #else
136*48824Swilliam _exit:
13741083Swilliam 	pushl	$1000000
13841083Swilliam 	call	_wait
13941083Swilliam 	popl	%eax
140*48824Swilliam #endif
14141083Swilliam 	movl	$-7,%eax
14241083Swilliam 	jmp	1f
143*48824Swilliam #ifndef	SMALL
14441083Swilliam _exit:
14541083Swilliam 	call	_getchar
146*48824Swilliam #endif
147*48824Swilliam 	movl	4(%esp),%eax
14841083Swilliam 1:
14941083Swilliam #ifdef	REL
150*48824Swilliam #ifndef SMALL
151*48824Swilliam 	call	_reset_cpu
152*48824Swilliam #endif
15341083Swilliam 	movw	$0x1234,%ax
15441083Swilliam 	movw	%ax,0x472	# warm boot
15541083Swilliam 	movl	$0,%esp		# segment violation
15641083Swilliam 	ret
15741083Swilliam #else
15841083Swilliam 	movl	savearea,%esp
15941083Swilliam 	movl	savearea+4,%ebp
16041083Swilliam 	ret
16141083Swilliam #endif
16241083Swilliam 
16341083Swilliam 	.globl	_inb
16441083Swilliam _inb:	movl	4(%esp),%edx
16541083Swilliam 	subl	%eax,%eax	# clr eax
16641083Swilliam 	inb	%dx,%al
16741083Swilliam 	ret
16841083Swilliam 
16941083Swilliam 	.globl	_outb
17041083Swilliam _outb:	movl	4(%esp),%edx
17141083Swilliam 	movl	8(%esp),%eax
17241083Swilliam 	outb	%al,%dx
17341083Swilliam 	ret
17441083Swilliam 
17541083Swilliam 	.globl ___udivsi3
17641083Swilliam ___udivsi3:
17741083Swilliam 	movl 4(%esp),%eax
17841083Swilliam 	xorl %edx,%edx
17941083Swilliam 	divl 8(%esp)
18041083Swilliam 	ret
18141083Swilliam 
18241083Swilliam 	.globl ___divsi3
18341083Swilliam ___divsi3:
18441083Swilliam 	movl 4(%esp),%eax
18541083Swilliam 	xorl %edx,%edx
18641083Swilliam 	cltd
18741083Swilliam 	idivl 8(%esp)
18841083Swilliam 	ret
18941083Swilliam 
19041083Swilliam 	#
19141083Swilliam 	# bzero (base,cnt)
19241083Swilliam 	#
19341083Swilliam 
19441083Swilliam 	.globl _bzero
19541083Swilliam _bzero:
19641083Swilliam 	pushl	%edi
19741083Swilliam 	movl	8(%esp),%edi
19841083Swilliam 	movl	12(%esp),%ecx
19941083Swilliam 	movb	$0x00,%al
20041083Swilliam 	cld
20141083Swilliam 	rep
20241083Swilliam 	stosb
20341083Swilliam 	popl	%edi
20441083Swilliam 	ret
20541083Swilliam 
20641083Swilliam 	#
20741083Swilliam 	# bcopy (src,dst,cnt)
20841083Swilliam 	# NOTE: does not (yet) handle overlapped copies
20941083Swilliam 	#
21041083Swilliam 
21141083Swilliam 	.globl	_bcopy
21241083Swilliam _bcopy:
21341083Swilliam 	pushl	%esi
21441083Swilliam 	pushl	%edi
21541083Swilliam 	movl	12(%esp),%esi
21641083Swilliam 	movl	16(%esp),%edi
21741083Swilliam 	movl	20(%esp),%ecx
21841083Swilliam 	cld
21941083Swilliam 	rep
22041083Swilliam 	movsb
22141083Swilliam 	popl	%edi
22241083Swilliam 	popl	%esi
22341083Swilliam 	ret
22441083Swilliam 
22541083Swilliam 	# insw(port,addr,cnt)
22641083Swilliam 	.globl	_insw
22741083Swilliam _insw:
22841083Swilliam 	pushl	%edi
22941083Swilliam 	movw	8(%esp),%dx
23041083Swilliam 	movl	12(%esp),%edi
23141083Swilliam 	movl	16(%esp),%ecx
23241083Swilliam 	cld
23341083Swilliam 	nop
23441083Swilliam 	.byte 0x66,0xf2,0x6d	# rep insw
23541083Swilliam 	nop
23641083Swilliam 	movl	%edi,%eax
23741083Swilliam 	popl	%edi
23841083Swilliam 	ret
23941083Swilliam 
24041083Swilliam 	# outsw(port,addr,cnt)
24141083Swilliam 	.globl	_outsw
24241083Swilliam _outsw:
24341083Swilliam 	pushl	%esi
24441083Swilliam 	movw	8(%esp),%dx
24541083Swilliam 	movl	12(%esp),%esi
24641083Swilliam 	movl	16(%esp),%ecx
24741083Swilliam 	cld
24841083Swilliam 	nop
24941083Swilliam 	.byte 0x66,0xf2,0x6f	# rep outsw
25041083Swilliam 	nop
25141083Swilliam 	movl	%esi,%eax
25241083Swilliam 	popl	%esi
25341083Swilliam 	ret
25441083Swilliam 
255