From 3c68ed3d804353ec94d3b5154e3f6e0016ba22f9 Mon Sep 17 00:00:00 2001 From: Vladimir 'phcoder' Serbinenko Date: Sat, 28 Nov 2009 23:34:48 +0100 Subject: [PATCH] Deduplicated cache handling. Fixed jump hatch being filled with random stuff --- kern/mips/cache.S | 26 ++-------------------- kern/mips/cache_flush.S | 23 ++++++++++++++++++++ lib/mips/relocator.c | 3 +++ lib/mips/relocator_asm.S | 47 +++++----------------------------------- 4 files changed, 34 insertions(+), 65 deletions(-) create mode 100644 kern/mips/cache_flush.S diff --git a/kern/mips/cache.S b/kern/mips/cache.S index 8353e1b04..2c35b6da2 100644 --- a/kern/mips/cache.S +++ b/kern/mips/cache.S @@ -1,29 +1,7 @@ + #include - /* 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 index 000000000..5667ee7b4 --- /dev/null +++ b/kern/mips/cache_flush.S @@ -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 diff --git a/lib/mips/relocator.c b/lib/mips/relocator.c index 796473bf7..40be263c7 100644 --- a/lib/mips/relocator.c +++ b/lib/mips/relocator.c @@ -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 diff --git a/lib/mips/relocator_asm.S b/lib/mips/relocator_asm.S index 9daf0d32f..ff4fa31e0 100644 --- a/lib/mips/relocator_asm.S +++ b/lib/mips/relocator_asm.S @@ -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 +#include "../../kern/mips/cache_flush.S" - sync - - move $12, $9 - move $13, $10 -cachecont2b: - cache 0,0($12) - addiu $12, $12, 0x1 - addiu $13, $13, 0xffff - bne $13, $0, cachecont2b - - sync VARIABLE (grub_relocator32_backward_end)