* infrun.c (wait_for_inferior): When we hit a breakpoint for the
[deliverable/binutils-gdb.git] / gdb / lynx-nat.c
index 3d7c92d9eb31e99aa50b6f16dc805d054abcf6f6..1ab9cc7cc678934703198962e27f82df4c7af48c 100644 (file)
@@ -603,19 +603,13 @@ child_wait (pid, ourstatus)
     {
       int sig;
 
-      if (attach_flag)
-       set_sigint_trap();      /* Causes SIGINT to be passed on to the
+      set_sigint_trap();       /* Causes SIGINT to be passed on to the
                                   attached process. */
       pid = wait (&status);
-#ifdef SPARC
-/* Swap halves of status so that the rest of GDB can understand it */
-      status = (status << 16) | ((unsigned)status >> 16);
-#endif
 
       save_errno = errno;
 
-      if (attach_flag)
-       clear_sigint_trap();
+      clear_sigint_trap();
 
       if (pid == -1)
        {
@@ -651,20 +645,47 @@ child_wait (pid, ourstatus)
        {
          int realsig;
 
-         realsig = ptrace (PTRACE_GETTRACESIG, pid, 0);
+         realsig = ptrace (PTRACE_GETTRACESIG, pid, (PTRACE_ARG3_TYPE)0, 0);
 
          if (realsig == SIGNEWTHREAD)
            {
-             /* Simply ignore new thread notification, as we can't do anything
-                useful with such threads.  All ptrace calls at this point just
-                fail for no apparent reason.  The thread will eventually get a
-                real signal when it becomes real.  */
-             child_resume (pid, 0, TARGET_SIGNAL_0);
-             continue;
+             /* It's a new thread notification.  Nothing to do here since
+                the machine independent code in wait_for_inferior will
+                add the thread to the thread list and restart the thread
+                when pid != inferior_pid and pid is not in the thread
+                list.   We don't even want to much with realsig -- the
+                code in wait_for_inferior expects SIGTRAP.  */
+             ;
            }
+         else
+           error ("Signal for unknown thread was not SIGNEWTHREAD");
        }
 
+#ifdef SPARC
+      /* SPARC Lynx uses an byte reversed wait status; we must use the
+        host macros to access it.  These lines just a copy of
+        store_waitstatus.  We can't use CHILD_SPECIAL_WAITSTATUS
+        because target.c can't include the Lynx <sys/wait.h>.  */
+      if (WIFEXITED (status))
+       {
+         ourstatus->kind = TARGET_WAITKIND_EXITED;
+         ourstatus->value.integer = WEXITSTATUS (status);
+       }
+      else if (!WIFSTOPPED (status))
+       {
+         ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
+         ourstatus->value.sig =
+           target_signal_from_host (WTERMSIG (status));
+       }
+      else
+       {
+         ourstatus->kind = TARGET_WAITKIND_STOPPED;
+         ourstatus->value.sig =
+           target_signal_from_host (WSTOPSIG (status));
+       }
+#else
       store_waitstatus (ourstatus, status.w_status);
+#endif
 
       return pid;
     }
@@ -684,14 +705,16 @@ child_resume (pid, step, signal)
 
   errno = 0;
 
+  /* If pid == -1, then we want to step/continue all threads, else
+     we only want to step/continue a single thread.  */
   if (pid == -1)
     {
-      /* Resume all threads.  */
-
       pid = inferior_pid;
+      func = step ? PTRACE_SINGLESTEP : PTRACE_CONT;
     }
+  else
+    func = step ? PTRACE_SINGLESTEP_ONE : PTRACE_CONT_ONE;
 
-  func = step ? PTRACE_SINGLESTEP_ONE : PTRACE_CONT;
 
   /* An address of (PTRACE_ARG3_TYPE)1 tells ptrace to continue from where
      it was.  (If GDB wanted it to start some other way, we have already
@@ -746,8 +769,9 @@ fetch_core_registers (core_reg_sect, core_reg_size, which, reg_addr)
   unsigned int regno;
 
   for (regno = 0; regno < NUM_REGS; regno++)
-    supply_register (regno, core_reg_sect + offsetof (st_t, ec)
-                    + regmap[regno]);
+    if (regmap[regno] != -1)
+      supply_register (regno, core_reg_sect + offsetof (st_t, ec)
+                      + regmap[regno]);
 
 #ifdef SPARC
 /* Fetching this register causes all of the I & L regs to be read from the
This page took 0.025772 seconds and 4 git commands to generate.