xref: /onnv-gate/usr/src/grub/grub-0.97/docs/boot.S (revision 8044:b3af80bbf173)
1*8044SWilliam.Kucharski@Sun.COM/* boot.S - bootstrap the kernel */
2*8044SWilliam.Kucharski@Sun.COM/* Copyright (C) 1999, 2001  Free Software Foundation, Inc.
3*8044SWilliam.Kucharski@Sun.COM
4*8044SWilliam.Kucharski@Sun.COM   This program is free software; you can redistribute it and/or modify
5*8044SWilliam.Kucharski@Sun.COM   it under the terms of the GNU General Public License as published by
6*8044SWilliam.Kucharski@Sun.COM   the Free Software Foundation; either version 2 of the License, or
7*8044SWilliam.Kucharski@Sun.COM   (at your option) any later version.
8*8044SWilliam.Kucharski@Sun.COM
9*8044SWilliam.Kucharski@Sun.COM   This program is distributed in the hope that it will be useful,
10*8044SWilliam.Kucharski@Sun.COM   but WITHOUT ANY WARRANTY; without even the implied warranty of
11*8044SWilliam.Kucharski@Sun.COM   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12*8044SWilliam.Kucharski@Sun.COM   GNU General Public License for more details.
13*8044SWilliam.Kucharski@Sun.COM
14*8044SWilliam.Kucharski@Sun.COM   You should have received a copy of the GNU General Public License
15*8044SWilliam.Kucharski@Sun.COM   along with this program; if not, write to the Free Software
16*8044SWilliam.Kucharski@Sun.COM   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
17*8044SWilliam.Kucharski@Sun.COM
18*8044SWilliam.Kucharski@Sun.COM#define ASM	1
19*8044SWilliam.Kucharski@Sun.COM#include <multiboot.h>
20*8044SWilliam.Kucharski@Sun.COM
21*8044SWilliam.Kucharski@Sun.COM	.text
22*8044SWilliam.Kucharski@Sun.COM
23*8044SWilliam.Kucharski@Sun.COM	.globl	start, _start
24*8044SWilliam.Kucharski@Sun.COMstart:
25*8044SWilliam.Kucharski@Sun.COM_start:
26*8044SWilliam.Kucharski@Sun.COM	jmp	multiboot_entry
27*8044SWilliam.Kucharski@Sun.COM
28*8044SWilliam.Kucharski@Sun.COM	/* Align 32 bits boundary.  */
29*8044SWilliam.Kucharski@Sun.COM	.align	4
30*8044SWilliam.Kucharski@Sun.COM
31*8044SWilliam.Kucharski@Sun.COM	/* Multiboot header.  */
32*8044SWilliam.Kucharski@Sun.COMmultiboot_header:
33*8044SWilliam.Kucharski@Sun.COM	/* magic */
34*8044SWilliam.Kucharski@Sun.COM	.long	MULTIBOOT_HEADER_MAGIC
35*8044SWilliam.Kucharski@Sun.COM	/* flags */
36*8044SWilliam.Kucharski@Sun.COM	.long	MULTIBOOT_HEADER_FLAGS
37*8044SWilliam.Kucharski@Sun.COM	/* checksum */
38*8044SWilliam.Kucharski@Sun.COM	.long	-(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
39*8044SWilliam.Kucharski@Sun.COM#ifndef __ELF__
40*8044SWilliam.Kucharski@Sun.COM	/* header_addr */
41*8044SWilliam.Kucharski@Sun.COM	.long	multiboot_header
42*8044SWilliam.Kucharski@Sun.COM	/* load_addr */
43*8044SWilliam.Kucharski@Sun.COM	.long	_start
44*8044SWilliam.Kucharski@Sun.COM	/* load_end_addr */
45*8044SWilliam.Kucharski@Sun.COM	.long	_edata
46*8044SWilliam.Kucharski@Sun.COM	/* bss_end_addr */
47*8044SWilliam.Kucharski@Sun.COM	.long	_end
48*8044SWilliam.Kucharski@Sun.COM	/* entry_addr */
49*8044SWilliam.Kucharski@Sun.COM	.long	multiboot_entry
50*8044SWilliam.Kucharski@Sun.COM#endif /* ! __ELF__ */
51*8044SWilliam.Kucharski@Sun.COM
52*8044SWilliam.Kucharski@Sun.COMmultiboot_entry:
53*8044SWilliam.Kucharski@Sun.COM	/* Initialize the stack pointer.  */
54*8044SWilliam.Kucharski@Sun.COM	movl	$(stack + STACK_SIZE), %esp
55*8044SWilliam.Kucharski@Sun.COM
56*8044SWilliam.Kucharski@Sun.COM	/* Reset EFLAGS.  */
57*8044SWilliam.Kucharski@Sun.COM	pushl	$0
58*8044SWilliam.Kucharski@Sun.COM	popf
59*8044SWilliam.Kucharski@Sun.COM
60*8044SWilliam.Kucharski@Sun.COM	/* Push the pointer to the Multiboot information structure.  */
61*8044SWilliam.Kucharski@Sun.COM	pushl	%ebx
62*8044SWilliam.Kucharski@Sun.COM	/* Push the magic value.  */
63*8044SWilliam.Kucharski@Sun.COM	pushl	%eax
64*8044SWilliam.Kucharski@Sun.COM
65*8044SWilliam.Kucharski@Sun.COM	/* Now enter the C main function...  */
66*8044SWilliam.Kucharski@Sun.COM	call	EXT_C(cmain)
67*8044SWilliam.Kucharski@Sun.COM
68*8044SWilliam.Kucharski@Sun.COM	/* Halt.  */
69*8044SWilliam.Kucharski@Sun.COM	pushl	$halt_message
70*8044SWilliam.Kucharski@Sun.COM	call	EXT_C(printf)
71*8044SWilliam.Kucharski@Sun.COM
72*8044SWilliam.Kucharski@Sun.COMloop:	hlt
73*8044SWilliam.Kucharski@Sun.COM	jmp	loop
74*8044SWilliam.Kucharski@Sun.COM
75*8044SWilliam.Kucharski@Sun.COMhalt_message:
76*8044SWilliam.Kucharski@Sun.COM	.asciz	"Halted."
77*8044SWilliam.Kucharski@Sun.COM
78*8044SWilliam.Kucharski@Sun.COM	/* Our stack area.  */
79*8044SWilliam.Kucharski@Sun.COM	.comm	stack, STACK_SIZE
80*8044SWilliam.Kucharski@Sun.COM