Hi
we _always_ know what version of sigtramp we need to call,
just made it explicit. As an added bonus, we only pay penalizations
now on the buggy cpus (aka 4600).
Later, Juan.
build/arch/mips/mm/c-r4k.c | 31 +++++++++++++++++++------------
1 files changed, 19 insertions(+), 12 deletions(-)
diff -puN build/arch/mips/mm/c-r4k.c~c-r4k_sigtramp build/arch/mips/mm/c-r4k.c
--- 24/build/arch/mips/mm/c-r4k.c~c-r4k_sigtramp 2003-03-28
00:41:17.000000000 +0100
+++ 24-quintela/build/arch/mips/mm/c-r4k.c 2003-03-28 00:43:42.000000000
+0100
@@ -531,22 +531,25 @@ static void r4k_dma_cache_inv_sc(unsigne
*/
static void r4k_flush_cache_sigtramp(unsigned long addr)
{
+ protected_writeback_dcache_line(addr & ~(dc_lsize - 1));
+ protected_flush_icache_line(addr & ~(ic_lsize - 1));
+}
+
+static void r4600v17_flush_cache_sigtramp(unsigned long addr)
+{
#ifdef R4600_V1_HIT_DCACHE_WAR
unsigned long flags;
local_irq_save(flags);
__asm__ __volatile__("nop;nop;nop;nop");
#endif
-
- protected_writeback_dcache_line(addr & ~(dc_lsize - 1));
- protected_flush_icache_line(addr & ~(ic_lsize - 1));
-
+ r4k_flush_cache_sigtramp(addr);
#ifdef R4600_V1_HIT_DCACHE_WAR
local_irq_restore(flags);
#endif
}
-static void r4600v20k_flush_cache_sigtramp(unsigned long addr)
+static void r4600v20_flush_cache_sigtramp(unsigned long addr)
{
#ifdef R4600_V2_HIT_CACHEOP_WAR
unsigned long flags;
@@ -556,10 +559,7 @@ static void r4600v20k_flush_cache_sigtra
/* Clear internal cache refill buffer */
*(volatile unsigned int *)KSEG1;
#endif
-
- protected_writeback_dcache_line(addr & ~(dc_lsize - 1));
- protected_flush_icache_line(addr & ~(ic_lsize - 1));
-
+ r4k_flush_cache_sigtramp(addr);
#ifdef R4600_V2_HIT_CACHEOP_WAR
local_irq_restore(flags);
#endif
@@ -810,9 +810,16 @@ void __init ld_mmu_r4xx0(void)
}
_flush_dcache_page = r4k_flush_dcache_page;
- _flush_cache_sigtramp = r4k_flush_cache_sigtramp;
- if ((read_c0_prid() & 0xfff0) == 0x2020) {
- _flush_cache_sigtramp = r4600v20k_flush_cache_sigtramp;
+
+ switch(read_c0_prid() & 0xfff0) {
+ case 0x2010:
+ _flush_cache_sigtramp = r4600v17_flush_cache_sigtramp;
+ break;
+ case 0x2020:
+ _flush_cache_sigtramp = r4600v20_flush_cache_sigtramp;
+ break;
+ default:
+ _flush_cache_sigtramp = r4k_flush_cache_sigtramp;
}
_flush_icache_range = r4k_flush_icache_range; /* Ouch */
_
--
In theory, practice and theory are the same, but in practice they
are different -- Larry McVoy
|