X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fgo32-nat.c;h=6ff2710c22d3faf68d46285431936edcd0334940;hb=a3982d4858ac407c7e879a57762bc4130d54d4b8;hp=fce7a0f4815a4937266ac37d01ab57b81da639e6;hpb=9f20bf26f8399f4edb5ea771ac571ed64cbce865;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/go32-nat.c b/gdb/go32-nat.c index fce7a0f481..6ff2710c22 100644 --- a/gdb/go32-nat.c +++ b/gdb/go32-nat.c @@ -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" @@ -41,10 +42,7 @@ #include #include #include -/* breakpoint.h defines `disable' which is an enum member. */ -#define disable interrup_disable #include -#undef disable #include #include #include @@ -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'. */ @@ -472,7 +467,7 @@ 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) + else if (i386_fp_regnum_p (regno) || i386_fpc_regnum_p (regno)) i387_supply_register (regno, (char *) &npx); else internal_error (__FILE__, __LINE__, @@ -495,14 +490,10 @@ go32_fetch_registers (int regno) 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_collect (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); @@ -652,7 +643,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 +804,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 +838,7 @@ go32_terminal_ours (void) { redir_to_child (&child_cmd); error ("Cannot redirect standard handles for debugger: %s.", - strerror (errno)); + safe_strerror (errno)); } } } @@ -1331,7 +1322,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; @@ -1700,6 +1694,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 +1715,7 @@ get_cr3 (void) break; } } +#endif if (cr3 > 0xfffff) cr3 = 0; @@ -1909,7 +1905,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,