Add tiny memory model GD test cases.
[deliverable/binutils-gdb.git] / gdb / go32-nat.c
index fe575d52a41fa6335a0d6fb959ec926e05458319..f3966cd534ec15e0f841e5f520a7b2bbbffd37a9 100644 (file)
@@ -1,6 +1,5 @@
 /* Native debugging support for Intel x86 running DJGPP.
 /* Native debugging support for Intel x86 running DJGPP.
-   Copyright (C) 1997, 1999-2001, 2005-2012 Free Software Foundation,
-   Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    Written by Robert Hoehne.
 
    This file is part of GDB.
    Written by Robert Hoehne.
 
    This file is part of GDB.
    GDB does not use those as of this writing, and will never need
    to.  */
 
    GDB does not use those as of this writing, and will never need
    to.  */
 
+#include "defs.h"
+
 #include <fcntl.h>
 
 #include <fcntl.h>
 
-#include "defs.h"
-#include "i386-nat.h"
+#include "x86-nat.h"
 #include "inferior.h"
 #include "inferior.h"
+#include "infrun.h"
 #include "gdbthread.h"
 #include "gdb_wait.h"
 #include "gdbcore.h"
 #include "gdbthread.h"
 #include "gdb_wait.h"
 #include "gdbcore.h"
 #include "buildsym.h"
 #include "i387-tdep.h"
 #include "i386-tdep.h"
 #include "buildsym.h"
 #include "i387-tdep.h"
 #include "i386-tdep.h"
+#include "nat/x86-cpuid.h"
 #include "value.h"
 #include "regcache.h"
 #include "value.h"
 #include "regcache.h"
-#include "gdb_string.h"
 #include "top.h"
 #include "top.h"
+#include "cli/cli-utils.h"
+#include "inf-child.h"
 
 
-#include <stdio.h>             /* might be required for __DJGPP_MINOR__ */
-#include <stdlib.h>
 #include <ctype.h>
 #include <ctype.h>
-#include <errno.h>
 #include <unistd.h>
 #include <sys/utsname.h>
 #include <io.h>
 #include <unistd.h>
 #include <sys/utsname.h>
 #include <io.h>
@@ -232,34 +232,7 @@ static int dr_ref_count[4];
 #define SOME_PID 42
 
 static int prog_has_started = 0;
 #define SOME_PID 42
 
 static int prog_has_started = 0;
-static void go32_open (char *name, int from_tty);
-static void go32_close (int quitting);
-static void go32_attach (struct target_ops *ops, char *args, int from_tty);
-static void go32_detach (struct target_ops *ops, char *args, int from_tty);
-static void go32_resume (struct target_ops *ops,
-                        ptid_t ptid, int step,
-                        enum target_signal siggnal);
-static void go32_fetch_registers (struct target_ops *ops,
-                                 struct regcache *, int regno);
-static void store_register (const struct regcache *, int regno);
-static void go32_store_registers (struct target_ops *ops,
-                                 struct regcache *, int regno);
-static void go32_prepare_to_store (struct regcache *);
-static int go32_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len,
-                            int write,
-                            struct mem_attrib *attrib,
-                            struct target_ops *target);
-static void go32_files_info (struct target_ops *target);
-static void go32_kill_inferior (struct target_ops *ops);
-static void go32_create_inferior (struct target_ops *ops, char *exec_file,
-                                 char *args, char **env, int from_tty);
 static void go32_mourn_inferior (struct target_ops *ops);
 static void go32_mourn_inferior (struct target_ops *ops);
-static int go32_can_run (void);
-
-static struct target_ops go32_ops;
-static void go32_terminal_init (void);
-static void go32_terminal_inferior (void);
-static void go32_terminal_ours (void);
 
 #define r_ofs(x) (offsetof(TSS,x))
 
 
 #define r_ofs(x) (offsetof(TSS,x))
 
