Module Name: src
Committed By: cliff
Date: Thu Apr 14 05:20:08 UTC 2011
Modified Files:
src/sys/arch/mips/rmi: rmixl_subr.S
Log Message:
- fix RCSID
- add rmixl_eirr_ack() to ack the EIRR, using COP0_SYNC & JR_HB_RA as needed
- in rmixl_cpu_trampoline, remove old KSEG0 address reconstruction
of trampoline args pointer, and comment/explain the new way
- also in rmixl_cpu_trampoline, remove old watchpoint hack used for debugging
To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/mips/rmi/rmixl_subr.S
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/mips/rmi/rmixl_subr.S
diff -u src/sys/arch/mips/rmi/rmixl_subr.S:1.3 src/sys/arch/mips/rmi/rmixl_subr.S:1.4
--- src/sys/arch/mips/rmi/rmixl_subr.S:1.3 Sun Feb 20 07:48:37 2011
+++ src/sys/arch/mips/rmi/rmixl_subr.S Thu Apr 14 05:20:08 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: rmixl_subr.S,v 1.3 2011/02/20 07:48:37 matt Exp $ */
+/* $NetBSD: rmixl_subr.S,v 1.4 2011/04/14 05:20:08 cliff Exp $ */
/*-
* Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -37,10 +37,13 @@
#include <mips/asm.h>
#include <mips/cpuregs.h>
-RCSID("$NetSBD$")
+RCSID("$NetBSD: rmixl_subr.S,v 1.4 2011/04/14 05:20:08 cliff Exp $");
#include "assym.h"
+#define RMIXL_COP_0_EIRR _(9), 6
+#define RMIXL_COP_0_EIMR _(9), 7
+
.set push
.set noreorder
.set mips64
@@ -56,7 +59,7 @@
#error O32 not supported
#endif
j ra
- mfcr v0, a0
+ mfcr v0, a0
END(rmixl_mfcr)
/*
@@ -69,9 +72,29 @@
#error O32 not supported
#endif
j ra
- mtcr a1, a0
+ mtcr a1, a0
END(rmixl_mtcr)
+/*
+ * void rmixl_eirr_ack(uint64_t eimr, uint64_t vecbit, uint64_t preserve)
+ *
+ * ack in EIRR the irq we are about to handle
+ * disable all interrupts to prevent a race that would allow
+ * e.g. softints set from a higher interrupt getting
+ * clobbered by the EIRR read-modify-write
+ */
+LEAF(rmixl_eirr_ack)
+ dmtc0 zero, RMIXL_COP_0_EIMR /* EIMR = 0 */
+ COP0_SYNC
+ dmfc0 a3, RMIXL_COP_0_EIRR /* a3 = EIRR */
+ and a3, a2 /* a3 &= preserve */
+ or a3, a1 /* a3 |= vecbit */
+ dmtc0 a3, RMIXL_COP_0_EIRR /* EIRR = a3 */
+ COP0_SYNC
+ dmtc0 a0, RMIXL_COP_0_EIMR /* EIMR = eimr */
+ JR_HB_RA
+END(rmixl_eirr_ack)
+
#ifdef MULTIPROCESSOR
/*
* rmixlfw_wakeup_cpu(func, args, mask, callback)
@@ -111,13 +134,13 @@
*/
NESTED(rmixl_cpu_trampoline, CALLFRAME_SIZ, ra)
#ifdef _LP64
- li t0, MIPS_SR_KX
-#if 0
- li t1, MIPS_KSEG0_START /* reconstruct presumed upper half ... */
- or s0, a0, t1 /* ... of trampoline args addr */
-#else
+ /*
+ * reconstruct trampoline args addr:
+ * sign-extend 32 bit KSEG0 address in a0
+ * to make proper 64 bit KSEG0 addr
+ */
sll s0, a0, 0
-#endif
+ li t0, MIPS_SR_KX
#else
li t0, 0
#endif
@@ -132,18 +155,6 @@
mtc0 t0, $15, 1 /* MIPS_COP_0_EBASE */
/*
- * Set up a watch exception if we try to execute from cpu_info.
- */
- lui t0, %hi(0x40000000) /* global bit */
- ori t0, PAGE_SIZE-1
- mtc0 t0, MIPS_COP_0_WATCH_HI
-
- REG_L t0, 2*SZREG(s0) /* XXX ta_cpuinfo */
- dmtc0 t0, $22, 1
- ori t0, 4
- dmtc0 t0, MIPS_COP_0_WATCH_LO
-
- /*
* load our stack pointer from trampoline args
*/
REG_L sp, 0*SZREG(s0) /* XXX ta_sp */