Allow exit to work normally under gdb

This commit is contained in:
Michael Meissner
1996-12-27 19:50:03 +00:00
parent 2503987b96
commit ee3f2d4f6a
2 changed files with 148 additions and 102 deletions

View File

@ -1,3 +1,39 @@
Fri Dec 27 14:44:06 1996 Michael Meissner <meissner@tiktok.cygnus.com>
* v850_sim.h (SIG_V850_EXIT): Define as -1.
* interp.c (sim_open): Cast calloc function.
(sim_stop_reason): If signal is SIG_V850_EXIT, inform gdb the
program exited with the appropriate exit code.
(sim_set_interrupt): Declare buildargv.
* simops.c (OP_10007E0): Make exit signal normal exit. Make time
type correct and work on big endian systems.
Wed Nov 20 02:18:44 1996 Doug Evans <dje@canuck.cygnus.com>
* Makefile.in: Delete stuff moved to ../common/Make-common.in.
(SIM_OBJS,SIM_EXTRA_CFLAGS,SIM_EXTRA_CLEAN): Define.
* configure.in: Simplify using macros in ../common/aclocal.m4.
Call AC_CHECK_HEADERS(unistd.h).
* configure: Regenerated.
* config.in: New file.
* simops.c: #include "config.h". #include <unistd.h> if present.
Sun Nov 3 23:02:54 1996 Stan Shebs <shebs@andros.cygnus.com>
* v850_sim.h (State): New slots dummy_mem, pending_nmi.
(EIPC, etc): New macros for system registers.
* simops.c, interp.c: Use everywhere.
* interp.c: Add support for interrupts issued by interrupt
generators, either PC- or time-based. Controlled by simulator
command "sim interrupt".
* interp.c: Add support for variable-size allocation of memory,
via simulator command "sim memory-map".
(map): Issue SIGSEGV for references to invalid memory regions.
Thu Oct 31 14:44:10 1996 Gavin Koch <gavin@cygnus.com> Thu Oct 31 14:44:10 1996 Gavin Koch <gavin@cygnus.com>
* simops.c: Include <sys/time.h> for struct timeval and * simops.c: Include <sys/time.h> for struct timeval and

View File

