15b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* boot.S - bootstrap the kernel */
25b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Copyright (C) 1999, 2001  Free Software Foundation, Inc.
35b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
45b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   This program is free software; you can redistribute it and/or modify
55b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   it under the terms of the GNU General Public License as published by
65b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   the Free Software Foundation; either version 2 of the License, or
75b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   (at your option) any later version.
85b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
95b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   This program is distributed in the hope that it will be useful,
105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   but WITHOUT ANY WARRANTY; without even the implied warranty of
115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   GNU General Public License for more details.
135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   You should have received a copy of the GNU General Public License
155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   along with this program; if not, write to the Free Software
165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ASM	1
195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <multiboot.h>
205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.text
225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.globl	start, _start
245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstart:
255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project_start:
265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jmp	multiboot_entry
275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Align 32 bits boundary.  */
295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.align	4
305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Multiboot header.  */
325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectmultiboot_header:
335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* magic */
345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.long	MULTIBOOT_HEADER_MAGIC
355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* flags */
365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.long	MULTIBOOT_HEADER_FLAGS
375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* checksum */
385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.long	-(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifndef __ELF__
405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* header_addr */
415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.long	multiboot_header
425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* load_addr */
435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.long	_start
445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* load_end_addr */
455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.long	_edata
465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* bss_end_addr */
475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.long	_end
485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* entry_addr */
495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.long	multiboot_entry
505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif /* ! __ELF__ */
515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectmultiboot_entry:
535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Initialize the stack pointer.  */
545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movl	$(stack + STACK_SIZE), %esp
555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Reset EFLAGS.  */
575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	pushl	$0
585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	popf
595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Push the pointer to the Multiboot information structure.  */
615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	pushl	%ebx
625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Push the magic value.  */
635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	pushl	%eax
645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Now enter the C main function...  */
665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	call	EXT_C(cmain)
675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Halt.  */
695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	pushl	$halt_message
705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	call	EXT_C(printf)
715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectloop:	hlt
735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jmp	loop
745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecthalt_message:
765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.asciz	"Halted."
775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Our stack area.  */
795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.comm	stack, STACK_SIZE
805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project