@@ -309,98 +282,82 @@ regno_mapping[] =
 static struct
   {
     int go32_sig;
 static struct
   {
     int go32_sig;
-    enum target_signal gdb_sig;
+    enum gdb_signal gdb_sig;
   }
 sig_map[] =
 {
   }
 sig_map[] =
 {
-  {0, TARGET_SIGNAL_FPE},
-  {1, TARGET_SIGNAL_TRAP},
+  {0, GDB_SIGNAL_FPE},
+  {1, GDB_SIGNAL_TRAP},
   /* Exception 2 is triggered by the NMI.  DJGPP handles it as SIGILL,
      but I think SIGBUS is better, since the NMI is usually activated
      as a result of a memory parity check failure.  */
   /* Exception 2 is triggered by the NMI.  DJGPP handles it as SIGILL,
      but I think SIGBUS is better, since the NMI is usually activated
      as a result of a memory parity check failure.  */
-  {2, TARGET_SIGNAL_BUS},
-  {3, TARGET_SIGNAL_TRAP},
-  {4, TARGET_SIGNAL_FPE},
-  {5, TARGET_SIGNAL_SEGV},
-  {6, TARGET_SIGNAL_ILL},
-  {7, TARGET_SIGNAL_EMT},      /* no-coprocessor exception */
-  {8, TARGET_SIGNAL_SEGV},
-  {9, TARGET_SIGNAL_SEGV},
-  {10, TARGET_SIGNAL_BUS},
-  {11, TARGET_SIGNAL_SEGV},
-  {12, TARGET_SIGNAL_SEGV},
-  {13, TARGET_SIGNAL_SEGV},
-  {14, TARGET_SIGNAL_SEGV},
-  {16, TARGET_SIGNAL_FPE},
-  {17, TARGET_SIGNAL_BUS},
-  {31, TARGET_SIGNAL_ILL},
-  {0x1b, TARGET_SIGNAL_INT},
-  {0x75, TARGET_SIGNAL_FPE},
-  {0x78, TARGET_SIGNAL_ALRM},
-  {0x79, TARGET_SIGNAL_INT},
-  {0x7a, TARGET_SIGNAL_QUIT},
-  {-1, TARGET_SIGNAL_LAST}
+  {2, GDB_SIGNAL_BUS},
+  {3, GDB_SIGNAL_TRAP},
+  {4, GDB_SIGNAL_FPE},
+  {5, GDB_SIGNAL_SEGV},
+  {6, GDB_SIGNAL_ILL},
+  {7, GDB_SIGNAL_EMT}, /* no-coprocessor exception */
+  {8, GDB_SIGNAL_SEGV},
+  {9, GDB_SIGNAL_SEGV},
+  {10, GDB_SIGNAL_BUS},
+  {11, GDB_SIGNAL_SEGV},
+  {12, GDB_SIGNAL_SEGV},
+  {13, GDB_SIGNAL_SEGV},
+  {14, GDB_SIGNAL_SEGV},
+  {16, GDB_SIGNAL_FPE},
+  {17, GDB_SIGNAL_BUS},
+  {31, GDB_SIGNAL_ILL},
+  {0x1b, GDB_SIGNAL_INT},
+  {0x75, GDB_SIGNAL_FPE},
+  {0x78, GDB_SIGNAL_ALRM},
+  {0x79, GDB_SIGNAL_INT},
+  {0x7a, GDB_SIGNAL_QUIT},
+  {-1, GDB_SIGNAL_LAST}
 };
 
 static struct {
 };
 
 static struct {
-  enum target_signal gdb_sig;
+  enum gdb_signal gdb_sig;
   int djgpp_excepno;
 } excepn_map[] = {
   int djgpp_excepno;
 } excepn_map[] = {
-  {TARGET_SIGNAL_0, -1},
-  {TARGET_SIGNAL_ILL, 6},      /* Invalid Opcode */
-  {TARGET_SIGNAL_EMT, 7},      /* triggers SIGNOFP */
-  {TARGET_SIGNAL_SEGV, 13},    /* GPF */
-  {TARGET_SIGNAL_BUS, 17},     /* Alignment Check */
+  {GDB_SIGNAL_0, -1},
+  {GDB_SIGNAL_ILL, 6}, /* Invalid Opcode */
+  {GDB_SIGNAL_EMT, 7}, /* triggers SIGNOFP */
+  {GDB_SIGNAL_SEGV, 13},       /* GPF */
+  {GDB_SIGNAL_BUS, 17},        /* Alignment Check */
   /* The rest are fake exceptions, see dpmiexcp.c in djlsr*.zip for
      details.  */
   /* The rest are fake exceptions, see dpmiexcp.c in djlsr*.zip for
      details.  */
-  {TARGET_SIGNAL_TERM, 0x1b},  /* triggers Ctrl-Break type of SIGINT */
-  {TARGET_SIGNAL_FPE, 0x75},
-  {TARGET_SIGNAL_INT, 0x79},
-  {TARGET_SIGNAL_QUIT, 0x7a},
-  {TARGET_SIGNAL_ALRM, 0x78},  /* triggers SIGTIMR */
-  {TARGET_SIGNAL_PROF, 0x78},
-  {TARGET_SIGNAL_LAST, -1}
+  {GDB_SIGNAL_TERM, 0x1b},     /* triggers Ctrl-Break type of SIGINT */
+  {GDB_SIGNAL_FPE, 0x75},
+  {GDB_SIGNAL_INT, 0x79},
+  {GDB_SIGNAL_QUIT, 0x7a},
+  {GDB_SIGNAL_ALRM, 0x78},     /* triggers SIGTIMR */
+  {GDB_SIGNAL_PROF, 0x78},
+  {GDB_SIGNAL_LAST, -1}
 };
 
 static void
 };
 
 static void
