2005-01-15 Andrew Cagney <cagney@gnu.org>
[deliverable/binutils-gdb.git] / gdb / go32-nat.c
index fce7a0f4815a4937266ac37d01ab57b81da639e6..c34db892fc9db4072ea6b4672d4ad6419f4f74f7 100644 (file)
@@ -29,7 +29,8 @@
 #include "gdbcmd.h"
 #include "floatformat.h"
 #include "buildsym.h"
-#include "i387-nat.h"
+#include "i387-tdep.h"
+#include "i386-tdep.h"
 #include "value.h"
 #include "regcache.h"
 #include "gdb_string.h"
 #include <unistd.h>
 #include <sys/utsname.h>
 #include <io.h>
-/* breakpoint.h defines `disable' which is an enum member.  */
-#define disable interrup_disable
 #include <dos.h>
-#undef disable
 #include <dpmi.h>
 #include <go32.h>
 #include <sys/farptr.h>
@@ -93,16 +91,16 @@ static void load_npx (void);        /* Restore the FPU of the debugged program */
 static void
 save_npx (void)
 {
-  asm ("inb    $0xa0, %%al
-       testb $0x20, %%al
-       jz 1f
-       xorb %% al, %%al
-       outb %% al, $0xf0
-       movb $0x20, %%al
-       outb %% al, $0xa0
-       outb %% al, $0x20
-1:
-       fnsave % 0
+  asm ("inb    $0xa0, %%al  \n\
+       testb $0x20, %%al    \n\
+       jz 1f               \n\
+       xorb %%al, %%al     \n\
+       outb %%al, $0xf0     \n\
+       movb $0x20, %%al            \n\
+       outb %%al, $0xa0     \n\
+       outb %%al, $0x20     \n\
+1:                                 \n\
+       fnsave %0           \n\
        fwait "
 :     "=m" (npx)
 :                              /* No input */
@@ -112,9 +110,6 @@ save_npx (void)
 /* *INDENT-ON* */
 
 
-
-
-
 /* ------------------------------------------------------------------------- */
 /* Reload the contents of the NPX from the global variable `npx'.  */
 
@@ -188,7 +183,7 @@ static int go32_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len,
 static void go32_files_info (struct target_ops *target);
 static void go32_stop (void);
 static void go32_kill_inferior (void);
-static void go32_create_inferior (char *exec_file, char *args, char **env);
+static void go32_create_inferior (char *exec_file, char *args, char **env, int from_tty);
 static void go32_mourn_inferior (void);
 static int go32_can_run (void);
 
@@ -471,9 +466,10 @@ static void
 fetch_register (int regno)
 {
   if (regno < FP0_REGNUM)
-    supply_register (regno, (char *) &a_tss + regno_mapping[regno].tss_ofs);
-  else if (regno <= LAST_FPU_CTRL_REGNUM)
-    i387_supply_register (regno, (char *) &npx);
+    regcache_raw_supply (current_regcache, regno,
+                        (char *) &a_tss + regno_mapping[regno].tss_ofs);
+  else if (i386_fp_regnum_p (regno) || i386_fpc_regnum_p (regno))
+    i387_supply_fsave (current_regcache, regno, &npx);
   else
     internal_error (__FILE__, __LINE__,
                    "Invalid register no. %d in fetch_register.", regno);
@@ -488,21 +484,18 @@ go32_fetch_registers (int regno)
     {
       for (regno = 0; regno < FP0_REGNUM; regno++)
        fetch_register (regno);
-      i387_supply_fsave ((char *) &npx);
+      i387_supply_fsave (current_regcache, -1, &npx);
     }
 }
 
 static void
 store_register (int regno)
 {
-  void *rp;
-  void *v = (void *) register_buffer (regno);
-
   if (regno < FP0_REGNUM)
-    memcpy ((char *) &a_tss + regno_mapping[regno].tss_ofs,
-           v, regno_mapping[regno].size);
-  else if (regno <= LAST_FPU_CTRL_REGNUM)
-    i387_fill_fsave ((char *)&npx, regno);
+    regcache_raw_collect (current_regcache, regno,
+                         (char *) &a_tss + regno_mapping[regno].tss_ofs);
+  else if (i386_fp_regnum_p (regno) || i386_fpc_regnum_p (regno))
+    i387_fill_fsave ((char *) &npx, regno);
   else
     internal_error (__FILE__, __LINE__,
                    "Invalid register no. %d in store_register.", regno);
@@ -583,7 +576,7 @@ go32_kill_inferior (void)
 }
 
 static void
-go32_create_inferior (char *exec_file, char *args, char **env)
+go32_create_inferior (char *exec_file, char *args, char **env, int from_tty)
 {
   extern char **environ;
   jmp_buf start_state;
@@ -652,7 +645,7 @@ go32_create_inferior (char *exec_file, char *args, char **env)
       exit (1);
     }
   environ = env_save;
-  free (cmdline);
+  xfree (cmdline);
 
   edi_init (start_state);
 #if __DJGPP_MINOR__ < 3
@@ -813,7 +806,7 @@ go32_terminal_inferior (void)
   {
     redir_to_debugger (&child_cmd);
     error ("Cannot redirect standard handles for program: %s.",
-          strerror (errno));
+          safe_strerror (errno));
   }
   /* set the console device of the inferior to whatever mode
      (raw or cooked) we found it last time */
@@ -847,7 +840,7 @@ go32_terminal_ours (void)
     {
       redir_to_child (&child_cmd);
       error ("Cannot redirect standard handles for debugger: %s.",
-            strerror (errno));
+            safe_strerror (errno));
     }
   }
 }
