Joel Sherrill (joel@OARcorp.com)
[deliverable/binutils-gdb.git] / gdb / symm-nat.c
index e63ef97d0d7d92241790f55dfbadb0623ae4d8c6..56e1c674dc4be24ffa5f1c654d5eb44936987a4b 100644 (file)
@@ -15,7 +15,7 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 /* FIXME, some 387-specific items of use taken from i387-tdep.c -- ought to be
    merged back in. */
@@ -36,8 +36,14 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include <sys/proc.h>
 #include <sys/dir.h>
 #include <sys/ioctl.h>
-#include <sys/stat.h>
+#include "gdb_stat.h"
+#ifdef _SEQUENT_
 #include <sys/ptrace.h>
+#else
+/* Dynix has only machine/ptrace.h, which is already included by sys/user.h  */
+/* Dynix has no mptrace call */
+#define mptrace ptrace
+#endif
 #include "gdbcore.h"
 #include <fcntl.h>
 #include <sgtty.h>
@@ -50,9 +56,15 @@ store_inferior_registers(regno)
 int regno;
 {
   struct pt_regset regs;
-  int reg_tmp, i;
-  extern char registers[];
-  
+  int i;
+
+  /* FIXME: Fetching the registers is a kludge to initialize all elements
+     in the fpu and fpa status. This works for normal debugging, but
+     might cause problems when calling functions in the inferior.
+     At least fpu_control and fpa_pcr (probably more) should be added 
+     to the registers array to solve this properly.  */
+  mptrace (XPT_RREGS, inferior_pid, (PTRACE_ARG3_TYPE) &regs, 0);
+
   regs.pr_eax = *(int *)&registers[REGISTER_BYTE(0)];
   regs.pr_ebx = *(int *)&registers[REGISTER_BYTE(5)];
   regs.pr_ecx = *(int *)&registers[REGISTER_BYTE(2)];
@@ -68,6 +80,14 @@ int regno;
       regs.pr_fpa.fpa_regs[i] =
        *(int *)&registers[REGISTER_BYTE(FP1_REGNUM+i)];
     }
+  memcpy (regs.pr_fpu.fpu_stack[0], &registers[REGISTER_BYTE(ST0_REGNUM)], 10);
+  memcpy (regs.pr_fpu.fpu_stack[1], &registers[REGISTER_BYTE(ST1_REGNUM)], 10);
+  memcpy (regs.pr_fpu.fpu_stack[2], &registers[REGISTER_BYTE(ST2_REGNUM)], 10);
+  memcpy (regs.pr_fpu.fpu_stack[3], &registers[REGISTER_BYTE(ST3_REGNUM)], 10);
+  memcpy (regs.pr_fpu.fpu_stack[4], &registers[REGISTER_BYTE(ST4_REGNUM)], 10);
+  memcpy (regs.pr_fpu.fpu_stack[5], &registers[REGISTER_BYTE(ST5_REGNUM)], 10);
+  memcpy (regs.pr_fpu.fpu_stack[6], &registers[REGISTER_BYTE(ST6_REGNUM)], 10);
+  memcpy (regs.pr_fpu.fpu_stack[7], &registers[REGISTER_BYTE(ST7_REGNUM)], 10);
   mptrace (XPT_WREGS, inferior_pid, (PTRACE_ARG3_TYPE) &regs, 0);
 }
 
@@ -77,11 +97,10 @@ fetch_inferior_registers (regno)
 {
   int i;
   struct pt_regset regs;
-  extern char registers[];
 
   registers_fetched ();
 
-  mptrace (XPT_RREGS, (pid), (regaddr), 0);
+  mptrace (XPT_RREGS, inferior_pid, (PTRACE_ARG3_TYPE) &regs, 0);
   *(int *)&registers[REGISTER_BYTE(EAX_REGNUM)] = regs.pr_eax;
   *(int *)&registers[REGISTER_BYTE(EBX_REGNUM)] = regs.pr_ebx;
   *(int *)&registers[REGISTER_BYTE(ECX_REGNUM)] = regs.pr_ecx;
@@ -216,9 +235,8 @@ unsigned int pcr;
        the OS knows what it is doing.  */
 #ifdef FPA_PCR_CC_C1
     if (pcr_tmp & FPA_PCR_CC_C1) printf_unfiltered(" C1");
-#endif
-#ifdef FPA_PCR_CC_C0
-    if (pcr_tmp & FPA_PCR_CC_C1) printf_unfiltered(" C0");
+#else
+    if (pcr_tmp & FPA_PCR_CC_C0) printf_unfiltered(" C0");
 #endif
 
     switch (pcr_tmp)
@@ -228,8 +246,7 @@ unsigned int pcr;
        break;
 #ifdef FPA_PCR_CC_C1
       case FPA_PCR_CC_C1:
-#endif
-#ifdef FPA_PCR_CC_C0
+#else
       case FPA_PCR_CC_C0:
 #endif
        printf_unfiltered(" (Less than)");
@@ -383,9 +400,8 @@ child_wait(pid, status)
 #endif
 
   do {
-    if (attach_flag)
-      set_sigint_trap();       /* Causes SIGINT to be passed on to the
-                                  attached process. */
+    set_sigint_trap(); /* Causes SIGINT to be passed on to the
+                          attached process. */
     save_errno = errno;
 
     got_sigchld = 0;
@@ -396,8 +412,7 @@ child_wait(pid, status)
            sigsuspend(&set);
     }
     
-    if (attach_flag)
-      clear_sigint_trap();
+    clear_sigint_trap();
 
     rv = mptrace(XPT_STOPSTAT, 0, (char *)&pt, 0);
     if (-1 == rv) {
@@ -605,7 +620,7 @@ void
 child_resume (pid, step, signal)
      int pid;
      int step;
-     int signal;
+     enum target_signal signal;
 {
   errno = 0;
 
@@ -736,7 +751,7 @@ child_xfer_memory (memaddr, myaddr, len, write, target)
       for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE))
        {
          errno = 0;
-         ptrace (PT_WRITE_D, inferior_pid, (PTRACE_ARG3_TYPE) addr,
+         ptrace (PT_WDATA, inferior_pid, (PTRACE_ARG3_TYPE) addr,
                  buffer[i]);
          if (errno)
            {
This page took 0.025648 seconds and 4 git commands to generate.