-go32_open (char *name, int from_tty)
-{
-  printf_unfiltered ("Done.  Use the \"run\" command to run the program.\n");
-}
-
-static void
-go32_close (int quitting)
-{
-}
-
-static void
-go32_attach (struct target_ops *ops, char *args, int from_tty)
+go32_attach (struct target_ops *ops, const char *args, int from_tty)
 {
   error (_("\
 You cannot attach to a running program on this platform.\n\
 Use the `run' command to run DJGPP programs."));
 }
 
 {
   error (_("\
 You cannot attach to a running program on this platform.\n\
 Use the `run' command to run DJGPP programs."));
 }
 
-static void
-go32_detach (struct target_ops *ops, char *args, int from_tty)
-{
-}
-
 static int resume_is_step;
 static int resume_signal = -1;
 
 static void
 go32_resume (struct target_ops *ops,
 static int resume_is_step;
 static int resume_signal = -1;
 
 static void
 go32_resume (struct target_ops *ops,
-            ptid_t ptid, int step, enum target_signal siggnal)
+            ptid_t ptid, int step, enum gdb_signal siggnal)
 {
   int i;
 
   resume_is_step = step;
 
 {
   int i;
 
   resume_is_step = step;
 
-  if (siggnal != TARGET_SIGNAL_0 && siggnal != TARGET_SIGNAL_TRAP)
+  if (siggnal != GDB_SIGNAL_0 && siggnal != GDB_SIGNAL_TRAP)
   {
     for (i = 0, resume_signal = -1;
   {
     for (i = 0, resume_signal = -1;
-        excepn_map[i].gdb_sig != TARGET_SIGNAL_LAST; i++)
+        excepn_map[i].gdb_sig != GDB_SIGNAL_LAST; i++)
       if (excepn_map[i].gdb_sig == siggnal)
       {
        resume_signal = excepn_map[i].djgpp_excepno;
       if (excepn_map[i].gdb_sig == siggnal)
       {
        resume_signal = excepn_map[i].djgpp_excepno;
@@ -408,7 +365,7 @@ go32_resume (struct target_ops *ops,
       }
     if (resume_signal == -1)
       printf_unfiltered ("Cannot deliver signal %s on this platform.\n",
       }
     if (resume_signal == -1)
       printf_unfiltered ("Cannot deliver signal %s on this platform.\n",
-                        target_signal_to_name (siggnal));
+                        gdb_signal_to_name (siggnal));
   }
 }
 
   }
 }
 
@@ -513,7 +470,7 @@ go32_wait (struct target_ops *ops,
     }
   else
     {
     }
   else
     {
-      status->value.sig = TARGET_SIGNAL_UNKNOWN;
+      status->value.sig = GDB_SIGNAL_UNKNOWN;
       status->kind = TARGET_WAITKIND_STOPPED;
       for (i = 0; sig_map[i].go32_sig != -1; i++)
        {
       status->kind = TARGET_WAITKIND_STOPPED;
       for (i = 0; sig_map[i].go32_sig != -1; i++)
        {
@@ -521,7 +478,7 @@ go32_wait (struct target_ops *ops,
            {
 #if __DJGPP_MINOR__ < 3
              if ((status->value.sig = sig_map[i].gdb_sig) !=
            {
 #if __DJGPP_MINOR__ < 3
              if ((status->value.sig = sig_map[i].gdb_sig) !=
-                 TARGET_SIGNAL_TRAP)
+                 GDB_SIGNAL_TRAP)
                status->kind = TARGET_WAITKIND_SIGNALLED;
 #else
              status->value.sig = sig_map[i].gdb_sig;
                status->kind = TARGET_WAITKIND_SIGNALLED;
 #else
              status->value.sig = sig_map[i].gdb_sig;
@@ -595,36 +552,65 @@ go32_store_registers (struct target_ops *ops,
     }
 }
 
     }
 }
 
-static void
-go32_prepare_to_store (struct regcache *regcache)
-{
-}
+/* Const-correct version of DJGPP's write_child, which unfortunately
+   takes a non-const buffer pointer.  */
 
 static int
 
 static int
-go32_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write,
-                 struct mem_attrib *attrib, struct target_ops *target)
+my_write_child (unsigned child_addr, const void *buf, unsigned len)
 {
 {
-  if (write)
+  static void *buffer = NULL;
+  static unsigned buffer_len = 0;
+  int res;
+
+  if (buffer_len < len)
     {
     {
-      if (write_child (memaddr, myaddr, len))
-       {
-         return 0;
-       }
-      else
-       {
-         return len;
-       }
+      buffer = xrealloc (buffer, len);
+      buffer_len = len;
     }
     }
+
+  memcpy (buffer, buf, len);
+  res = write_child (child_addr, buffer, len);
+  return res;
+}
+
+/* Helper for go32_xfer_partial that handles memory transfers.
+   Arguments are like target_xfer_partial.  */
+
+static enum target_xfer_status
+go32_xfer_memory (gdb_byte *readbuf, const gdb_byte *writebuf,
+                 ULONGEST memaddr, ULONGEST len, ULONGEST *xfered_len)
+{
+  int res;
+
+  if (writebuf != NULL)
+    res = my_write_child (memaddr, writebuf, len);
   else
   else
+    res = read_child (memaddr, readbuf, len);
+
+  if (res <= 0)
+    return TARGET_XFER_E_IO;
+
+  *xfered_len = res;
+  return TARGET_XFER_OK;
+}
+
+/* Target to_xfer_partial implementation.  */
+
+static enum target_xfer_status
+go32_xfer_partial (struct target_ops *ops, enum target_object object,
+                  const char *annex, gdb_byte *readbuf,
+                  const gdb_byte *writebuf, ULONGEST offset, ULONGEST len,
+                  ULONGEST *xfered_len)
+{
+  switch (object)
     {
     {
-      if (read_child (memaddr, myaddr, len))
-       {
-         return 0;
-       }
-      else
-       {
-         return len;
-       }
+    case TARGET_OBJECT_MEMORY:
+      return go32_xfer_memory (readbuf, writebuf, offset, len, xfered_len);
+
+    default:
+      return ops->beneath->to_xfer_partial (ops->beneath, object, annex,
+                                           readbuf, writebuf, offset, len,
+                                           xfered_len);
     }
 }
 
     }
 }
 
@@ -652,6 +638,7 @@ go32_create_inferior (struct target_ops *ops, char *exec_file,
   char **env_save = environ;
   size_t cmdlen;
   struct inferior *inf;
   char **env_save = environ;
   size_t cmdlen;
   struct inferior *inf;
+  int result;
 
   /* If no exec file handed to us, get it from the exec-file command -- with
      a good, common error message if none is specified.  */
 
   /* If no exec file handed to us, get it from the exec-file command -- with
      a good, common error message if none is specified.  */
@@ -703,15 +690,14 @@ go32_create_inferior (struct target_ops *ops, char *exec_file,
 
   environ = env;
 
 
   environ = env;
 
-  if (v2loadimage (exec_file, cmdline, start_state))
-    {
-      environ = env_save;
-      printf_unfiltered ("Load failed for image %s\n", exec_file);
-      exit (1);
-    }
+  result = v2loadimage (exec_file, cmdline, start_state);
+
   environ = env_save;
   xfree (cmdline);
 
   environ = env_save;
   xfree (cmdline);
 
+  if (result != 0)
+    error (_("Load failed for image %s"), exec_file);
+
   edi_init (start_state);
 #if __DJGPP_MINOR__ < 3
   save_npx ();
   edi_init (start_state);
 #if __DJGPP_MINOR__ < 3
   save_npx ();
@@ -721,11 +707,12 @@ go32_create_inferior (struct target_ops *ops, char *exec_file,
   inf = current_inferior ();
   inferior_appeared (inf, SOME_PID);
 
   inf = current_inferior ();
   inferior_appeared (inf, SOME_PID);
 
-  push_target (&go32_ops);
+  if (!target_is_pushed (ops))
+    push_target (ops);
 
   add_thread_silent (inferior_ptid);
 
 
   add_thread_silent (inferior_ptid);
 
-  clear_proceed_status ();
+  clear_proceed_status (0);
   insert_breakpoints ();
   prog_has_started = 1;
 }
   insert_breakpoints ();
   prog_has_started = 1;
 }
@@ -748,21 +735,15 @@ go32_mourn_inferior (struct target_ops *ops)
      be nice if GDB itself would take care to remove all breakpoints
      at all times, but it doesn't, probably under an assumption that
      the OS cleans up when the debuggee exits.  */
      be nice if GDB itself would take care to remove all breakpoints
      at all times, but it doesn't, probably under an assumption that
      the OS cleans up when the debuggee exits.  */
-  i386_cleanup_dregs ();
+  x86_cleanup_dregs ();
 
   ptid = inferior_ptid;
   inferior_ptid = null_ptid;
   delete_thread_silent (ptid);
   prog_has_started = 0;
 
 
   ptid = inferior_ptid;
   inferior_ptid = null_ptid;
   delete_thread_silent (ptid);
   prog_has_started = 0;
 
-  unpush_target (ops);
   generic_mourn_inferior ();
   generic_mourn_inferior ();
-}
-
-static int
-go32_can_run (void)
-{
-  return 1;
+  inf_child_maybe_unpush_target (ops);
 }
 
 /* Hardware watchpoint support.  */
 }
 
 /* Hardware watchpoint support.  */
@@ -868,14 +849,14 @@ static int inf_terminal_mode;
 static int terminal_is_ours = 1;
 
 static void
 static int terminal_is_ours = 1;
 
 static void
-go32_terminal_init (void)
+go32_terminal_init (struct target_ops *self)
 {
   inf_mode_valid = 0;  /* Reinitialize, in case they are restarting child.  */
   terminal_is_ours = 1;
 }
 
 static void
 {
   inf_mode_valid = 0;  /* Reinitialize, in case they are restarting child.  */
   terminal_is_ours = 1;
 }
 
 static void
-go32_terminal_info (char *args, int from_tty)
+go32_terminal_info (struct target_ops *self, const char *args, int from_tty)
 {
   printf_unfiltered ("Inferior's terminal is in %s mode.\n",
                     !inf_mode_valid
 {
   printf_unfiltered ("Inferior's terminal is in %s mode.\n",
                     !inf_mode_valid
@@ -905,7 +886,7 @@ go32_terminal_info (char *args, int from_tty)
 }
 
 static void
 }
 
 static void
-go32_terminal_inferior (void)
+go32_terminal_inferior (struct target_ops *self)
 {
   /* Redirect standard handles as child wants them.  */
   errno = 0;
 {
   /* Redirect standard handles as child wants them.  */
   errno = 0;
@@ -926,7 +907,7 @@ go32_terminal_inferior (void)
 }
 
 static void
 }
 
 static void
-go32_terminal_ours (void)
+go32_terminal_ours (struct target_ops *self)
 {
   /* Switch to cooked mode on the gdb terminal and save the inferior
      terminal mode to be restored when it is resumed.  */
 {
   /* Switch to cooked mode on the gdb terminal and save the inferior
      terminal mode to be restored when it is resumed.  */
@@ -964,71 +945,32 @@ go32_pid_to_str (struct target_ops *ops, ptid_t ptid)
   return normal_pid_to_str (ptid);
 }
 
   return normal_pid_to_str (ptid);
 }
 
-static void
-init_go32_ops (void)
-{
-  go32_ops.to_shortname = "djgpp";
-  go32_ops.to_longname = "djgpp target process";
-  go32_ops.to_doc =
-    "Program loaded by djgpp, when gdb is used as an external debugger";
-  go32_ops.to_open = go32_open;
-  go32_ops.to_close = go32_close;
-  go32_ops.to_attach = go32_attach;
-  go32_ops.to_detach = go32_detach;
-  go32_ops.to_resume = go32_resume;
-  go32_ops.to_wait = go32_wait;
-  go32_ops.to_fetch_registers = go32_fetch_registers;
-  go32_ops.to_store_registers = go32_store_registers;
-  go32_ops.to_prepare_to_store = go32_prepare_to_store;
-  go32_ops.deprecated_xfer_memory = go32_xfer_memory;
-  go32_ops.to_files_info = go32_files_info;
-  go32_ops.to_insert_breakpoint = memory_insert_breakpoint;
-  go32_ops.to_remove_breakpoint = memory_remove_breakpoint;
-  go32_ops.to_terminal_init = go32_terminal_init;
-  go32_ops.to_terminal_inferior = go32_terminal_inferior;
-  go32_ops.to_terminal_ours_for_output = go32_terminal_ours;
-  go32_ops.to_terminal_ours = go32_terminal_ours;
-  go32_ops.to_terminal_info = go32_terminal_info;
-  go32_ops.to_kill = go32_kill_inferior;
-  go32_ops.to_create_inferior = go32_create_inferior;
-  go32_ops.to_mourn_inferior = go32_mourn_inferior;
-  go32_ops.to_can_run = go32_can_run;
-  go32_ops.to_thread_alive = go32_thread_alive;
-  go32_ops.to_pid_to_str = go32_pid_to_str;
-  go32_ops.to_stratum = process_stratum;
-  go32_ops.to_has_all_memory = default_child_has_all_memory;
-  go32_ops.to_has_memory = default_child_has_memory;
-  go32_ops.to_has_stack = default_child_has_stack;
-  go32_ops.to_has_registers = default_child_has_registers;
-  go32_ops.to_has_execution = default_child_has_execution;
-
-  i386_use_watchpoints (&go32_ops);
-
-
-  i386_dr_low.set_control = go32_set_dr7;
-  i386_dr_low.set_addr = go32_set_dr;
-  i386_dr_low.get_status = go32_get_dr6;
-  i386_dr_low.get_control = go32_get_dr7;
-  i386_dr_low.get_addr = go32_get_dr;
-  i386_set_debug_register_length (4);
-
-  go32_ops.to_magic = OPS_MAGIC;
-
-  /* Initialize child's cwd as empty to be initialized when starting
-     the child.  */
-  *child_cwd = 0;
+/* Create a go32 target.  */
 
 
-  /* Initialize child's command line storage.  */
-  if (redir_debug_init (&child_cmd) == -1)
-    internal_error (__FILE__, __LINE__,
-                   _("Cannot allocate redirection storage: "
-                     "not enough memory.\n"));
-
-  /* We are always processing GCC-compiled programs.  */
-  processing_gcc_compilation = 2;
-
-  /* Override the default name of the GDB init file.  */
-  strcpy (gdbinit, "gdb.ini");
+static struct target_ops *
+go32_target (void)
+{
+  struct target_ops *t = inf_child_target ();
+
+  t->to_attach = go32_attach;
+  t->to_resume = go32_resume;
+  t->to_wait = go32_wait;
+  t->to_fetch_registers = go32_fetch_registers;
+  t->to_store_registers = go32_store_registers;
+  t->to_xfer_partial = go32_xfer_partial;
+  t->to_files_info = go32_files_info;
+  t->to_terminal_init = go32_terminal_init;
+  t->to_terminal_inferior = go32_terminal_inferior;
+  t->to_terminal_ours_for_output = go32_terminal_ours;
+  t->to_terminal_ours = go32_terminal_ours;
+  t->to_terminal_info = go32_terminal_info;
+  t->to_kill = go32_kill_inferior;
+  t->to_create_inferior = go32_create_inferior;
+  t->to_mourn_inferior = go32_mourn_inferior;
+  t->to_thread_alive = go32_thread_alive;
+  t->to_pid_to_str = go32_pid_to_str;
+
+  return t;
 }
 
 /* Return the current DOS codepage number.  */
 }
 
 /* Return the current DOS codepage number.  */
@@ -1140,6 +1082,21 @@ go32_sysinfo (char *arg, int from_tty)
   else if (u.machine[0] == 'i' && u.machine[1] > 4)
     {
       /* CPUID with EAX = 0 returns the Vendor ID.  */
   else if (u.machine[0] == 'i' && u.machine[1] > 4)
     {
       /* CPUID with EAX = 0 returns the Vendor ID.  */
+#if 0
+      /* Ideally we would use x86_cpuid(), but it needs someone to run
+         native tests first to make sure things actually work.  They should.
+         http://sourceware.org/ml/gdb-patches/2013-05/msg00164.html  */
+      unsigned int eax, ebx, ecx, edx;
+
+      if (x86_cpuid (0, &eax, &ebx, &ecx, &edx))
+       {
+         cpuid_max = eax;
+         memcpy (&vendor[0], &ebx, 4);
+         memcpy (&vendor[4], &ecx, 4);
+         memcpy (&vendor[8], &edx, 4);
+         cpuid_vendor[12] = '\0';
+       }
+#else
       __asm__ __volatile__ ("xorl   %%ebx, %%ebx;"
                            "xorl   %%ecx, %%ecx;"
                            "xorl   %%edx, %%edx;"
       __asm__ __volatile__ ("xorl   %%ebx, %%ebx;"
                            "xorl   %%ecx, %%ecx;"
                            "xorl   %%edx, %%edx;"
@@ -1156,6 +1113,7 @@ go32_sysinfo (char *arg, int from_tty)
                            :
                            : "%eax", "%ebx", "%ecx", "%edx");
       cpuid_vendor[12] = '\0';
                            :
                            : "%eax", "%ebx", "%ecx", "%edx");
       cpuid_vendor[12] = '\0';
+#endif
     }
 
   printf_filtered ("CPU Type.......................%s", u.machine);
     }
 
   printf_filtered ("CPU Type.......................%s", u.machine);
@@ -1181,6 +1139,10 @@ go32_sysinfo (char *arg, int from_tty)
       int amd_p = strcmp (cpuid_vendor, "AuthenticAMD") == 0;
       unsigned cpu_family, cpu_model;
 
       int amd_p = strcmp (cpuid_vendor, "AuthenticAMD") == 0;
       unsigned cpu_family, cpu_model;
 
+#if 0
+      /* See comment above about cpuid usage.  */
+      x86_cpuid (1, &cpuid_eax, &cpuid_ebx, NULL, &cpuid_edx);
+#else
       __asm__ __volatile__ ("movl   $1, %%eax;"
                            "cpuid;"
                            : "=a" (cpuid_eax),
       __asm__ __volatile__ ("movl   $1, %%eax;"
                            "cpuid;"
                            : "=a" (cpuid_eax),
@@ -1188,6 +1150,7 @@ go32_sysinfo (char *arg, int from_tty)
                              "=d" (cpuid_edx)
                            :
                            : "%ecx");
                              "=d" (cpuid_edx)
                            :
                            : "%ecx");
+#endif
       brand_idx = cpuid_ebx & 0xff;
       cpu_family = (cpuid_eax >> 8) & 0xf;
       cpu_model  = (cpuid_eax >> 4) & 0xf;
       brand_idx = cpuid_ebx & 0xff;
       cpu_family = (cpuid_eax >> 8) & 0xf;
       cpu_model  = (cpuid_eax >> 4) & 0xf;
@@ -1272,9 +1235,9 @@ go32_sysinfo (char *arg, int from_tty)
                break;
            }
        }
                break;
            }
        }
