From 5a06d7c470e4dfd5f66ba9b6a93d9a77d4910e07 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Thu, 30 Aug 2012 06:10:28 +0000 Subject: [PATCH] sim: cr16: improve trap handling --- sim/cr16/ChangeLog | 2 ++ sim/cr16/cr16_sim.h | 6 ++++++ sim/cr16/interp.c | 4 ++++ sim/cr16/simops.c | 21 +++++++++++++++++++-- 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/sim/cr16/ChangeLog b/sim/cr16/ChangeLog index 094d54c..f0c62c3 100644 --- a/sim/cr16/ChangeLog +++ b/sim/cr16/ChangeLog @@ -1,6 +1,8 @@ 2012-08-28 Kaushik Phatak + * 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 diff --git a/sim/cr16/cr16_sim.h b/sim/cr16/cr16_sim.h index c7783ba..7252b14 100644 --- a/sim/cr16/cr16_sim.h +++ b/sim/cr16/cr16_sim.h @@ -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 diff --git a/sim/cr16/interp.c b/sim/cr16/interp.c index 1207906..36f848e 100644 --- a/sim/cr16/interp.c +++ b/sim/cr16/interp.c @@ -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; } diff --git a/sim/cr16/simops.c b/sim/cr16/simops.c index f8fee8a..2e5e9eb 100644 --- a/sim/cr16/simops.c +++ b/sim/cr16/simops.c @@ -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 -- 2.7.4