/* @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
        