@ -1,4 +1,9 @@
#include "config.h"
#include <signal.h> #include <signal.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include "v850_sim.h" #include "v850_sim.h"
#include "simops.h" #include "simops.h"
#include "sys/syscall.h" #include "sys/syscall.h"
@ -272,7 +277,7 @@ trace_input (name, type, size)
case OP_COND_BR: case OP_COND_BR:
values[0] = State.pc; values[0] = State.pc;
values[1] = SEXT9 (OP[0]); values[1] = SEXT9 (OP[0]);
values[2] = State.sregs[5]; values[2] = PSW;
num_values = 3; num_values = 3;
break; break;
@ -325,7 +330,7 @@ trace_input (name, type, size)
break; break;
case OP_EX1: case OP_EX1:
values[0] = State.sregs[5]; values[0] = PSW;
num_values = 1; num_values = 1;
break; break;
@ -620,7 +625,7 @@ OP_580 ()
trace_input ("bv", OP_COND_BR, 0); trace_input ("bv", OP_COND_BR, 0);
op0 = SEXT9 (OP[0]); op0 = SEXT9 (OP[0]);
psw = State.sregs[5]; psw = PSW;
if ((psw & PSW_OV) != 0) if ((psw & PSW_OV) != 0)
State.pc += op0; State.pc += op0;
@ -638,7 +643,7 @@ OP_581 ()
trace_input ("bl", OP_COND_BR, 0); trace_input ("bl", OP_COND_BR, 0);
op0 = SEXT9 (OP[0]); op0 = SEXT9 (OP[0]);
psw = State.sregs[5]; psw = PSW;
if ((psw & PSW_CY) != 0) if ((psw & PSW_CY) != 0)
State.pc += op0; State.pc += op0;
@ -656,7 +661,7 @@ OP_582 ()
trace_input ("be", OP_COND_BR, 0); trace_input ("be", OP_COND_BR, 0);
op0 = SEXT9 (OP[0]); op0 = SEXT9 (OP[0]);
psw = State.sregs[5]; psw = PSW;
if ((psw & PSW_Z) != 0) if ((psw & PSW_Z) != 0)
State.pc += op0; State.pc += op0;
@ -674,7 +679,7 @@ OP_583 ()
trace_input ("bnh", OP_COND_BR, 0); trace_input ("bnh", OP_COND_BR, 0);
op0 = SEXT9 (OP[0]); op0 = SEXT9 (OP[0]);
psw = State.sregs[5]; psw = PSW;
if ((((psw & PSW_CY) != 0) | ((psw & PSW_Z) != 0)) != 0) if ((((psw & PSW_CY) != 0) | ((psw & PSW_Z) != 0)) != 0)
State.pc += op0; State.pc += op0;
@ -692,7 +697,7 @@ OP_584 ()
trace_input ("bn", OP_COND_BR, 0); trace_input ("bn", OP_COND_BR, 0);
op0 = SEXT9 (OP[0]); op0 = SEXT9 (OP[0]);
psw = State.sregs[5]; psw = PSW;
if ((psw & PSW_S) != 0) if ((psw & PSW_S) != 0)
State.pc += op0; State.pc += op0;
@ -723,7 +728,7 @@ OP_586 ()
trace_input ("blt", OP_COND_BR, 0); trace_input ("blt", OP_COND_BR, 0);
op0 = SEXT9 (OP[0]); op0 = SEXT9 (OP[0]);
psw = State.sregs[5]; psw = PSW;
if ((((psw & PSW_S) != 0) ^ ((psw & PSW_OV) != 0)) != 0) if ((((psw & PSW_S) != 0) ^ ((psw & PSW_OV) != 0)) != 0)
State.pc += op0; State.pc += op0;
@ -741,7 +746,7 @@ OP_587 ()
trace_input ("ble", OP_COND_BR, 0); trace_input ("ble", OP_COND_BR, 0);
op0 = SEXT9 (OP[0]); op0 = SEXT9 (OP[0]);
psw = State.sregs[5]; psw = PSW;
if ((((psw & PSW_Z) != 0) if ((((psw & PSW_Z) != 0)
|| (((psw & PSW_S) != 0) ^ ((psw & PSW_OV) != 0))) != 0) || (((psw & PSW_S) != 0) ^ ((psw & PSW_OV) != 0))) != 0)
@ -760,7 +765,7 @@ OP_588 ()
trace_input ("bnv", OP_COND_BR, 0); trace_input ("bnv", OP_COND_BR, 0);
op0 = SEXT9 (OP[0]); op0 = SEXT9 (OP[0]);
psw = State.sregs[5]; psw = PSW;
if ((psw & PSW_OV) == 0) if ((psw & PSW_OV) == 0)
State.pc += op0; State.pc += op0;
@ -778,7 +783,7 @@ OP_589 ()
trace_input ("bnl", OP_COND_BR, 0); trace_input ("bnl", OP_COND_BR, 0);
op0 = SEXT9 (OP[0]); op0 = SEXT9 (OP[0]);
psw = State.sregs[5]; psw = PSW;
if ((psw & PSW_CY) == 0) if ((psw & PSW_CY) == 0)
State.pc += op0; State.pc += op0;
@ -796,7 +801,7 @@ OP_58A ()
trace_input ("bne", OP_COND_BR, 0); trace_input ("bne", OP_COND_BR, 0);
op0 = SEXT9 (OP[0]); op0 = SEXT9 (OP[0]);
psw = State.sregs[5]; psw = PSW;
if ((psw & PSW_Z) == 0) if ((psw & PSW_Z) == 0)
State.pc += op0; State.pc += op0;
@ -814,7 +819,7 @@ OP_58B ()
trace_input ("bh", OP_COND_BR, 0); trace_input ("bh", OP_COND_BR, 0);
op0 = SEXT9 (OP[0]); op0 = SEXT9 (OP[0]);
psw = State.sregs[5]; psw = PSW;
if ((((psw & PSW_CY) != 0) | ((psw & PSW_Z) != 0)) == 0) if ((((psw & PSW_CY) != 0) | ((psw & PSW_Z) != 0)) == 0)
State.pc += op0; State.pc += op0;
@ -832,7 +837,7 @@ OP_58C ()
trace_input ("bp", OP_COND_BR, 0); trace_input ("bp", OP_COND_BR, 0);
op0 = SEXT9 (OP[0]); op0 = SEXT9 (OP[0]);
psw = State.sregs[5]; psw = PSW;
if ((psw & PSW_S) == 0) if ((psw & PSW_S) == 0)
State.pc += op0; State.pc += op0;
@ -850,7 +855,7 @@ OP_58D ()
trace_input ("bsa", OP_COND_BR, 0); trace_input ("bsa", OP_COND_BR, 0);
op0 = SEXT9 (OP[0]); op0 = SEXT9 (OP[0]);
psw = State.sregs[5]; psw = PSW;
if ((psw & PSW_SAT) != 0) if ((psw & PSW_SAT) != 0)
State.pc += op0; State.pc += op0;
@ -868,7 +873,7 @@ OP_58E ()
trace_input ("bge", OP_COND_BR, 0); trace_input ("bge", OP_COND_BR, 0);
op0 = SEXT9 (OP[0]); op0 = SEXT9 (OP[0]);
psw = State.sregs[5]; psw = PSW;
if ((((psw & PSW_S) != 0) ^ ((psw & PSW_OV) != 0)) == 0) if ((((psw & PSW_S) != 0) ^ ((psw & PSW_OV) != 0)) == 0)
State.pc += op0; State.pc += op0;
@ -886,7 +891,7 @@ OP_58F ()
trace_input ("bgt", OP_COND_BR, 0); trace_input ("bgt", OP_COND_BR, 0);
op0 = SEXT9 (OP[0]); op0 = SEXT9 (OP[0]);
psw = State.sregs[5]; psw = PSW;
if ((((psw & PSW_Z) != 0) if ((((psw & PSW_Z) != 0)
|| (((psw & PSW_S) != 0) ^ ((psw & PSW_OV) != 0))) == 0) || (((psw & PSW_S) != 0) ^ ((psw & PSW_OV) != 0))) == 0)
@ -947,8 +952,8 @@ OP_1C0 ()
/* Store the result and condition codes. */ /* Store the result and condition codes. */
State.regs[OP[1]] = result; State.regs[OP[1]] = result;
State.sregs[5] &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV); PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
State.sregs[5] |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0) PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
| (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)); | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
trace_output (OP_REG_REG); trace_output (OP_REG_REG);
} }
@ -977,8 +982,8 @@ OP_240 ()
/* Store the result and condition codes. */ /* Store the result and condition codes. */
State.regs[OP[1]] = result; State.regs[OP[1]] = result;
State.sregs[5] &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV); PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
State.sregs[5] |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0) PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
| (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)); | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
trace_output (OP_IMM_REG); trace_output (OP_IMM_REG);
} }
@ -1007,8 +1012,8 @@ OP_600 ()
/* Store the result and condition codes. */ /* Store the result and condition codes. */
State.regs[OP[2]] = result; State.regs[OP[2]] = result;
State.sregs[5] &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV); PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
State.sregs[5] |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0) PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
| (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)); | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
trace_output (OP_IMM_REG_REG); trace_output (OP_IMM_REG_REG);
} }
@ -1034,8 +1039,8 @@ OP_1A0 ()
/* Store the result and condition codes. */ /* Store the result and condition codes. */
State.regs[OP[1]] = result; State.regs[OP[1]] = result;
State.sregs[5] &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV); PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
State.sregs[5] |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0) PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
| (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)); | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
trace_output (OP_REG_REG); trace_output (OP_REG_REG);
} }
@ -1061,8 +1066,8 @@ OP_180 ()
/* Store the result and condition codes. */ /* Store the result and condition codes. */
State.regs[OP[1]] = result; State.regs[OP[1]] = result;
State.sregs[5] &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV); PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
State.sregs[5] |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0) PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
| (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)); | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
trace_output (OP_REG_REG); trace_output (OP_REG_REG);
} }
@ -1137,8 +1142,8 @@ OP_40 ()
/* Store the result and condition codes. */ /* Store the result and condition codes. */
State.regs[OP[1]] = result; State.regs[OP[1]] = result;
State.sregs[5] &= ~(PSW_Z | PSW_S | PSW_OV); PSW &= ~(PSW_Z | PSW_S | PSW_OV);
State.sregs[5] |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0) PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
| (ov ? PSW_OV : 0)); | (ov ? PSW_OV : 0));
trace_output (OP_REG_REG); trace_output (OP_REG_REG);
} }
@ -1163,8 +1168,8 @@ OP_1E0 ()
&& (op1 & 0x80000000) != (result & 0x80000000)); && (op1 & 0x80000000) != (result & 0x80000000));
/* Set condition codes. */ /* Set condition codes. */
State.sregs[5] &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV); PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
State.sregs[5] |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0) PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
| (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)); | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
trace_output (OP_REG_REG_CMP); trace_output (OP_REG_REG_CMP);
} }
@ -1191,8 +1196,8 @@ OP_260 ()
&& (op1 & 0x80000000) != (result & 0x80000000)); && (op1 & 0x80000000) != (result & 0x80000000));
/* Set condition codes. */ /* Set condition codes. */
State.sregs[5] &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV); PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
State.sregs[5] |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0) PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
| (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)); | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
trace_output (OP_IMM_REG_CMP); trace_output (OP_IMM_REG_CMP);
} }
@ -1207,7 +1212,7 @@ OP_7E0 ()
trace_input ("setf", OP_EX1, 0); trace_input ("setf", OP_EX1, 0);
op0 = OP[0] & 0xf; op0 = OP[0] & 0xf;
psw = State.sregs[5]; psw = PSW;
switch (op0) switch (op0)
{ {
@ -1289,8 +1294,8 @@ OP_C0 ()
/* Store the result and condition codes. */ /* Store the result and condition codes. */
State.regs[OP[1]] = result; State.regs[OP[1]] = result;
State.sregs[5] &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV); PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
State.sregs[5] |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0) PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
| (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0) | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)
| (sat ? PSW_SAT : 0)); | (sat ? PSW_SAT : 0));
@ -1328,8 +1333,8 @@ OP_220 ()
/* Store the result and condition codes. */ /* Store the result and condition codes. */
State.regs[OP[1]] = result; State.regs[OP[1]] = result;
State.sregs[5] &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV); PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
State.sregs[5] |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0) PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
| (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0) | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)
| (sat ? PSW_SAT : 0)); | (sat ? PSW_SAT : 0));
@ -1364,8 +1369,8 @@ OP_A0 ()
/* Store the result and condition codes. */ /* Store the result and condition codes. */
State.regs[OP[1]] = result; State.regs[OP[1]] = result;
State.sregs[5] &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV); PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
State.sregs[5] |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0) PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
| (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0) | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)
| (sat ? PSW_SAT : 0)); | (sat ? PSW_SAT : 0));
@ -1402,8 +1407,8 @@ OP_660 ()
/* Store the result and condition codes. */ /* Store the result and condition codes. */
State.regs[OP[1]] = result; State.regs[OP[1]] = result;
State.sregs[5] &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV); PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
State.sregs[5] |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0) PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
| (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0) | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)
| (sat ? PSW_SAT : 0)); | (sat ? PSW_SAT : 0));
@ -1438,8 +1443,8 @@ OP_80 ()
/* Store the result and condition codes. */ /* Store the result and condition codes. */
State.regs[OP[1]] = result; State.regs[OP[1]] = result;
State.sregs[5] &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV); PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
State.sregs[5] |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0) PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
| (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0) | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0)
| (sat ? PSW_SAT : 0)); | (sat ? PSW_SAT : 0));
@ -1469,8 +1474,8 @@ OP_160 ()
s = (result & 0x80000000); s = (result & 0x80000000);
/* Store the condition codes. */ /* Store the condition codes. */
State.sregs[5] &= ~(PSW_Z | PSW_S | PSW_OV); PSW &= ~(PSW_Z | PSW_S | PSW_OV);
State.sregs[5] |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)); PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
trace_output (OP_REG_REG_CMP); trace_output (OP_REG_REG_CMP);
} }
@ -1535,8 +1540,8 @@ OP_2A0 ()
/* Store the result and condition codes. */ /* Store the result and condition codes. */
State.regs[OP[1]] = result; State.regs[OP[1]] = result;
State.sregs[5] &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY); PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
State.sregs[5] |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0) PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
| (cy ? PSW_CY : 0)); | (cy ? PSW_CY : 0));
trace_output (OP_IMM_REG); trace_output (OP_IMM_REG);
} }
@ -1559,8 +1564,8 @@ OP_A007E0 ()
/* Store the result and condition codes. */ /* Store the result and condition codes. */
State.regs[OP[1]] = result; State.regs[OP[1]] = result;
State.sregs[5] &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY); PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
State.sregs[5] |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0) PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
| (cy ? PSW_CY : 0)); | (cy ? PSW_CY : 0));
trace_output (OP_REG_REG); trace_output (OP_REG_REG);
} }
@ -1583,8 +1588,8 @@ OP_2C0 ()
/* Store the result and condition codes. */ /* Store the result and condition codes. */
State.regs[OP[1]] = result; State.regs[OP[1]] = result;
State.sregs[5] &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY); PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
State.sregs[5] |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0) PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
| (cy ? PSW_CY : 0)); | (cy ? PSW_CY : 0));
trace_output (OP_IMM_REG); trace_output (OP_IMM_REG);
} }
@ -1607,8 +1612,8 @@ OP_C007E0 ()
/* Store the result and condition codes. */ /* Store the result and condition codes. */
State.regs[OP[1]] = result; State.regs[OP[1]] = result;
State.sregs[5] &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY); PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
State.sregs[5] |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0) PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
| (cy ? PSW_CY : 0)); | (cy ? PSW_CY : 0));
trace_output (OP_REG_REG); trace_output (OP_REG_REG);
} }
@ -1631,8 +1636,8 @@ OP_280 ()
/* Store the result and condition codes. */ /* Store the result and condition codes. */
State.regs[OP[1]] = result; State.regs[OP[1]] = result;
State.sregs[5] &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY); PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
State.sregs[5] |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0) PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
| (cy ? PSW_CY : 0)); | (cy ? PSW_CY : 0));
trace_output (OP_IMM_REG); trace_output (OP_IMM_REG);
} }
@ -1655,8 +1660,8 @@ OP_8007E0 ()
/* Store the result and condition codes. */ /* Store the result and condition codes. */
State.regs[OP[1]] = result; State.regs[OP[1]] = result;
State.sregs[5] &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY); PSW &= ~(PSW_Z | PSW_S | PSW_OV | PSW_CY);
State.sregs[5] |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0) PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
| (cy ? PSW_CY : 0)); | (cy ? PSW_CY : 0));
trace_output (OP_REG_REG); trace_output (OP_REG_REG);
} }
@ -1680,8 +1685,8 @@ OP_100 ()
/* Store the result and condition codes. */ /* Store the result and condition codes. */
State.regs[OP[1]] = result; State.regs[OP[1]] = result;
State.sregs[5] &= ~(PSW_Z | PSW_S | PSW_OV); PSW &= ~(PSW_Z | PSW_S | PSW_OV);
State.sregs[5] |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)); PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
trace_output (OP_REG_REG); trace_output (OP_REG_REG);
} }
@ -1702,8 +1707,8 @@ OP_680 ()
/* Store the result and condition codes. */ /* Store the result and condition codes. */
State.regs[OP[2]] = result; State.regs[OP[2]] = result;
State.sregs[5] &= ~(PSW_Z | PSW_S | PSW_OV); PSW &= ~(PSW_Z | PSW_S | PSW_OV);
State.sregs[5] |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)); PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
trace_output (OP_UIMM_REG_REG); trace_output (OP_UIMM_REG_REG);
} }
@ -1726,8 +1731,8 @@ OP_140 ()
/* Store the result and condition codes. */ /* Store the result and condition codes. */
State.regs[OP[1]] = result; State.regs[OP[1]] = result;
State.sregs[5] &= ~(PSW_Z | PSW_S | PSW_OV); PSW &= ~(PSW_Z | PSW_S | PSW_OV);
State.sregs[5] |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)); PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
trace_output (OP_REG_REG); trace_output (OP_REG_REG);
} }
@ -1747,8 +1752,8 @@ OP_6C0 ()
/* Store the result and condition codes. */ /* Store the result and condition codes. */
State.regs[OP[2]] = result; State.regs[OP[2]] = result;
State.sregs[5] &= ~(PSW_Z | PSW_S | PSW_OV); PSW &= ~(PSW_Z | PSW_S | PSW_OV);
State.sregs[5] |= (z ? PSW_Z : 0); PSW |= (z ? PSW_Z : 0);
trace_output (OP_UIMM_REG_REG); trace_output (OP_UIMM_REG_REG);
} }
@ -1771,8 +1776,8 @@ OP_120 ()
/* Store the result and condition codes. */ /* Store the result and condition codes. */
State.regs[OP[1]] = result; State.regs[OP[1]] = result;
State.sregs[5] &= ~(PSW_Z | PSW_S | PSW_OV); PSW &= ~(PSW_Z | PSW_S | PSW_OV);
State.sregs[5] |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)); PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
trace_output (OP_REG_REG); trace_output (OP_REG_REG);
} }
@ -1793,8 +1798,8 @@ OP_6A0 ()
/* Store the result and condition codes. */ /* Store the result and condition codes. */
State.regs[OP[2]] = result; State.regs[OP[2]] = result;
State.sregs[5] &= ~(PSW_Z | PSW_S | PSW_OV); PSW &= ~(PSW_Z | PSW_S | PSW_OV);
State.sregs[5] |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)); PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
trace_output (OP_UIMM_REG_REG); trace_output (OP_UIMM_REG_REG);
} }
@ -1815,8 +1820,8 @@ OP_20 ()
/* Store the result and condition codes. */ /* Store the result and condition codes. */
State.regs[OP[1]] = result; State.regs[OP[1]] = result;
State.sregs[5] &= ~(PSW_Z | PSW_S | PSW_OV); PSW &= ~(PSW_Z | PSW_S | PSW_OV);
State.sregs[5] |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)); PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0));
trace_output (OP_REG_REG_MOVE); trace_output (OP_REG_REG_MOVE);
} }
@ -1833,9 +1838,9 @@ OP_7C0 ()
temp = SEXT16 (OP[2]); temp = SEXT16 (OP[2]);
op2 = temp; op2 = temp;
temp = load_mem (op0 + op2, 1); temp = load_mem (op0 + op2, 1);
State.sregs[5] &= ~PSW_Z; PSW &= ~PSW_Z;
if ((temp & (1 << op1)) == 0) if ((temp & (1 << op1)) == 0)
State.sregs[5] |= PSW_Z; PSW |= PSW_Z;
temp |= (1 << op1); temp |= (1 << op1);
store_mem (op0 + op2, 1, temp); store_mem (op0 + op2, 1, temp);
trace_output (OP_BIT); trace_output (OP_BIT);
@ -1854,9 +1859,9 @@ OP_47C0 ()
temp = SEXT16 (OP[2]); temp = SEXT16 (OP[2]);
op2 = temp; op2 = temp;
temp = load_mem (op0 + op2, 1); temp = load_mem (op0 + op2, 1);
State.sregs[5] &= ~PSW_Z; PSW &= ~PSW_Z;
if ((temp & (1 << op1)) == 0) if ((temp & (1 << op1)) == 0)
State.sregs[5] |= PSW_Z; PSW |= PSW_Z;
temp ^= (1 << op1); temp ^= (1 << op1);
store_mem (op0 + op2, 1, temp); store_mem (op0 + op2, 1, temp);
trace_output (OP_BIT); trace_output (OP_BIT);
@ -1875,9 +1880,9 @@ OP_87C0 ()
temp = SEXT16 (OP[2]); temp = SEXT16 (OP[2]);
op2 = temp; op2 = temp;
temp = load_mem (op0 + op2, 1); temp = load_mem (op0 + op2, 1);
State.sregs[5] &= ~PSW_Z; PSW &= ~PSW_Z;
if ((temp & (1 << op1)) == 0) if ((temp & (1 << op1)) == 0)
State.sregs[5] |= PSW_Z; PSW |= PSW_Z;
temp &= ~(1 << op1); temp &= ~(1 << op1);
store_mem (op0 + op2, 1, temp); store_mem (op0 + op2, 1, temp);
trace_output (OP_BIT); trace_output (OP_BIT);
@ -1896,9 +1901,9 @@ OP_C7C0 ()
temp = SEXT16 (OP[2]); temp = SEXT16 (OP[2]);
op2 = temp; op2 = temp;
temp = load_mem (op0 + op2, 1); temp = load_mem (op0 + op2, 1);
State.sregs[5] &= ~PSW_Z; PSW &= ~PSW_Z;
if ((temp & (1 << op1)) == 0) if ((temp & (1 << op1)) == 0)
State.sregs[5] |= PSW_Z; PSW |= PSW_Z;
trace_output (OP_BIT); trace_output (OP_BIT);
} }
@ -1915,7 +1920,7 @@ void
OP_16007E0 () OP_16007E0 ()
{ {
trace_input ("di", OP_NONE, 0); trace_input ("di", OP_NONE, 0);
State.sregs[5] |= PSW_ID; PSW |= PSW_ID;
trace_output (OP_NONE); trace_output (OP_NONE);
} }
@ -1924,39 +1929,41 @@ void
OP_16087E0 () OP_16087E0 ()
{ {
trace_input ("ei", OP_NONE, 0); trace_input ("ei", OP_NONE, 0);
State.sregs[5] &= ~PSW_ID; PSW &= ~PSW_ID;
trace_output (OP_NONE); trace_output (OP_NONE);
} }
/* halt, not supported */ /* halt */
void void
OP_12007E0 () OP_12007E0 ()
{ {
trace_input ("halt", OP_NONE, 0); trace_input ("halt", OP_NONE, 0);
/* FIXME this should put processor into a mode where NMI still handled */
State.exception = SIGQUIT; State.exception = SIGQUIT;
trace_output (OP_NONE); trace_output (OP_NONE);
} }
/* reti, not supported */ /* reti */
void void
OP_14007E0 () OP_14007E0 ()
{ {
trace_input ("reti", OP_NONE, 0); trace_input ("reti", OP_NONE, 0);
trace_output (OP_NONE); trace_output (OP_NONE);
if ((State.sregs[5] & (PSW_NP | PSW_EP)) == PSW_NP) /* Restore for NMI if only NP on, otherwise is interrupt or exception. */
{ /* Only NP is on */ if ((PSW & (PSW_NP | PSW_EP)) == PSW_NP)
PC = State.sregs[2] - 4; /* FEPC */ {
State.sregs[5] = State.sregs[3]; /* FEPSW */ PC = FEPC - 4;
PSW = FEPSW;
} }
else else
{ {
PC = State.sregs[0] - 4; /* EIPC */ PC = EIPC - 4;
State.sregs[5] = State.sregs[1]; /* EIPSW */ PSW = EIPSW;
} }
} }
/* trap, not supportd */ /* trap */
void void
OP_10007E0 () OP_10007E0 ()
{ {
@ -2048,10 +2055,7 @@ OP_10007E0 ()
case SYS_exit: case SYS_exit:
/* EXIT - caller can look in PARM1 to work out the /* EXIT - caller can look in PARM1 to work out the
reason */ reason */
if (PARM1 == 0xdead || PARM1 == 0x1) State.exception = SIG_V850_EXIT;
State.exception = SIGABRT;
else
State.exception = SIGQUIT;
break; break;
case SYS_stat: /* added at hmsi */ case SYS_stat: /* added at hmsi */
@ -2086,7 +2090,11 @@ OP_10007E0 ()
RETVAL = chmod (MEMPTR (PARM1), PARM2); RETVAL = chmod (MEMPTR (PARM1), PARM2);
break; break;
case SYS_time: case SYS_time:
RETVAL = time (MEMPTR (PARM1)); {
time_t now;
RETVAL = time (&now);
store_mem (PARM1, 4, now);
}
break; break;
case SYS_times: case SYS_times:
{ {
@ -2122,11 +2130,13 @@ OP_10007E0 ()
} }
else else
{ /* Trap 0 -> 30 */ { /* Trap 0 -> 30 */
State.sregs[0] = PC + 4; /* EIPC */ EIPC = PC + 4;
State.sregs[1] = State.sregs[5]; /* EIPSW */ EIPSW = PSW;
State.sregs[4] &= 0xffff0000; /* Mask out EICC */ /* Mask out EICC */
State.sregs[4] |= 0x40 + OP[0]; /* EICC */ ECR &= 0xffff0000;
State.sregs[5] |= PSW_EP | PSW_ID; /* Now doing exception processing */ ECR |= 0x40 + OP[0];
/* Flag that we are now doing exception processing. */
PSW |= PSW_EP | PSW_ID;
PC = ((OP[0] < 0x10) ? 0x40 : 0x50) - 4; PC = ((OP[0] < 0x10) ? 0x40 : 0x50) - 4;
} }
} }
@ -2143,7 +2153,7 @@ OP_2007E0 ()
trace_output (OP_LDSR); trace_output (OP_LDSR);
} }
/* stsr, not supported */ /* stsr */
void void
OP_4007E0 () OP_4007E0 ()
{ {