diff options
author | marcus <marcus> | 2003-07-26 17:26:09 +0000 |
---|---|---|
committer | marcus <marcus> | 2003-07-26 17:26:09 +0000 |
commit | 35c35373d1f6ee353b67fc2e596b01d9b49f4be8 (patch) | |
tree | d425cc345ca97b36996e91345fdc4b2bdbb223fa /laden/ia32-crt0.S |
Initial check-in.
Diffstat (limited to 'laden/ia32-crt0.S')
-rw-r--r-- | laden/ia32-crt0.S | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/laden/ia32-crt0.S b/laden/ia32-crt0.S new file mode 100644 index 0000000..853f6bb --- /dev/null +++ b/laden/ia32-crt0.S @@ -0,0 +1,79 @@ +/* ia32-crt0.S - Startup code for ia32. + Copyright (C) 2003 Free Software Foundation, Inc. + Written by Marcus Brinkmann. + + This file is part of the GNU Hurd. + + The GNU Hurd 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, or (at + your option) any later version. + + The GNU Hurd 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., 59 Temple Place - Suite 330, Boston, MA 02111, USA. */ + +#define ASM 1 +#include "multiboot.h" + +/* The size of our stack (4KB). */ +#define STACK_SIZE 0x1000 + + .text + + .globl start, _start +start: +_start: + jmp multiboot_entry + + /* Align 32 bits boundary. */ + .align 4 + + /* Multiboot header. */ +multiboot_header: + /* magic */ + .long MULTIBOOT_HEADER_MAGIC + /* flags */ + .long MULTIBOOT_HEADER_FLAGS + /* checksum */ + .long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) +#ifndef __ELF__ + /* header_addr */ + .long multiboot_header + /* load_addr */ + .long _start + /* load_end_addr */ + .long _edata + /* bss_end_addr */ + .long _end + /* entry_addr */ + .long multiboot_entry +#endif /* ! __ELF__ */ + +multiboot_entry: + /* Initialize the stack pointer. */ + movl $(stack + STACK_SIZE), %esp + + /* Reset EFLAGS. */ + pushl $0 + popf + + /* Push the pointer to the Multiboot information structure. */ + pushl %ebx + /* Push the magic value. */ + pushl %eax + + /* Now enter the cmain function. */ + call cmain + + /* Not reached. */ +loop: hlt + jmp loop + + /* Our stack area. */ + .comm stack, STACK_SIZE |