@@ -868,7 +861,7 @@ init_go32_ops (void)
   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.to_xfer_memory = go32_xfer_memory;
+  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;
@@ -1331,7 +1324,10 @@ read_memory_region (unsigned long addr, void *dest, size_t len)
 
          if (__dpmi_set_segment_base_address (sel, addr) != -1
              && __dpmi_set_descriptor_access_rights (sel, access_rights) != -1
-             && __dpmi_set_segment_limit (sel, segment_limit) != -1)
+             && __dpmi_set_segment_limit (sel, segment_limit) != -1
+             /* W2K silently fails to set the segment limit, leaving
+                it at zero; this test avoids the resulting crash.  */
+             && __dpmi_get_segment_limit (sel) >= segment_limit)
            movedata (sel, 0, _my_ds (), (unsigned)dest, len);
          else
            retval = 0;
@@ -1521,7 +1517,7 @@ go32_sldt (char *arg, int from_tty)
          if (ldt_entry < 0
              || (ldt_entry & 4) == 0
              || (ldt_entry & 3) != (cpl & 3))
-           error ("Invalid LDT entry 0x%03x.", ldt_entry);
+           error ("Invalid LDT entry 0x%03lx.", (unsigned long)ldt_entry);
        }
     }
 
@@ -1559,8 +1555,8 @@ go32_sldt (char *arg, int from_tty)
       if (ldt_entry >= 0)
        {
          if (ldt_entry > limit)
-           error ("Invalid LDT entry %#x: outside valid limits [0..%#x]",
-                  ldt_entry, limit);
+           error ("Invalid LDT entry %#lx: outside valid limits [0..%#x]",
+                  (unsigned long)ldt_entry, limit);
 
          display_descriptor (ldt_descr.stype, base, ldt_entry / 8, 1);
        }
@@ -1590,8 +1586,8 @@ go32_sgdt (char *arg, int from_tty)
        {
          gdt_entry = parse_and_eval_long (arg);
          if (gdt_entry < 0 || (gdt_entry & 7) != 0)
-           error ("Invalid GDT entry 0x%03x: not an integral multiple of 8.",
-                  gdt_entry);
+           error ("Invalid GDT entry 0x%03lx: not an integral multiple of 8.",
+                  (unsigned long)gdt_entry);
        }
     }
 
@@ -1601,8 +1597,8 @@ go32_sgdt (char *arg, int from_tty)
   if (gdt_entry >= 0)
     {
       if (gdt_entry > gdtr.limit)
-       error ("Invalid GDT entry %#x: outside valid limits [0..%#x]",
-              gdt_entry, gdtr.limit);
+       error ("Invalid GDT entry %#lx: outside valid limits [0..%#x]",
+              (unsigned long)gdt_entry, gdtr.limit);
 
       display_descriptor (0, gdtr.base, gdt_entry / 8, 1);
     }
@@ -1631,7 +1627,7 @@ go32_sidt (char *arg, int from_tty)
        {
          idt_entry = parse_and_eval_long (arg);
          if (idt_entry < 0)
-           error ("Invalid (negative) IDT entry %d.", idt_entry);
+           error ("Invalid (negative) IDT entry %ld.", idt_entry);
        }
     }
 
@@ -1643,8 +1639,8 @@ go32_sidt (char *arg, int from_tty)
   if (idt_entry >= 0)
     {
       if (idt_entry > idtr.limit)
-       error ("Invalid IDT entry %#x: outside valid limits [0..%#x]",
-              idt_entry, idtr.limit);
+       error ("Invalid IDT entry %#lx: outside valid limits [0..%#x]",
+              (unsigned long)idt_entry, idtr.limit);
 
       display_descriptor (1, idtr.base, idt_entry, 1);
     }
@@ -1700,6 +1696,7 @@ get_cr3 (void)
   cr3 = _farnspeekl (taskbase + 0x1c) & ~0xfff;
   if (cr3 > 0xfffff)
     {
+#if 0  /* not fullly supported yet */
       /* The Page Directory is in UMBs.  In that case, CWSDPMI puts
         the first Page Table right below the Page Directory.  Thus,
         the first Page Table's entry for its own address and the Page
@@ -1720,6 +1717,7 @@ get_cr3 (void)
              break;
            }
        }
+#endif
 
       if (cr3 > 0xfffff)
        cr3 = 0;
@@ -1838,7 +1836,7 @@ display_page_table (long n, int force)
 static void
 go32_pte (char *arg, int from_tty)
 {
-  long pde_idx = -1, i;
+  long pde_idx = -1L, i;
 
   if (arg && *arg)
     {
@@ -1849,7 +1847,7 @@ go32_pte (char *arg, int from_tty)
        {
          pde_idx = parse_and_eval_long (arg);
          if (pde_idx < 0 || pde_idx >= 1024)
-           error ("Entry %d is outside valid limits [0..1023].", pde_idx);
+           error ("Entry %ld is outside valid limits [0..1023].", pde_idx);
        }
     }
 
@@ -1909,7 +1907,7 @@ _initialize_go32_nat (void)
   add_target (&go32_ops);
 
   add_prefix_cmd ("dos", class_info, go32_info_dos_command,
-                 "Print information specific to DJGPP (a.k.a. MS-DOS) debugging.",
+                 "Print information specific to DJGPP (aka MS-DOS) debugging.",
                  &info_dos_cmdlist, "info dos ", 0, &infolist);
 
   add_cmd ("sysinfo", class_info, go32_sysinfo,
This page took 0.028475 seconds and 4 git commands to generate.