-      sprintf (cpu_string, "%s%s Model %d Stepping %d",
-              intel_p ? "Pentium" : (amd_p ? "AMD" : "ix86"),
-              cpu_brand, cpu_model, cpuid_eax & 0xf);
+      xsnprintf (cpu_string, sizeof (cpu_string), "%s%s Model %d Stepping %d",
+                intel_p ? "Pentium" : (amd_p ? "AMD" : "ix86"),
+                cpu_brand, cpu_model, cpuid_eax & 0xf);
       printfi_filtered (31, "%s\n", cpu_string);
       if (((cpuid_edx & (6 | (0x0d << 23))) != 0)
          || ((cpuid_edx & 1) == 0)
       printfi_filtered (31, "%s\n", cpu_string);
       if (((cpuid_edx & (6 | (0x0d << 23))) != 0)
          || ((cpuid_edx & 1) == 0)
@@ -1702,8 +1665,7 @@ go32_sldt (char *arg, int from_tty)
 
   if (arg && *arg)
     {
 
   if (arg && *arg)
     {
-      while (*arg && isspace(*arg))
-       arg++;
+      arg = skip_spaces (arg);
 
       if (*arg)
        {
 
       if (*arg)
        {
@@ -1773,8 +1735,7 @@ go32_sgdt (char *arg, int from_tty)
 
   if (arg && *arg)
     {
 
   if (arg && *arg)
     {
-      while (*arg && isspace(*arg))
-       arg++;
+      arg = skip_spaces (arg);
 
       if (*arg)
        {
 
       if (*arg)
        {
@@ -1815,8 +1776,7 @@ go32_sidt (char *arg, int from_tty)
 
   if (arg && *arg)
     {
 
   if (arg && *arg)
     {
-      while (*arg && isspace(*arg))
-       arg++;
+      arg = skip_spaces (arg);
 
       if (*arg)
        {
 
       if (*arg)
        {
@@ -1986,8 +1946,7 @@ go32_pde (char *arg, int from_tty)
 
   if (arg && *arg)
     {
 
   if (arg && *arg)
     {
-      while (*arg && isspace(*arg))
-       arg++;
+      arg = skip_spaces (arg);
 
       if (*arg)
        {
 
       if (*arg)
        {
@@ -2037,8 +1996,7 @@ go32_pte (char *arg, int from_tty)
 
   if (arg && *arg)
     {
 
   if (arg && *arg)
     {
-      while (*arg && isspace(*arg))
-       arg++;
+      arg = skip_spaces (arg);
 
       if (*arg)
        {
 
       if (*arg)
        {
@@ -2065,8 +2023,7 @@ go32_pte_for_address (char *arg, int from_tty)
 
   if (arg && *arg)
     {
 
   if (arg && *arg)
     {
-      while (*arg && isspace(*arg))
-       arg++;
+      arg = skip_spaces (arg);
 
       if (*arg)
        addr = parse_and_eval_address (arg);
 
       if (*arg)
        addr = parse_and_eval_address (arg);
@@ -2097,11 +2054,36 @@ go32_info_dos_command (char *args, int from_tty)
   help_list (info_dos_cmdlist, "info dos ", class_info, gdb_stdout);
 }
 
   help_list (info_dos_cmdlist, "info dos ", class_info, gdb_stdout);
 }
 
+/* -Wmissing-prototypes */
+extern initialize_file_ftype _initialize_go32_nat;
+
 void
 _initialize_go32_nat (void)
 {
 void
 _initialize_go32_nat (void)
 {
-  init_go32_ops ();
-  add_target (&go32_ops);
+  struct target_ops *t = go32_target ();
+
+  x86_dr_low.set_control = go32_set_dr7;
+  x86_dr_low.set_addr = go32_set_dr;
+  x86_dr_low.get_status = go32_get_dr6;
+  x86_dr_low.get_control = go32_get_dr7;
+  x86_dr_low.get_addr = go32_get_dr;
+  x86_set_debug_register_length (4);
+
+  x86_use_watchpoints (t);
+  add_target (t);
+
+  /* Initialize child's cwd as empty to be initialized when starting
+     the child.  */
+  *child_cwd = 0;
+
+  /* Initialize child's command line storage.  */
+  if (redir_debug_init (&child_cmd) == -1)
+    internal_error (__FILE__, __LINE__,
+                   _("Cannot allocate redirection storage: "
+                     "not enough memory.\n"));
+
+  /* We are always processing GCC-compiled programs.  */
+  processing_gcc_compilation = 2;
 
   add_prefix_cmd ("dos", class_info, go32_info_dos_command, _("\
 Print information specific to DJGPP (aka MS-DOS) debugging."),
 
   add_prefix_cmd ("dos", class_info, go32_info_dos_command, _("\
 Print information specific to DJGPP (aka MS-DOS) debugging."),
This page took 0.031852 seconds and 4 git commands to generate.