| /* @r{boot.S - bootstrap the kernel} */ |
| /* @r{Copyright (C) 1999, 2001 Free Software Foundation, Inc. |
| |
| This program is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 2 of the License, or |
| (at your option) any later version. |
| |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with this program; if not, write to the Free Software |
| Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.} */ |
| |
| #define ASM 1 |
| #include <multiboot.h> |
| |
| .text |
| |
| .globl start, _start |
| start: |
| _start: |
| jmp multiboot_entry |
| |
| /* @r{Align 32 bits boundary.} */ |
| .align 4 |
| |
| /* @r{Multiboot header.} */ |
| multiboot_header: |
| /* @r{magic} */ |
| .long MULTIBOOT_HEADER_MAGIC |
| /* @r{flags} */ |
| .long MULTIBOOT_HEADER_FLAGS |
| /* @r{checksum} */ |
| .long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) |
| #ifndef __ELF__ |
| /* @r{header_addr} */ |
| .long multiboot_header |
| /* @r{load_addr} */ |
| .long _start |
| /* @r{load_end_addr} */ |
| .long _edata |
| /* @r{bss_end_addr} */ |
| .long _end |
| /* @r{entry_addr} */ |
| .long multiboot_entry |
| #endif /* @r{! __ELF__} */ |
| |
| multiboot_entry: |
| /* @r{Initialize the stack pointer.} */ |
| movl $(stack + STACK_SIZE), %esp |
| |
| /* @r{Reset EFLAGS.} */ |
| pushl $0 |
| popf |
| |
| /* @r{Push the pointer to the Multiboot information structure.} */ |
| pushl %ebx |
| /* @r{Push the magic value.} */ |
| pushl %eax |
| |
| /* @r{Now enter the C main function...} */ |
| call EXT_C(cmain) |
| |
| /* @r{Halt.} */ |
| pushl $halt_message |
| call EXT_C(printf) |
| |
| loop: hlt |
| jmp loop |
| |
| halt_message: |
| .asciz "Halted." |
| |
| /* @r{Our stack area.} */ |
| .comm stack, STACK_SIZE |
| |