--- /dev/null
+/* boot.S - bootstrap the kernel */
+/* Copyright (C) 1999, 2001, 2010 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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#define ASM_FILE 1
+#include <multiboot2.h>
+
+/* C symbol format. HAVE_ASM_USCORE is defined by configure. */
+#ifdef HAVE_ASM_USCORE
+# define EXT_C(sym) _ ## sym
+#else
+# define EXT_C(sym) sym
+#endif
+
+/* The size of our stack (16KB). */
+#define STACK_SIZE 0x4000
+
+/* The flags for the Multiboot header. */
+#ifdef __ELF__
+# define AOUT_KLUDGE 0
+#else
+# define AOUT_KLUDGE MULTIBOOT_AOUT_KLUDGE
+#endif
+
+ .text
+ .set noreorder
+ .set nomacro
+
+ .globl start, _start
+start:
+_start:
+ b multiboot_entry
+ nop
+
+ /* Align 64 bits boundary. */
+ .align 8
+
+ /* Multiboot header. */
+multiboot_header:
+ /* magic */
+ .long MULTIBOOT2_HEADER_MAGIC
+ /* ISA: mips32 */
+ .long MULTIBOOT_ARCHITECTURE_MIPS32
+ /* Header length. */
+ .long multiboot_header_end - multiboot_header
+ /* checksum */
+ .long -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT_ARCHITECTURE_MIPS32 + (multiboot_header_end - multiboot_header))
+#ifndef __ELF__
+address_tag_start:
+ .short MULTIBOOT_HEADER_TAG_ADDRESS
+ .short MULTIBOOT_HEADER_TAG_OPTIONAL
+ .long address_tag_end - address_tag_start
+ /* header_addr */
+ .long multiboot_header
+ /* load_addr */
+ .long _start
+ /* load_end_addr */
+ .long _edata
+ /* bss_end_addr */
+ .long _end
+address_tag_end:
+entry_address_tag_start:
+ .short MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS
+ .short MULTIBOOT_HEADER_TAG_OPTIONAL
+ .long entry_address_tag_end - entry_address_tag_start
+ /* entry_addr */
+ .long multiboot_entry
+entry_address_tag_end:
+#endif /* __ELF__ */
+framebuffer_tag_start:
+ .short MULTIBOOT_HEADER_TAG_FRAMEBUFFER
+ .short MULTIBOOT_HEADER_TAG_OPTIONAL
+ .long framebuffer_tag_end - framebuffer_tag_start
+ .long 1024
+ .long 768
+ .long 32
+framebuffer_tag_end:
+ .short MULTIBOOT_HEADER_TAG_END
+ .short 0
+ .long 8
+multiboot_header_end:
+multiboot_entry:
+ /* Initialize the stack pointer. */
+ lui $sp, %hi (stack + STACK_SIZE)
+ addiu $sp, $sp, %lo (stack + STACK_SIZE)
+
+ /* Now enter the C main function... */
+ bal EXT_C(cmain)
+ nop
+
+ /* Halt. */
+ lui $a0, %hi (halt_message)
+ addiu $a0, $a0, %lo (halt_message)
+ bal EXT_C(printf)
+ nop
+
+loop: nop
+ b loop
+ nop
+
+halt_message:
+ .asciz "Halted."
+
+ .align 8
+ /* Our stack area. */
+ .comm stack, STACK_SIZE