123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- /* startup.S - Startup code for the MIPS. */
- /*
- * GRUB -- GRand Unified Bootloader
- * Copyright (C) 2009 Free Software Foundation, Inc.
- *
- * GRUB 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.
- *
- * GRUB 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 GRUB. If not, see <http://www.gnu.org/licenses/>.
- */
- #include <grub/symbol.h>
- #include <grub/offsets.h>
- #include <grub/machine/memory.h>
- #include <grub/machine/kernel.h>
- #include <grub/offsets.h>
- #include <grub/mips/asm.h>
- #define BASE_ADDR 8
- .globl __start, _start, start
- .set noreorder
- .set nomacro
- __start:
- _start:
- start:
- .extern __bss_start
- .extern _end
- bal cont
- nop
- .org GRUB_KERNEL_MACHINE_TOTAL_MODULE_SIZE
- VARIABLE(grub_total_modules_size)
- .long 0
- VARIABLE (grub_arch_busclock)
- .long 0
- VARIABLE (grub_arch_cpuclock)
- .long 0
- VARIABLE (grub_arch_memsize)
- .long 0
- VARIABLE (grub_arch_highmemsize)
- .long 0
- #ifdef GRUB_MACHINE_MIPS_LOONGSON
- VARIABLE (grub_arch_machine)
- .long GRUB_ARCH_MACHINE_FULOONG2F
- #endif
- cont:
- /* Save our base. */
- move $s0, $ra
- #ifdef GRUB_MACHINE_MIPS_QEMU_MIPS
- lui $t1, %hi(grub_arch_busclock)
- addiu $t1, %lo(grub_arch_busclock)
- sw $s4, 8($t1)
- #endif
- #ifdef GRUB_MACHINE_MIPS_LOONGSON
- lui $t1, %hi(grub_arch_busclock)
- addiu $t1, %lo(grub_arch_busclock)
- sw $s2, 0($t1)
- sw $s3, 4($t1)
- sw $s4, 8($t1)
- sw $s5, 12($t1)
- sw $s7, 16($t1)
- #endif
- /* Move the modules out of BSS. */
- lui $t2, %hi(__bss_start)
- addiu $t2, %lo(__bss_start)
-
- lui $t1, %hi(_end)
- addiu $t1, %lo(_end)
- addiu $t1, (GRUB_KERNEL_MACHINE_MOD_ALIGN - 1)
- li $t3, (GRUB_KERNEL_MACHINE_MOD_ALIGN - 1)
- nor $t3, $t3, $0
- and $t1, $t1, $t3
-
- lw $t3, (GRUB_KERNEL_MACHINE_TOTAL_MODULE_SIZE - BASE_ADDR)($s0)
- /* Backward copy. */
- add $t1, $t1, $t3
- add $t2, $t2, $t3
- addiu $t1, $t1, -1
- addiu $t2, $t2, -1
- /* $t2 is source. $t1 is destination. $t3 is size. */
- modulesmovcont:
- beq $t3, $0, modulesmovdone
- nop
- lb GRUB_ASM_T4, 0($t2)
- sb GRUB_ASM_T4, 0($t1)
- addiu $t2, $t2, -1
- addiu $t1, $t1, -1
- b modulesmovcont
- addiu $t3, $t3, -1
- modulesmovdone:
- /* Clean BSS. */
-
- lui $t1, %hi(__bss_start)
- addiu $t1, $t1, %lo(__bss_start)
- lui $t2, %hi(_end)
- addiu $t2, $t2, %lo(_end)
- bsscont:
- sb $0,0($t1)
- addiu $t1, $t1, 1
- sltu $t3, $t1, $t2
- bne $t3, $0, bsscont
- nop
- lui $t9, %hi(grub_main)
- addiu $t9, %lo(grub_main)
- lui $sp, %hi(GRUB_MACHINE_MEMORY_STACK_HIGH)
- jr $t9
- addiu $sp, $sp, %lo(GRUB_MACHINE_MEMORY_STACK_HIGH)
|