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