sim: cr16: improve trap handling

This commit is contained in:
Mike Frysinger 2012-08-30 06:10:28 +00:00
parent 4881a75b8b
commit 5a06d7c470
4 changed files with 31 additions and 2 deletions

View File

@ -1,6 +1,8 @@
2012-08-28 Kaushik Phatak <kaushik.phatak@kpitcummins.com>
* cr16_sim.h: Add defines for TRAP handling.
* interp.c (sim_complete_command): New stub function.
* simops.c: Breakpoint handling code.
2012-06-17 Mike Frysinger <vapier@gentoo.org>

View File

@ -472,3 +472,9 @@ extern void write_longlong PARAMS ((uint8 *addr, int64 data));
PSR is masked for zero bits. */
extern creg_t move_to_cr (int cr, creg_t mask, creg_t val, int psw_hw_p);
#ifndef SIGTRAP
#define SIGTRAP 5
#endif
/* Special purpose trap */
#define TRAP_BREAKPOINT 8

View File

@ -1192,7 +1192,11 @@ sim_resume (SIM_DESC sd, int step, int siggnal)
iaddr = imem_addr ((uint32)PC);
if (iaddr == State.mem.fault)
{
#ifdef SIGBUS
State.exception = SIGBUS;
#else
State.exception = SIGSEGV;
#endif
break;
}

View File

@ -5059,6 +5059,8 @@ OP_14C_14 ()
void
OP_C_C ()
{
uint32 tmp;
uint16 a;
trace_input ("excp", OP_CONSTANT4, OP_VOID, OP_VOID);
switch (OP[0])
{
@ -5465,9 +5467,24 @@ OP_C_C ()
#endif
default:
cr16_callback->error (cr16_callback, "Unknown syscall %d", FUNC);
a = OP[0];
switch (a)
{
case TRAP_BREAKPOINT:
State.exception = SIGTRAP;
tmp = (PC);
JMP(tmp);
trace_output_void ();
break;
case SIGTRAP: /* supervisor call ? */
State.exception = SIG_CR16_EXIT;
trace_output_void ();
break;
default:
cr16_callback->error (cr16_callback, "Unknown syscall %d", FUNC);
break;
}
}
if ((uint16) result == (uint16) -1)
RETERR (cr16_callback->get_errno(cr16_callback));
else