Catch and ignore SWIs of -1, they can be caused by an interrupted system
authorNick Clifton <nickc@redhat.com>
Thu, 15 Aug 2002 14:28:55 +0000 (14:28 +0000)
committerNick Clifton <nickc@redhat.com>
Thu, 15 Aug 2002 14:28:55 +0000 (14:28 +0000)
call being resumed by GDB.

sim/arm/ChangeLog
sim/arm/armos.c

index acd66ad..9ce404e 100644 (file)
@@ -1,3 +1,8 @@
+2002-08-15  Nick Clifton  <nickc@redhat.com>
+
+       * armos.c (ARMul_OSHandleSWI): Catch and ignore SWIs of -1, they
+       can be caused by an interrupted system call being resumed by GDB.
+
 2002-07-05  Nick Clifton  <nickc@cambridge.redhat.com>
 
        * armemu.c (ARMul_Emulate32): Add more tests for valid MIA, MIAPH
index ccf9a57..7c0360c 100644 (file)
@@ -553,6 +553,13 @@ ARMul_OSHandleSWI (ARMul_State * state, ARMword number)
          /* R0 is a reason code.  */
          switch (state->Reg[0])
            {
+           case -1:
+             /* This can happen when a SWI is interrupted (eg receiving a
+                ctrl-C whilst processing SWIRead()).  The SWI will complete
+                returning -1 in r0 to the caller.  If GDB is then used to
+                resume the system call the reason code will now be -1.  */
+             return FALSE;
+         
              /* Unimplemented reason codes.  */
            case AngelSWI_Reason_ReadC:
            case AngelSWI_Reason_IsTTY:
@@ -685,6 +692,13 @@ ARMul_OSHandleSWI (ARMul_State * state, ARMword number)
       /* These are used by the FPE code.  */
       break;
       
+    case -1:
+      /* This can happen when a SWI is interrupted (eg receiving a
+        ctrl-C whilst processing SWIRead()).  The SWI will complete
+        returning -1 in r0 to the caller.  If GDB is then used to
+        resume the system call the reason code will now be -1.  */
+      return FALSE;
+         
     case 0x180001: /* RedBoot's Syscall SWI in ARM mode.  */
       if (swi_mask & SWI_MASK_REDBOOT)
        {