diff options
author | 2004-05-13 01:22:56 +0000 | |
---|---|---|
committer | 2004-05-13 01:22:56 +0000 | |
commit | 3147f0de677081dbc279e60e06a51adf73839f31 (patch) | |
tree | 201668455894dae47ca177c3ddb0b858c030cf71 | |
parent | test the spop1,,0 instructions (diff) | |
download | wireguard-openbsd-3147f0de677081dbc279e60e06a51adf73839f31.tar.xz wireguard-openbsd-3147f0de677081dbc279e60e06a51adf73839f31.zip |
implement spop1,,0 support
-rw-r--r-- | sys/arch/hppa/hppa/trap.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/sys/arch/hppa/hppa/trap.c b/sys/arch/hppa/hppa/trap.c index 71cdd7c7859..2f4091234cb 100644 --- a/sys/arch/hppa/hppa/trap.c +++ b/sys/arch/hppa/hppa/trap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: trap.c,v 1.74 2004/05/12 22:56:59 mickey Exp $ */ +/* $OpenBSD: trap.c,v 1.75 2004/05/13 01:22:56 mickey Exp $ */ /* * Copyright (c) 1998-2004 Michael Shalayeff @@ -337,11 +337,6 @@ trap(type, frame) case T_CONDITION | T_USER: break; - case T_ILLEGAL | T_USER: - sv.sival_int = va; - trapsignal(p, SIGILL, type &~ T_USER, ILL_ILLOPC, sv); - break; - case T_PRIV_OP | T_USER: sv.sival_int = va; trapsignal(p, SIGILL, type &~ T_USER, ILL_PRVOPC, sv); @@ -471,11 +466,25 @@ trap(type, frame) panic("trap: divide by zero in the kernel"); break; + case T_ILLEGAL: + case T_ILLEGAL | T_USER: + /* see if it's a SPOP1,,0 */ + if ((frame->tf_iir & 0xfffffe00) == 0x10000200) { + frame_regmap(frame, frame->tf_iir & 0x1f) = 0; + frame->tf_ipsw |= PSL_N; + break; + } + if (type & T_USER) { + sv.sival_int = va; + trapsignal(p, SIGILL, type &~ T_USER, ILL_ILLOPC, sv); + break; + } + /* FALLTHROUGH */ + case T_LOWERPL: case T_DPROT: case T_IPROT: case T_OVERFLOW: - case T_ILLEGAL: case T_HIGHERPL: case T_TAKENBR: case T_POWERFAIL: |