sim: cr16: improve trap handling
authorMike Frysinger <vapier@gentoo.org>
Thu, 30 Aug 2012 06:10:28 +0000 (06:10 +0000)
committerMike Frysinger <vapier@gentoo.org>
Thu, 30 Aug 2012 06:10:28 +0000 (06:10 +0000)
sim/cr16/ChangeLog
sim/cr16/cr16_sim.h
sim/cr16/interp.c
sim/cr16/simops.c

index 094d54c..f0c62c3 100644 (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>
 
index c7783ba..7252b14 100644 (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
index 1207906..36f848e 100644 (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;
         }
  
index f8fee8a..2e5e9eb 100644 (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