.long 0
codestart:
/* Decompress the payload. */
- move $t9, $ra
- addiu $t2, $t9, GRUB_KERNEL_CPU_RAW_SIZE - BASE_ADDR
- lui $t1, %hi(compressed)
- addiu $t1, %lo(compressed)
- lw $t3, (GRUB_KERNEL_CPU_COMPRESSED_SIZE - BASE_ADDR)($t9)
-
- /* $t2 contains source compressed address, $t1 is destination,
- $t3 is compressed size. FIXME: put LZMA here. Don't clober $t9
+ move $s0, $ra
+ addiu $a0, $s0, GRUB_KERNEL_CPU_RAW_SIZE - BASE_ADDR
+ lui $a1, %hi(compressed)
+ addiu $a1, %lo(compressed)
+ lw $a2, (GRUB_KERNEL_CPU_COMPRESSED_SIZE - BASE_ADDR)($s0)
+ move $s1, $a1
+
+ /* $a0 contains source compressed address, $a1 is destination,
+ $a2 is compressed size. FIXME: put LZMA here. Don't clober $s0, $s1.
+ On return $v0 contains uncompressed size.
*/
+ move $v0, $a2
reloccont:
- lb $t4, 0($t2)
- sb $t4, 0($t1)
- addiu $t1,$t1,1
- addiu $t2,$t2,1
- addiu $t3, 0xffff
- bne $t3, $0, reloccont
+ lb $t4, 0($a0)
+ sb $t4, 0($a1)
+ addiu $a1,$a1,1
+ addiu $a0,$a0,1
+ addiu $a2, 0xffff
+ bne $a2, $0, reloccont
+
+ move $a0, $s1
+ move $a1, $v0
+
+#include "cache_flush.S"
+
+ lui $t1, %hi(cont)
+ addiu $t1, %lo(cont)
+
+ jr $t1
+ . = _start + GRUB_KERNEL_CPU_RAW_SIZE
+compressed:
+ . = _start + GRUB_KERNEL_CPU_PREFIX
+
+VARIABLE(grub_prefix)
+
+ /* to be filled by grub-mkelfimage */
+
+ /*
+ * Leave some breathing room for the prefix.
+ */
+
+ . = _start + GRUB_KERNEL_CPU_DATA_END
+
+cont:
/* Move the modules out of BSS. */
lui $t1, %hi(_start)
addiu $t1, %lo(_start)
- lw $t2, (GRUB_KERNEL_CPU_KERNEL_IMAGE_SIZE - BASE_ADDR)($t9)
+ lw $t2, (GRUB_KERNEL_CPU_KERNEL_IMAGE_SIZE - BASE_ADDR)($s0)
addu $t2, $t1, $t2
lui $t1, %hi(_end)
nor $t3, $t3, $0
and $t1, $t1, $t3
- lw $t3, (GRUB_KERNEL_CPU_TOTAL_MODULE_SIZE - BASE_ADDR)($t9)
+ lw $t3, (GRUB_KERNEL_CPU_TOTAL_MODULE_SIZE - BASE_ADDR)($s0)
/* Backward copy. */
add $t1, $t1, $t3
lui $t1, %hi(grub_main)
addiu $t1, %lo(grub_main)
-#if __mips >= 2
- sync
-#endif
jr $t1
- . = _start + GRUB_KERNEL_CPU_RAW_SIZE
-compressed:
- . = _start + GRUB_KERNEL_CPU_PREFIX
-
-VARIABLE(grub_prefix)
- /* to be filled by grub-mkelfimage */
-
- /*
- * Leave some breathing room for the prefix.
- */
-
- . = _start + GRUB_KERNEL_CPU_DATA_END
phdr->p_flags = grub_host_to_target32 (PF_R | PF_W | PF_X);
target_addr = ALIGN_UP (GRUB_KERNEL_MACHINE_LINK_ADDR
- + kernel_size + total_module_size
- + 0x100000
- // + BSS_SIZE
- , 32);
+ + kernel_size + total_module_size, 32);
ehdr->e_entry = grub_host_to_target32 (target_addr);
phdr->p_vaddr = grub_host_to_target32 (target_addr);
phdr->p_paddr = grub_host_to_target32 (target_addr);