diff options
author | Miod Vallat <miod@cvs.openbsd.org> | 2006-05-04 19:38:46 +0000 |
---|---|---|
committer | Miod Vallat <miod@cvs.openbsd.org> | 2006-05-04 19:38:46 +0000 |
commit | 52a220bc3a28e7cfca4e36b9022b3b78acedf5ea (patch) | |
tree | 65bb0a751a4a30346eab92f43a99b85bb33940bb /sys/arch | |
parent | 1a05698eefe9ff1978950e6737b5b4f2449be4df (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.c | 17 |
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 */ |