Oops.
$ cvs diff -w ChangeLog arch/sh/mm/cache-sh3.c
Index: ChangeLog
===================================================================
RCS file: /cvsroot/linuxsh/kernel/ChangeLog,v
retrieving revision 1.334
diff -u -w -r1.334 ChangeLog
--- ChangeLog 2001/08/24 12:38:19 1.334
+++ ChangeLog 2001/08/24 14:41:18
@@ -1,5 +1,8 @@
2001-08-24 David Woodhouse <dw...@in...>
+ * arch/sh/mm/cache-sh3.c: We were missing a loop over the ways in
+ __flush_wback_region(). Also disable interrupts between reading
+ an entry and writing it back modified.
* arch/sh/kernel/pcibios.c: Generic versions of five pcibios_xxx()
functions which can be shared between platforms.
* arch/sh/kernel/pci_st40.c: Use $1.
Index: arch/sh/mm/cache-sh3.c
===================================================================
RCS file: /cvsroot/linuxsh/kernel/arch/sh/mm/cache-sh3.c,v
retrieving revision 1.4
diff -u -w -r1.4 cache-sh3.c
--- arch/sh/mm/cache-sh3.c 2001/08/10 14:13:13 1.4
+++ arch/sh/mm/cache-sh3.c 2001/08/24 14:41:18
@@ -156,24 +156,30 @@
{
unsigned long v, j;
unsigned long begin, end;
+ unsigned long flags;
begin = (unsigned long)start & ~(L1_CACHE_BYTES-1);
end = ((unsigned long)start + size + L1_CACHE_BYTES-1)
& ~(L1_CACHE_BYTES-1);
for (v = begin; v < end; v+=L1_CACHE_BYTES) {
+ for (j=0; j<CACHE_OC_NUM_WAYS; j++) {
unsigned long data, addr, p;
p = __pa(v);
addr = CACHE_OC_ADDRESS_ARRAY|(j<<CACHE_OC_WAY_SHIFT)|
(v&CACHE_OC_ENTRY_MASK);
+ save_and_cli(flags);
data = ctrl_inl(addr);
if ((data & CACHE_PHYSADDR_MASK) ==
(p & CACHE_PHYSADDR_MASK)) {
data &= ~CACHE_UPDATED;
ctrl_outl(data, addr);
+ restore_flags(flags);
break;
+ }
+ restore_flags(flags);
}
}
}
--
dwmw2
|