mirror of
git://git.git.savannah.gnu.org/grub.git
synced 2026-08-19 06:56:15 +00:00
120 lines
2.9 KiB
ArmAsm
120 lines
2.9 KiB
ArmAsm
/* 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
|