xref: /csrg-svn/sys/i386/stand/srt0.c (revision 63368)
141083Swilliam /*-
2*63368Sbostic  * Copyright (c) 1990, 1993
3*63368Sbostic  *	The Regents of the University of California.  All rights reserved.
441083Swilliam  *
541083Swilliam  * This code is derived from software contributed to Berkeley by
641083Swilliam  * William Jolitz.
741083Swilliam  *
848825Swilliam  * %sccs.include.redist.c%
941083Swilliam  *
10*63368Sbostic  *	@(#)srt0.c	8.1 (Berkeley) 06/11/93
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
1748824Swilliam  * 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
2648824Swilliam 	.globl	_cyloffset
2741083Swilliam 
2848824Swilliam #ifdef SMALL
2948824Swilliam 	/* where the disklabel goes if we have one */
3048824Swilliam 	.globl	_disklabel
3148824Swilliam _disklabel:
3248824Swilliam 	.space 512
3348824Swilliam #endif
3441083Swilliam 
3541083Swilliam entry:	.globl	entry
3648824Swilliam 	.globl	start
3748824Swilliam 
3848824Swilliam #if	defined(REL) && !defined(SMALL)
3948824Swilliam 
4048824Swilliam 	/* relocate program and enter at symbol "start" */
4148824Swilliam 
4248824Swilliam 	#movl	$entry-RELOC,%esi	# from beginning of ram
4341083Swilliam 	movl	$0,%esi
4448824Swilliam 	#movl	$entry,%edi		# to relocated area
4548824Swilliam 	movl	$ RELOC,%edi		# to relocated area
4641083Swilliam 	# movl	$_edata-RELOC,%ecx	# this much
4741083Swilliam 	movl	$64*1024,%ecx
4841083Swilliam 	cld
4941083Swilliam 	rep
5041083Swilliam 	movsb
5148824Swilliam 	# relocate program counter to relocation base
5248824Swilliam 	pushl	$start
5341083Swilliam 	ret
5441083Swilliam #endif
5548824Swilliam 
5648824Swilliam start:
5748824Swilliam 
5848824Swilliam 	/* setup stack pointer */
5948824Swilliam 
6048824Swilliam #ifdef REL
6148824Swilliam 	leal	4(%esp),%eax	/* ignore old pc */
6248824Swilliam 	movl	$ RELOC-4*4,%esp
6348824Swilliam 	/* copy down boot parameters */
6448824Swilliam 	movl	%esp,%ebx
6548824Swilliam 	pushl	$3*4
6648824Swilliam 	pushl	%ebx
6748824Swilliam 	pushl	%eax
6848824Swilliam 	call	_bcopy
6948824Swilliam 	movl	%ebx,%esp
7048824Swilliam #else
7148824Swilliam 	/* save old stack state */
7248824Swilliam 	movl	%esp,savearea
7348824Swilliam 	movl	%ebp,savearea+4
7448824Swilliam 	movl	$ RELOC-0x2400,%esp
7548824Swilliam #endif
7648824Swilliam 
7748824Swilliam 	/* clear memory as needed */
7848824Swilliam 
7948824Swilliam 	movl	%esp,%esi
8048824Swilliam #ifdef	REL
8148824Swilliam 
8248824Swilliam 	/*
8348824Swilliam 	 * Clear Bss and up to 64K heap
8448824Swilliam 	 */
8548824Swilliam 	movl	$64*1024,%ebx
8648824Swilliam 	movl	$_end,%eax	# should be movl $_end-_edata but ...
8748824Swilliam 	subl	$_edata,%eax
8848824Swilliam 	addl	%ebx,%eax
8948824Swilliam 	pushl	%eax
9048824Swilliam 	pushl	$_edata
9148824Swilliam 	call	_bzero
9248824Swilliam 
9348824Swilliam 	/*
9448824Swilliam 	 * Clear 64K of stack
9548824Swilliam 	 */
9648824Swilliam 	movl	%esi,%eax
9748824Swilliam 	subl	%ebx,%eax
9848824Swilliam 	subl	$5*4,%ebx
9948824Swilliam 	pushl	%ebx
10048824Swilliam 	pushl	%eax
10148824Swilliam 	call	_bzero
10248824Swilliam #else
10348824Swilliam 	movl	$_edata,%edx
10448824Swilliam 	movl	%esp,%eax
10548824Swilliam 	subl	%edx,%eax
10648824Swilliam 	pushl	%edx
10748824Swilliam 	pushl	%esp
10848824Swilliam 	call	_bzero
10948824Swilliam #endif
11048824Swilliam 	movl	%esi,%esp
11148824Swilliam 
11241083Swilliam 	pushl	$0
11341083Swilliam 	popf
11448824Swilliam 
11548824Swilliam #ifndef	SMALL
11648824Swilliam 	call	_kbdreset	/* resets keyboard and gatea20 brain damage */
11748824Swilliam #endif
11848824Swilliam 
11941083Swilliam 	call	_main
12041083Swilliam 	jmp	1f
12141083Swilliam 
12241083Swilliam 	.data
12341083Swilliam _bootdev:	.long	0
12448824Swilliam _cyloffset:	.long	0
12541083Swilliam savearea:	.long	0,0	# sp & bp to return to
12641083Swilliam 	.text
12748824Swilliam #ifndef	SMALL
12841083Swilliam 	.globl _getchar
12948824Swilliam #endif
13041083Swilliam 	.globl _wait
13141083Swilliam 
13241083Swilliam __rtt:
13348824Swilliam #ifndef	SMALL
13441083Swilliam 	call	_getchar
13548824Swilliam #else
13648824Swilliam _exit:
13741083Swilliam 	pushl	$1000000
13841083Swilliam 	call	_wait
13941083Swilliam 	popl	%eax
14048824Swilliam #endif
14141083Swilliam 	movl	$-7,%eax
14241083Swilliam 	jmp	1f
14348824Swilliam #ifndef	SMALL
14441083Swilliam _exit:
14541083Swilliam 	call	_getchar
14648824Swilliam #endif
14748824Swilliam 	movl	4(%esp),%eax
14841083Swilliam 1:
14941083Swilliam #ifdef	REL
15048824Swilliam #ifndef SMALL
15148824Swilliam 	call	_reset_cpu
15248824Swilliam #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