summaryrefslogtreecommitdiff
path: root/sys/arch
diff options
context:
space:
mode:
authorMiod Vallat <miod@cvs.openbsd.org>2006-05-04 19:38:46 +0000
committerMiod Vallat <miod@cvs.openbsd.org>2006-05-04 19:38:46 +0000
commit52a220bc3a28e7cfca4e36b9022b3b78acedf5ea (patch)
tree65bb0a751a4a30346eab92f43a99b85bb33940bb /sys/arch
parent1a05698eefe9ff1978950e6737b5b4f2449be4df (diff)
scaled version of ld.d and st.d is obviously not a 64 bit transaction,
so there is no need to take care of it in double_reg_fixup(), as it will never trigger the kind of misalignment faults this function recovers from. Doh!
Diffstat (limited to 'sys/arch')
-rw-r--r--sys/arch/m88k/m88k/trap.c17
1 files changed, 6 insertions, 11 deletions
diff --git a/sys/arch/m88k/m88k/trap.c b/sys/arch/m88k/m88k/trap.c
index 3c429a116a1..0b91d2a5bec 100644
--- a/sys/arch/m88k/m88k/trap.c
+++ b/sys/arch/m88k/m88k/trap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: trap.c,v 1.30 2006/05/02 21:44:39 miod Exp $ */
+/* $OpenBSD: trap.c,v 1.31 2006/05/04 19:38:45 miod Exp $ */
/*
* Copyright (c) 2004, Miodrag Vallat.
* Copyright (c) 1998 Steve Murphree, Jr.
@@ -102,6 +102,7 @@ const char *trap_type[] = {
"Error Exception",
"Non-Maskable Exception",
};
+
const int trap_types = sizeof trap_type / sizeof trap_type[0];
#ifdef M88100
@@ -1696,6 +1697,10 @@ splassert_check(int wantipl, const char *func)
* This routine attempts to recover these (valid) statements, by simulating
* the split form of the instruction. If it fails, it returns the appropriate
* signal number to deliver.
+ *
+ * Note that we do not attempt to do anything for .d.usr instructions - the
+ * kernel never issues such instructions, and they cause a privileged
+ * isntruction exception from userland.
*/
int
double_reg_fixup(struct trapframe *frame)
@@ -1718,21 +1723,11 @@ double_reg_fixup(struct trapframe *frame)
+ frame->tf_r[(instr & 0x1f)];
store = 0;
break;
- case 0xf4001200: /* ld.d rD, rS1[rS2] */
- addr = frame->tf_r[(instr >> 16) & 0x1f]
- + (frame->tf_r[(instr & 0x1f)] << 3);
- store = 0;
- break;
case 0xf4002000: /* st.d rD, rS1, rS2 */
addr = frame->tf_r[(instr >> 16) & 0x1f]
+ frame->tf_r[(instr & 0x1f)];
store = 1;
break;
- case 0xf4002200: /* st.d rD, rS1[rS2] */
- addr = frame->tf_r[(instr >> 16) & 0x1f]
- + (frame->tf_r[(instr & 0x1f)] << 3);
- store = 1;
- break;
default:
switch (instr & 0xfc000000) {
case 0x10000000: /* ld.d rD, rS, imm16 */