summaryrefslogtreecommitdiff
path: root/sys/arch
diff options
context:
space:
mode:
authorPer Fogelstrom <pefo@cvs.openbsd.org>1996-09-19 17:35:20 +0000
committerPer Fogelstrom <pefo@cvs.openbsd.org>1996-09-19 17:35:20 +0000
commitd7655a28f9b5219fbaede9252de78d6968f16700 (patch)
treea65601faf2379200288ce882b8524878f8f9f5dc /sys/arch
parentac82cb94b96f5e717f357274f71ad559fcff933e (diff)
Take care of a bug in earlier versions of the R4600 chip.
Diffstat (limited to 'sys/arch')
-rw-r--r--sys/arch/arc/arc/locore.S30
1 files changed, 25 insertions, 5 deletions
diff --git a/sys/arch/arc/arc/locore.S b/sys/arch/arc/arc/locore.S
index 42ee574546f..96920f9ce3e 100644
--- a/sys/arch/arc/arc/locore.S
+++ b/sys/arch/arc/arc/locore.S
@@ -1,4 +1,4 @@
-/* $OpenBSD: locore.S,v 1.4 1996/09/14 15:58:15 pefo Exp $ */
+/* $OpenBSD: locore.S,v 1.5 1996/09/19 17:35:19 pefo Exp $ */
/*
* Copyright (c) 1992, 1993
* The Regents of the University of California. All rights reserved.
@@ -50,7 +50,7 @@
* v 1.1 89/07/10 14:27:41 nelson Exp SPRITE (DECWRL)
*
* from: @(#)locore.s 8.5 (Berkeley) 1/4/94
- * $Id: locore.S,v 1.4 1996/09/14 15:58:15 pefo Exp $
+ * $Id: locore.S,v 1.5 1996/09/19 17:35:19 pefo Exp $
*/
/*
@@ -790,8 +790,7 @@ LEAF(suiword)
sw v0, UADDR+U_PCB_ONFAULT
sw a1, 0(a0) # store word
sw zero, UADDR+U_PCB_ONFAULT
- move v0, zero
- b R4K_FlushICache # NOTE: this should not clobber v0!
+ b R4K_FlushICache # FlushICache sets v0 = 0. (Ugly)
li a1, 4 # size of word
END(suiword)
@@ -2604,6 +2603,10 @@ END(R4K_ConfigCache)
*/
LEAF(R4K_FlushCache)
.set noreorder
+/*XXX 4600 Bug */
+ mfc0 v1, COP_0_STATUS_REG # Save the status register.
+ mtc0 zero, COP_0_STATUS_REG # Disable interrupts
+/*XXX*/
lw v0, CpuTwoWayCache
lw t1, CpuPrimaryInstCacheSize
lw t2, CpuPrimaryDataCacheSize
@@ -2667,6 +2670,9 @@ LEAF(R4K_FlushCache)
bne t0, t1, 1b
addu t0, t0, 128
+/*XXX 4600 Bug */
+ mtc0 v1, COP_0_STATUS_REG # Restore the status register.
+/*XXX*/
j ra
nop
END(R4K_FlushCache)
@@ -2692,6 +2698,10 @@ END(R4K_FlushCache)
*----------------------------------------------------------------------------
*/
LEAF(R4K_FlushICache)
+/*XXX 4600 Bug */
+ mfc0 v1, COP_0_STATUS_REG # Save the status register.
+ mtc0 zero, COP_0_STATUS_REG # Disable interrupts
+/*XXX*/
lw v0, CpuTwoWayCache
addu a1, 127 # Align
srl a1, a1, 7 # Number of unrolled loops
@@ -2719,8 +2729,11 @@ LEAF(R4K_FlushICache)
bne a1, zero, 1b
addu a0, 128
+/*XXX 4600 Bug */
+ mtc0 v1, COP_0_STATUS_REG # Restore the status register.
+/*XXX*/
j ra
- nop
+ move v0, zero # suiword depends on this!!
END(R4K_FlushICache)
/*----------------------------------------------------------------------------
@@ -2743,6 +2756,10 @@ END(R4K_FlushICache)
*----------------------------------------------------------------------------
*/
LEAF(R4K_FlushDCache)
+/*XXX 4600 Bug */
+ mfc0 v1, COP_0_STATUS_REG # Save the status register.
+ mtc0 zero, COP_0_STATUS_REG # Disable interrupts
+/*XXX*/
lw v0, CpuTwoWayCache
lw a2, CpuPrimaryDataCacheSize
addiu a2, -1
@@ -2778,6 +2795,9 @@ LEAF(R4K_FlushDCache)
bne a1, zero, 1b
addu a0, 128
+/*XXX 4600 Bug */
+ mtc0 v1, COP_0_STATUS_REG # Restore the status register.
+/*XXX*/
j ra
nop
END(R4K_FlushDCache)