]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Deduplicated cache handling. Fixed jump hatch being filled with random stuff
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sat, 28 Nov 2009 22:34:48 +0000 (23:34 +0100)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sat, 28 Nov 2009 22:34:48 +0000 (23:34 +0100)
kern/mips/cache.S
kern/mips/cache_flush.S [new file with mode: 0644]
lib/mips/relocator.c
lib/mips/relocator_asm.S

index 8353e1b042ed8e6b034a047c3f281fff610101b4..2c35b6da2a731b355c71f0b0f87e7c8a2ed46ad9 100644 (file)
@@ -1,29 +1,7 @@
+
 #include <grub/symbol.h>
 
-       /* FIXME: This should invalidate only part of memory.  */
 FUNCTION (grub_cpu_flush_cache)
 FUNCTION (grub_arch_sync_caches)
-       move $t2, $a0
-       addu $t3, $a0, $a1
-       srl $t2, $t2, 5
-       sll $t2, $t2, 5
-       addu $t3, $t3, 0x1f
-       srl $t3, $t3, 5
-       sll $t3, $t3, 5
-       move $t0, $t2
-       subu $t1, $t3, $t2
-r1:
-       cache 1, 0($t0)
-       addiu $t0, $t0, 0x1
-       addiu $t1, $t1, 0xffff
-       bne $t1, $zero, r1
-       sync
-       move $t0, $t2
-       subu $t1, $t3, $t2
-r2:
-       cache 0, 0($t0)
-       addiu $t0, $t0, 0x1
-       addiu $t1, $t1, 0xffff
-       bne $t1, $zero, r2
-       sync
+#include "cache_flush.S"
        j $ra
diff --git a/kern/mips/cache_flush.S b/kern/mips/cache_flush.S
new file mode 100644 (file)
index 0000000..5667ee7
--- /dev/null
@@ -0,0 +1,23 @@
+       move $t2, $a0
+       addu $t3, $a0, $a1
+       srl $t2, $t2, 5
+       sll $t2, $t2, 5
+       addu $t3, $t3, 0x1f
+       srl $t3, $t3, 5
+       sll $t3, $t3, 5
+       move $t0, $t2
+       subu $t1, $t3, $t2
+1:
+       cache 1, 0($t0)
+       addiu $t0, $t0, 0x1
+       addiu $t1, $t1, 0xffff
+       bne $t1, $zero, 1b
+       sync
+       move $t0, $t2
+       subu $t1, $t3, $t2
+2:
+       cache 0, 0($t0)
+       addiu $t0, $t0, 0x1
+       addiu $t1, $t1, 0xffff
+       bne $t1, $zero, 2b
+       sync
index 796473bf774d93e12707d4fdfdc71fb8b41543e1..40be263c7aed61320e978423a843bd72f70becb6 100644 (file)
@@ -64,6 +64,9 @@ write_jump (int regn, void **target)
   /* j $r.  */
   *(grub_uint32_t *) *target = (regn<<21) | 0x8;
   *target = ((grub_uint32_t *) *target) + 1;
+  /* nop.  */
+  *(grub_uint32_t *) *target = 0;
+  *target = ((grub_uint32_t *) *target) + 1;
 }
 
 static void
index 9daf0d32fb88ad21213874dd7487aa6a2c5912ea..ff4fa31e0c1129ac0eec9ccd7fbef873dfcea648 100644 (file)
@@ -21,8 +21,8 @@
        .p2align        4       /* force 16-byte alignment */
 
 VARIABLE (grub_relocator32_forward_start)
-       move $12, $9
-       move $13, $10
+       move $a0, $9
+       move $a1, $10
 
 copycont1:     
        lb $11,0($8)
@@ -32,31 +32,13 @@ copycont1:
        addiu $10, $10, 0xffff
        bne $10, $0, copycont1
 
-       move $9, $12
-       move $10, $13
-cachecont1a:   
-       cache 1,0($12)
-       addiu $12, $12, 0x1
-       addiu $13, $13, 0xffff
-       bne $13, $0, cachecont1a
-
-       sync
-
-       move $12, $9
-       move $13, $10
-cachecont1b:   
-       cache 0,0($12)
-       addiu $12, $12, 0x1
-       addiu $13, $13, 0xffff
-       bne $13, $0, cachecont1b
-
-       sync
+#include "../../kern/mips/cache_flush.S"
 
 VARIABLE (grub_relocator32_forward_end)
 
 VARIABLE (grub_relocator32_backward_start)
-       move $12, $9
-       move $13, $10
+       move $a0, $9
+       move $a1, $10
 
        addu $9, $9, $10
        addu $8, $8, $10
@@ -71,23 +53,6 @@ copycont2:
        addiu $10, 0xffff
        bne $10, $0, copycont2
 
-       move $9, $12
-       move $10, $13
-cachecont2a:   
-       cache 1,0($12)
-       addiu $12, $12, 0x1
-       addiu $13, $13, 0xffff
-       bne $13, $0, cachecont2a
-
-       sync
-
-       move $12, $9
-       move $13, $10
-cachecont2b:   
-       cache 0,0($12)
-       addiu $12, $12, 0x1
-       addiu $13, $13, 0xffff
-       bne $13, $0, cachecont2b
+#include "../../kern/mips/cache_flush.S"
 
-       sync
 VARIABLE (grub_relocator32_backward_end)