]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Startup code cleanup
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sun, 6 Dec 2009 14:32:32 +0000 (15:32 +0100)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sun, 6 Dec 2009 14:32:32 +0000 (15:32 +0100)
kern/mips/startup.S
util/grub-mkrawimage.c

index b27442102fd8c0088eae8b2f290e325809ce547f..7c59e761e1a56fb78776397efdb65a9d34417b8c 100644 (file)
@@ -42,27 +42,55 @@ kernel_image_size:
        .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)
@@ -72,7 +100,7 @@ reloccont:
        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
@@ -105,20 +133,5 @@ bsscont:
        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
index bbdbf9c8b301c529bc252eed0d3cea70be57edda..5399f4c4291eaaf34f8d6a8c28de96f835cdb6ae 100644 (file)
@@ -363,10 +363,7 @@ generate_image (const char *dir, char *prefix, FILE *out, char *mods[],
       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);