Home | History | Annotate | Line # | Download | only in gdb
go32-nat.c revision 1.11
      1 /* Native debugging support for Intel x86 running DJGPP.
      2    Copyright (C) 1997-2024 Free Software Foundation, Inc.
      3    Written by Robert Hoehne.
      4 
      5    This file is part of GDB.
      6 
      7    This program is free software; you can redistribute it and/or modify
      8    it under the terms of the GNU General Public License as published by
      9    the Free Software Foundation; either version 3 of the License, or
     10    (at your option) any later version.
     11 
     12    This program is distributed in the hope that it will be useful,
     13    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15    GNU General Public License for more details.
     16 
     17    You should have received a copy of the GNU General Public License
     18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     19 
     20 /* To whomever it may concern, here's a general description of how
     21    debugging in DJGPP works, and the special quirks GDB does to
     22    support that.
     23 
     24    When the DJGPP port of GDB is debugging a DJGPP program natively,
     25    there aren't 2 separate processes, the debuggee and GDB itself, as
     26    on other systems.  (This is DOS, where there can only be one active
     27    process at any given time, remember?)  Instead, GDB and the
     28    debuggee live in the same process.  So when GDB calls
     29    go32_create_inferior below, and that function calls edi_init from
     30    the DJGPP debug support library libdbg.a, we load the debuggee's
     31    executable file into GDB's address space, set it up for execution
     32    as the stub loader (a short real-mode program prepended to each
     33    DJGPP executable) normally would, and do a lot of preparations for
     34    swapping between GDB's and debuggee's internal state, primarily wrt
     35    the exception handlers.  This swapping happens every time we resume
     36    the debuggee or switch back to GDB's code, and it includes:
     37 
     38     . swapping all the segment registers
     39     . swapping the PSP (the Program Segment Prefix)
     40     . swapping the signal handlers
     41     . swapping the exception handlers
     42     . swapping the FPU status
     43     . swapping the 3 standard file handles (more about this below)
     44 
     45    Then running the debuggee simply means longjmp into it where its PC
     46    is and let it run until it stops for some reason.  When it stops,
     47    GDB catches the exception that stopped it and longjmp's back into
     48    its own code.  All the possible exit points of the debuggee are
     49    watched; for example, the normal exit point is recognized because a
     50    DOS program issues a special system call to exit.  If one of those
     51    exit points is hit, we mourn the inferior and clean up after it.
     52    Cleaning up is very important, even if the process exits normally,
     53    because otherwise we might leave behind traces of previous
     54    execution, and in several cases GDB itself might be left hosed,
     55    because all the exception handlers were not restored.
     56 
     57    Swapping of the standard handles (in redir_to_child and
     58    redir_to_debugger) is needed because, since both GDB and the
     59    debuggee live in the same process, as far as the OS is concerned,
     60    the share the same file table.  This means that the standard
     61    handles 0, 1, and 2 point to the same file table entries, and thus
     62    are connected to the same devices.  Therefore, if the debugger
     63    redirects its standard output, the standard output of the debuggee
     64    is also automagically redirected to the same file/device!
     65    Similarly, if the debuggee redirects its stdout to a file, you
     66    won't be able to see debugger's output (it will go to the same file
     67    where the debuggee has its output); and if the debuggee closes its
     68    standard input, you will lose the ability to talk to debugger!
     69 
     70    For this reason, every time the debuggee is about to be resumed, we
     71    call redir_to_child, which redirects the standard handles to where
     72    the debuggee expects them to be.  When the debuggee stops and GDB
     73    regains control, we call redir_to_debugger, which redirects those 3
     74    handles back to where GDB expects.
     75 
     76    Note that only the first 3 handles are swapped, so if the debuggee
     77    redirects or closes any other handles, GDB will not notice.  In
     78    particular, the exit code of a DJGPP program forcibly closes all
     79    file handles beyond the first 3 ones, so when the debuggee exits,
     80    GDB currently loses its stdaux and stdprn streams.  Fortunately,
     81    GDB does not use those as of this writing, and will never need
     82    to.  */
     83 
     84 
     85 #include <fcntl.h>
     86 
     87 #include "x86-nat.h"
     88 #include "inferior.h"
     89 #include "infrun.h"
     90 #include "gdbthread.h"
     91 #include "gdbsupport/gdb_wait.h"
     92 #include "gdbcore.h"
     93 #include "command.h"
     94 #include "cli/cli-cmds.h"
     95 #include "floatformat.h"
     96 #include "buildsym-legacy.h"
     97 #include "i387-tdep.h"
     98 #include "i386-tdep.h"
     99 #include "nat/x86-cpuid.h"
    100 #include "value.h"
    101 #include "regcache.h"
    102 #include "top.h"
    103 #include "cli/cli-utils.h"
    104 #include "inf-child.h"
    105 
    106 #include <ctype.h>
    107 #include <unistd.h>
    108 #include <sys/utsname.h>
    109 #include <io.h>
    110 #include <dos.h>
    111 #include <dpmi.h>
    112 #include <go32.h>
    113 #include <sys/farptr.h>
    114 #include <debug/v2load.h>
    115 #include <debug/dbgcom.h>
    116 #if __DJGPP_MINOR__ > 2
    117 #include <debug/redir.h>
    118 #endif
    119 
    120 #include <langinfo.h>
    121 
    122 #if __DJGPP_MINOR__ < 3
    123 /* This code will be provided from DJGPP 2.03 on.  Until then I code it
    124    here.  */
    125 typedef struct
    126   {
    127     unsigned short sig0;
    128     unsigned short sig1;
    129     unsigned short sig2;
    130     unsigned short sig3;
    131     unsigned short exponent:15;
    132     unsigned short sign:1;
    133   }
    134 NPXREG;
    135 
    136 typedef struct
    137   {
    138     unsigned int control;
    139     unsigned int status;
    140     unsigned int tag;
    141     unsigned int eip;
    142     unsigned int cs;
    143     unsigned int dataptr;
    144     unsigned int datasel;
    145     NPXREG reg[8];
    146   }
    147 NPX;
    148 
    149 static NPX npx;
    150 
    151 static void save_npx (void);	/* Save the FPU of the debugged program.  */
    152 static void load_npx (void);	/* Restore the FPU of the debugged program.  */
    153 
    154 /* ------------------------------------------------------------------------- */
    155 /* Store the contents of the NPX in the global variable `npx'.  */
    156 
    157 static void
    158 save_npx (void)
    159 {
    160   asm ("inb    $0xa0, %%al  \n\
    161        testb $0x20, %%al    \n\
    162        jz 1f 	    	    \n\
    163        xorb %%al, %%al	    \n\
    164        outb %%al, $0xf0     \n\
    165        movb $0x20, %%al	    \n\
    166        outb %%al, $0xa0     \n\
    167        outb %%al, $0x20     \n\
    168 1:     	       	   	    \n\
    169        fnsave %0	    \n\
    170        fwait "
    171 :     "=m" (npx)
    172 :				/* No input */
    173 :     "%eax");
    174 }
    175 
    176 
    177 
    178 /* ------------------------------------------------------------------------- */
    179 /* Reload the contents of the NPX from the global variable `npx'.  */
    180 
    181 static void
    182 load_npx (void)
    183 {
    184   asm ("frstor %0":"=m" (npx));
    185 }
    186 /* ------------------------------------------------------------------------- */
    187 /* Stubs for the missing redirection functions.  */
    188 typedef struct {
    189   char *command;
    190   int redirected;
    191 } cmdline_t;
    192 
    193 void
    194 redir_cmdline_delete (cmdline_t *ptr)
    195 {
    196   ptr->redirected = 0;
    197 }
    198 
    199 int
    200 redir_cmdline_parse (const char *args, cmdline_t *ptr)
    201 {
    202   return -1;
    203 }
    204 
    205 int
    206 redir_to_child (cmdline_t *ptr)
    207 {
    208   return 1;
    209 }
    210 
    211 int
    212 redir_to_debugger (cmdline_t *ptr)
    213 {
    214   return 1;
    215 }
    216 
    217 int
    218 redir_debug_init (cmdline_t *ptr)
    219 {
    220   return 0;
    221 }
    222 #endif /* __DJGPP_MINOR < 3 */
    223 
    224 typedef enum { wp_insert, wp_remove, wp_count } wp_op;
    225 
    226 /* This holds the current reference counts for each debug register.  */
    227 static int dr_ref_count[4];
    228 
    229 #define SOME_PID 42
    230 
    231 static int prog_has_started = 0;
    232 
    233 #define r_ofs(x) (offsetof(TSS,x))
    234 
    235 static struct
    236 {
    237   size_t tss_ofs;
    238   size_t size;
    239 }
    240 regno_mapping[] =
    241 {
    242   {r_ofs (tss_eax), 4},	/* normal registers, from a_tss */
    243   {r_ofs (tss_ecx), 4},
    244   {r_ofs (tss_edx), 4},
    245   {r_ofs (tss_ebx), 4},
    246   {r_ofs (tss_esp), 4},
    247   {r_ofs (tss_ebp), 4},
    248   {r_ofs (tss_esi), 4},
    249   {r_ofs (tss_edi), 4},
    250   {r_ofs (tss_eip), 4},
    251   {r_ofs (tss_eflags), 4},
    252   {r_ofs (tss_cs), 2},
    253   {r_ofs (tss_ss), 2},
    254   {r_ofs (tss_ds), 2},
    255   {r_ofs (tss_es), 2},
    256   {r_ofs (tss_fs), 2},
    257   {r_ofs (tss_gs), 2},
    258   {0, 10},		/* 8 FP registers, from npx.reg[] */
    259   {1, 10},
    260   {2, 10},
    261   {3, 10},
    262   {4, 10},
    263   {5, 10},
    264   {6, 10},
    265   {7, 10},
    266 	/* The order of the next 7 registers must be consistent
    267 	   with their numbering in config/i386/tm-i386.h, which see.  */
    268   {0, 2},		/* control word, from npx */
    269   {4, 2},		/* status word, from npx */
    270   {8, 2},		/* tag word, from npx */
    271   {16, 2},		/* last FP exception CS from npx */
    272   {12, 4},		/* last FP exception EIP from npx */
    273   {24, 2},		/* last FP exception operand selector from npx */
    274   {20, 4},		/* last FP exception operand offset from npx */
    275   {18, 2}		/* last FP opcode from npx */
    276 };
    277 
    278 static struct
    279   {
    280     int go32_sig;
    281     enum gdb_signal gdb_sig;
    282   }
    283 sig_map[] =
    284 {
    285   {0, GDB_SIGNAL_FPE},
    286   {1, GDB_SIGNAL_TRAP},
    287   /* Exception 2 is triggered by the NMI.  DJGPP handles it as SIGILL,
    288      but I think SIGBUS is better, since the NMI is usually activated
    289      as a result of a memory parity check failure.  */
    290   {2, GDB_SIGNAL_BUS},
    291   {3, GDB_SIGNAL_TRAP},
    292   {4, GDB_SIGNAL_FPE},
    293   {5, GDB_SIGNAL_SEGV},
    294   {6, GDB_SIGNAL_ILL},
    295   {7, GDB_SIGNAL_EMT},	/* no-coprocessor exception */
    296   {8, GDB_SIGNAL_SEGV},
    297   {9, GDB_SIGNAL_SEGV},
    298   {10, GDB_SIGNAL_BUS},
    299   {11, GDB_SIGNAL_SEGV},
    300   {12, GDB_SIGNAL_SEGV},
    301   {13, GDB_SIGNAL_SEGV},
    302   {14, GDB_SIGNAL_SEGV},
    303   {16, GDB_SIGNAL_FPE},
    304   {17, GDB_SIGNAL_BUS},
    305   {31, GDB_SIGNAL_ILL},
    306   {0x1b, GDB_SIGNAL_INT},
    307   {0x75, GDB_SIGNAL_FPE},
    308   {0x78, GDB_SIGNAL_ALRM},
    309   {0x79, GDB_SIGNAL_INT},
    310   {0x7a, GDB_SIGNAL_QUIT},
    311   {-1, GDB_SIGNAL_LAST}
    312 };
    313 
    314 static struct {
    315   enum gdb_signal gdb_sig;
    316   int djgpp_excepno;
    317 } excepn_map[] = {
    318   {GDB_SIGNAL_0, -1},
    319   {GDB_SIGNAL_ILL, 6},	/* Invalid Opcode */
    320   {GDB_SIGNAL_EMT, 7},	/* triggers SIGNOFP */
    321   {GDB_SIGNAL_SEGV, 13},	/* GPF */
    322   {GDB_SIGNAL_BUS, 17},	/* Alignment Check */
    323   /* The rest are fake exceptions, see dpmiexcp.c in djlsr*.zip for
    324      details.  */
    325   {GDB_SIGNAL_TERM, 0x1b},	/* triggers Ctrl-Break type of SIGINT */
    326   {GDB_SIGNAL_FPE, 0x75},
    327   {GDB_SIGNAL_INT, 0x79},
    328   {GDB_SIGNAL_QUIT, 0x7a},
    329   {GDB_SIGNAL_ALRM, 0x78},	/* triggers SIGTIMR */
    330   {GDB_SIGNAL_PROF, 0x78},
    331   {GDB_SIGNAL_LAST, -1}
    332 };
    333 
    334 /* The go32 target.  */
    335 
    336 struct go32_nat_target final : public x86_nat_target<inf_child_target>
    337 {
    338   void attach (const char *, int) override;
    339 
    340   void resume (ptid_t, int, enum gdb_signal) override;
    341 
    342   ptid_t wait (ptid_t, struct target_waitstatus *, target_wait_flags) override;
    343 
    344   void fetch_registers (struct regcache *, int) override;
    345   void store_registers (struct regcache *, int) override;
    346 
    347   enum target_xfer_status xfer_partial (enum target_object object,
    348 					const char *annex,
    349 					gdb_byte *readbuf,
    350 					const gdb_byte *writebuf,
    351 					ULONGEST offset, ULONGEST len,
    352 					ULONGEST *xfered_len) override;
    353 
    354   void files_info () override;
    355 
    356   void terminal_init () override;
    357 
    358   void terminal_inferior () override;
    359 
    360   void terminal_ours_for_output () override;
    361 
    362   void terminal_ours () override;
    363 
    364   void terminal_info (const char *, int) override;
    365 
    366   void pass_ctrlc () override;
    367 
    368   void kill () override;
    369 
    370   void create_inferior (const char *, const std::string &,
    371 			char **, int) override;
    372 
    373   void mourn_inferior () override;
    374 
    375   bool thread_alive (ptid_t ptid) override;
    376 
    377   std::string pid_to_str (ptid_t) override;
    378 };
    379 
    380 static go32_nat_target the_go32_nat_target;
    381 
    382 void
    383 go32_nat_target::attach (const char *args, int from_tty)
    384 {
    385   error (_("\
    386 You cannot attach to a running program on this platform.\n\
    387 Use the `run' command to run DJGPP programs."));
    388 }
    389 
    390 static int resume_is_step;
    391 static int resume_signal = -1;
    392 
    393 void
    394 go32_nat_target::resume (ptid_t ptid, int step, enum gdb_signal siggnal)
    395 {
    396   int i;
    397 
    398   resume_is_step = step;
    399 
    400   if (siggnal != GDB_SIGNAL_0 && siggnal != GDB_SIGNAL_TRAP)
    401     {
    402       for (i = 0, resume_signal = -1;
    403 	   excepn_map[i].gdb_sig != GDB_SIGNAL_LAST; i++)
    404 	if (excepn_map[i].gdb_sig == siggnal)
    405 	  {
    406 	    resume_signal = excepn_map[i].djgpp_excepno;
    407 	    break;
    408 	  }
    409       if (resume_signal == -1)
    410 	printf_unfiltered ("Cannot deliver signal %s on this platform.\n",
    411 			   gdb_signal_to_name (siggnal));
    412     }
    413 }
    414 
    415 static char child_cwd[FILENAME_MAX];
    416 
    417 ptid_t
    418 go32_nat_target::wait (ptid_t ptid, struct target_waitstatus *status,
    419 		       target_wait_flags options)
    420 {
    421   int i;
    422   unsigned char saved_opcode;
    423   unsigned long INT3_addr = 0;
    424   int stepping_over_INT = 0;
    425 
    426   a_tss.tss_eflags &= 0xfeff;	/* Reset the single-step flag (TF).  */
    427   if (resume_is_step)
    428     {
    429       /* If the next instruction is INT xx or INTO, we need to handle
    430 	 them specially.  Intel manuals say that these instructions
    431 	 reset the single-step flag (a.k.a. TF).  However, it seems
    432 	 that, at least in the DPMI environment, and at least when
    433 	 stepping over the DPMI interrupt 31h, the problem is having
    434 	 TF set at all when INT 31h is executed: the debuggee either
    435 	 crashes (and takes the system with it) or is killed by a
    436 	 SIGTRAP.
    437 
    438 	 So we need to emulate single-step mode: we put an INT3 opcode
    439 	 right after the INT xx instruction, let the debuggee run
    440 	 until it hits INT3 and stops, then restore the original
    441 	 instruction which we overwrote with the INT3 opcode, and back
    442 	 up the debuggee's EIP to that instruction.  */
    443       read_child (a_tss.tss_eip, &saved_opcode, 1);
    444       if (saved_opcode == 0xCD || saved_opcode == 0xCE)
    445 	{
    446 	  unsigned char INT3_opcode = 0xCC;
    447 
    448 	  INT3_addr
    449 	    = saved_opcode == 0xCD ? a_tss.tss_eip + 2 : a_tss.tss_eip + 1;
    450 	  stepping_over_INT = 1;
    451 	  read_child (INT3_addr, &saved_opcode, 1);
    452 	  write_child (INT3_addr, &INT3_opcode, 1);
    453 	}
    454       else
    455 	a_tss.tss_eflags |= 0x0100; /* normal instruction: set TF */
    456     }
    457 
    458   /* The special value FFFFh in tss_trap indicates to run_child that
    459      tss_irqn holds a signal to be delivered to the debuggee.  */
    460   if (resume_signal <= -1)
    461     {
    462       a_tss.tss_trap = 0;
    463       a_tss.tss_irqn = 0xff;
    464     }
    465   else
    466     {
    467       a_tss.tss_trap = 0xffff;	/* run_child looks for this.  */
    468       a_tss.tss_irqn = resume_signal;
    469     }
    470 
    471   /* The child might change working directory behind our back.  The
    472      GDB users won't like the side effects of that when they work with
    473      relative file names, and GDB might be confused by its current
    474      directory not being in sync with the truth.  So we always make a
    475      point of changing back to where GDB thinks is its cwd, when we
    476      return control to the debugger, but restore child's cwd before we
    477      run it.  */
    478   /* Initialize child_cwd, before the first call to run_child and not
    479      in the initialization, so the child get also the changed directory
    480      set with the gdb-command "cd ..."  */
    481   if (!*child_cwd)
    482     /* Initialize child's cwd with the current one.  */
    483     getcwd (child_cwd, sizeof (child_cwd));
    484 
    485   chdir (child_cwd);
    486 
    487 #if __DJGPP_MINOR__ < 3
    488   load_npx ();
    489 #endif
    490   run_child ();
    491 #if __DJGPP_MINOR__ < 3
    492   save_npx ();
    493 #endif
    494 
    495   /* Did we step over an INT xx instruction?  */
    496   if (stepping_over_INT && a_tss.tss_eip == INT3_addr + 1)
    497     {
    498       /* Restore the original opcode.  */
    499       a_tss.tss_eip--;	/* EIP points *after* the INT3 instruction.  */
    500       write_child (a_tss.tss_eip, &saved_opcode, 1);
    501       /* Simulate a TRAP exception.  */
    502       a_tss.tss_irqn = 1;
    503       a_tss.tss_eflags |= 0x0100;
    504     }
    505 
    506   getcwd (child_cwd, sizeof (child_cwd)); /* in case it has changed */
    507   if (current_directory != NULL)
    508     chdir (current_directory);
    509 
    510   if (a_tss.tss_irqn == 0x21)
    511     status->set_exited (a_tss.tss_eax & 0xff);
    512   else
    513     {
    514       status->set_stopped (GDB_SIGNAL_UNKNOWN);
    515       for (i = 0; sig_map[i].go32_sig != -1; i++)
    516 	{
    517 	  if (a_tss.tss_irqn == sig_map[i].go32_sig)
    518 	    {
    519 #if __DJGPP_MINOR__ < 3
    520 	      status->set_stopped (sig_map[i].gdb_sig);
    521 	      if (status->sig () != GDB_SIGNAL_TRAP)
    522 		status->set_signalled (status->sig ());
    523 #else
    524 	      status->set_stopped (sig_map[i].gdb_sig);
    525 #endif
    526 	      break;
    527 	    }
    528 	}
    529     }
    530   return ptid_t (SOME_PID);
    531 }
    532 
    533 static void
    534 fetch_register (struct regcache *regcache, int regno)
    535 {
    536   struct gdbarch *gdbarch = regcache->arch ();
    537   if (regno < gdbarch_fp0_regnum (gdbarch))
    538     regcache->raw_supply (regno,
    539 			  (char *) &a_tss + regno_mapping[regno].tss_ofs);
    540   else if (i386_fp_regnum_p (gdbarch, regno) || i386_fpc_regnum_p (gdbarch,
    541 								   regno))
    542     i387_supply_fsave (regcache, regno, &npx);
    543   else
    544     internal_error (_("Invalid register no. %d in fetch_register."), regno);
    545 }
    546 
    547 void
    548 go32_nat_target::fetch_registers (struct regcache *regcache, int regno)
    549 {
    550   if (regno >= 0)
    551     fetch_register (regcache, regno);
    552   else
    553     {
    554       for (regno = 0;
    555 	   regno < gdbarch_fp0_regnum (regcache->arch ());
    556 	   regno++)
    557 	fetch_register (regcache, regno);
    558       i387_supply_fsave (regcache, -1, &npx);
    559     }
    560 }
    561 
    562 static void
    563 store_register (const struct regcache *regcache, int regno)
    564 {
    565   struct gdbarch *gdbarch = regcache->arch ();
    566   if (regno < gdbarch_fp0_regnum (gdbarch))
    567     regcache->raw_collect (regno,
    568 			   (char *) &a_tss + regno_mapping[regno].tss_ofs);
    569   else if (i386_fp_regnum_p (gdbarch, regno) || i386_fpc_regnum_p (gdbarch,
    570 								   regno))
    571     i387_collect_fsave (regcache, regno, &npx);
    572   else
    573     internal_error (_("Invalid register no. %d in store_register."), regno);
    574 }
    575 
    576 void
    577 go32_nat_target::store_registers (struct regcache *regcache, int regno)
    578 {
    579   unsigned r;
    580 
    581   if (regno >= 0)
    582     store_register (regcache, regno);
    583   else
    584     {
    585       for (r = 0; r < gdbarch_fp0_regnum (regcache->arch ()); r++)
    586 	store_register (regcache, r);
    587       i387_collect_fsave (regcache, -1, &npx);
    588     }
    589 }
    590 
    591 /* Const-correct version of DJGPP's write_child, which unfortunately
    592    takes a non-const buffer pointer.  */
    593 
    594 static int
    595 my_write_child (unsigned child_addr, const void *buf, unsigned len)
    596 {
    597   static void *buffer = NULL;
    598   static unsigned buffer_len = 0;
    599   int res;
    600 
    601   if (buffer_len < len)
    602     {
    603       buffer = xrealloc (buffer, len);
    604       buffer_len = len;
    605     }
    606 
    607   memcpy (buffer, buf, len);
    608   res = write_child (child_addr, buffer, len);
    609   return res;
    610 }
    611 
    612 /* Helper for go32_xfer_partial that handles memory transfers.
    613    Arguments are like target_xfer_partial.  */
    614 
    615 static enum target_xfer_status
    616 go32_xfer_memory (gdb_byte *readbuf, const gdb_byte *writebuf,
    617 		  ULONGEST memaddr, ULONGEST len, ULONGEST *xfered_len)
    618 {
    619   int res;
    620 
    621   if (writebuf != NULL)
    622     res = my_write_child (memaddr, writebuf, len);
    623   else
    624     res = read_child (memaddr, readbuf, len);
    625 
    626   /* read_child and write_child return zero on success, non-zero on
    627      failure.  */
    628   if (res != 0)
    629     return TARGET_XFER_E_IO;
    630 
    631   *xfered_len = len;
    632   return TARGET_XFER_OK;
    633 }
    634 
    635 /* Target to_xfer_partial implementation.  */
    636 
    637 enum target_xfer_status
    638 go32_nat_target::xfer_partial (enum target_object object,
    639 			       const char *annex, gdb_byte *readbuf,
    640 			       const gdb_byte *writebuf, ULONGEST offset,
    641 			       ULONGEST len,
    642 			       ULONGEST *xfered_len)
    643 {
    644   switch (object)
    645     {
    646     case TARGET_OBJECT_MEMORY:
    647       return go32_xfer_memory (readbuf, writebuf, offset, len, xfered_len);
    648 
    649     default:
    650       return this->beneath ()->xfer_partial (object, annex,
    651 					     readbuf, writebuf, offset, len,
    652 					     xfered_len);
    653     }
    654 }
    655 
    656 static cmdline_t child_cmd;	/* Parsed child's command line kept here.  */
    657 
    658 void
    659 go32_nat_target::files_info ()
    660 {
    661   gdb_printf ("You are running a DJGPP V2 program.\n");
    662 }
    663 
    664 void
    665 go32_nat_target::kill_inferior ()
    666 {
    667   mourn_inferior ();
    668 }
    669 
    670 void
    671 go32_nat_target::create_inferior (const char *exec_file,
    672 				  const std::string &allargs,
    673 				  char **env, int from_tty)
    674 {
    675   extern char **environ;
    676   jmp_buf start_state;
    677   char *cmdline;
    678   char **env_save = environ;
    679   size_t cmdlen;
    680   struct inferior *inf;
    681   int result;
    682   const char *args = allargs.c_str ();
    683 
    684   /* If no exec file handed to us, get it from the exec-file command -- with
    685      a good, common error message if none is specified.  */
    686   if (exec_file == 0)
    687     exec_file = get_exec_file (1);
    688 
    689   resume_signal = -1;
    690   resume_is_step = 0;
    691 
    692   /* Initialize child's cwd as empty to be initialized when starting
    693      the child.  */
    694   *child_cwd = 0;
    695 
    696   /* Init command line storage.  */
    697   if (redir_debug_init (&child_cmd) == -1)
    698     internal_error (_("Cannot allocate redirection storage: "
    699 		      "not enough memory.\n"));
    700 
    701   /* Parse the command line and create redirections.  */
    702   if (strpbrk (args, "<>"))
    703     {
    704       if (redir_cmdline_parse (args, &child_cmd) == 0)
    705 	args = child_cmd.command;
    706       else
    707 	error (_("Syntax error in command line."));
    708     }
    709   else
    710     child_cmd.command = xstrdup (args);
    711 
    712   cmdlen = strlen (args);
    713   /* v2loadimage passes command lines via DOS memory, so it cannot
    714      possibly handle commands longer than 1MB.  */
    715   if (cmdlen > 1024*1024)
    716     error (_("Command line too long."));
    717 
    718   cmdline = (char *) xmalloc (cmdlen + 4);
    719   strcpy (cmdline + 1, args);
    720   /* If the command-line length fits into DOS 126-char limits, use the
    721      DOS command tail format; otherwise, tell v2loadimage to pass it
    722      through a buffer in conventional memory.  */
    723   if (cmdlen < 127)
    724     {
    725       cmdline[0] = strlen (args);
    726       cmdline[cmdlen + 1] = 13;
    727     }
    728   else
    729     cmdline[0] = 0xff;	/* Signal v2loadimage it's a long command.  */
    730 
    731   environ = env;
    732 
    733   result = v2loadimage (exec_file, cmdline, start_state);
    734 
    735   environ = env_save;
    736   xfree (cmdline);
    737 
    738   if (result != 0)
    739     error (_("Load failed for image %s"), exec_file);
    740 
    741   edi_init (start_state);
    742 #if __DJGPP_MINOR__ < 3
    743   save_npx ();
    744 #endif
    745 
    746   inf = current_inferior ();
    747   inferior_appeared (inf, SOME_PID);
    748 
    749   if (!inf->target_is_pushed (this))
    750     inf->push_target (this);
    751 
    752   thread_info *thr = add_thread_silent (ptid_t (SOME_PID));
    753   switch_to_thread (thr);
    754 
    755   clear_proceed_status (0);
    756   insert_breakpoints ();
    757   prog_has_started = 1;
    758 }
    759 
    760 void
    761 go32_nat_target::mourn_inferior ()
    762 {
    763   redir_cmdline_delete (&child_cmd);
    764   resume_signal = -1;
    765   resume_is_step = 0;
    766 
    767   cleanup_client ();
    768 
    769   /* We need to make sure all the breakpoint enable bits in the DR7
    770      register are reset when the inferior exits.  Otherwise, if they
    771      rerun the inferior, the uncleared bits may cause random SIGTRAPs,
    772      failure to set more watchpoints, and other calamities.  It would
    773      be nice if GDB itself would take care to remove all breakpoints
    774      at all times, but it doesn't, probably under an assumption that
    775      the OS cleans up when the debuggee exits.  */
    776   x86_cleanup_dregs ();
    777 
    778   prog_has_started = 0;
    779 
    780   generic_mourn_inferior ();
    781   maybe_unpush_target ();
    782 }
    783 
    784 /* Hardware watchpoint support.  */
    785 
    786 #define D_REGS edi.dr
    787 #define CONTROL D_REGS[7]
    788 #define STATUS D_REGS[6]
    789 
    790 /* Pass the address ADDR to the inferior in the I'th debug register.
    791    Here we just store the address in D_REGS, the watchpoint will be
    792    actually set up when go32_wait runs the debuggee.  */
    793 static void
    794 go32_set_dr (int i, CORE_ADDR addr)
    795 {
    796   if (i < 0 || i > 3)
    797     internal_error (_("Invalid register %d in go32_set_dr.\n"), i);
    798   D_REGS[i] = addr;
    799 }
    800 
    801 /* Pass the value VAL to the inferior in the DR7 debug control
    802    register.  Here we just store the address in D_REGS, the watchpoint
    803    will be actually set up when go32_wait runs the debuggee.  */
    804 static void
    805 go32_set_dr7 (unsigned long val)
    806 {
    807   CONTROL = val;
    808 }
    809 
    810 /* Get the value of the DR6 debug status register from the inferior.
    811    Here we just return the value stored in D_REGS, as we've got it
    812    from the last go32_wait call.  */
    813 static unsigned long
    814 go32_get_dr6 (void)
    815 {
    816   return STATUS;
    817 }
    818 
    819 /* Get the value of the DR7 debug status register from the inferior.
    820    Here we just return the value stored in D_REGS, as we've got it
    821    from the last go32_wait call.  */
    822 
    823 static unsigned long
    824 go32_get_dr7 (void)
    825 {
    826   return CONTROL;
    827 }
    828 
    829 /* Get the value of the DR debug register I from the inferior.  Here
    830    we just return the value stored in D_REGS, as we've got it from the
    831    last go32_wait call.  */
    832 
    833 static CORE_ADDR
    834 go32_get_dr (int i)
    835 {
    836   if (i < 0 || i > 3)
    837     internal_error (_("Invalid register %d in go32_get_dr.\n"), i);
    838   return D_REGS[i];
    839 }
    840 
    841 /* Put the device open on handle FD into either raw or cooked
    842    mode, return 1 if it was in raw mode, zero otherwise.  */
    843 
    844 static int
    845 device_mode (int fd, int raw_p)
    846 {
    847   int oldmode, newmode;
    848   __dpmi_regs regs;
    849 
    850   regs.x.ax = 0x4400;
    851   regs.x.bx = fd;
    852   __dpmi_int (0x21, &regs);
    853   if (regs.x.flags & 1)
    854     return -1;
    855   newmode = oldmode = regs.x.dx;
    856 
    857   if (raw_p)
    858     newmode |= 0x20;
    859   else
    860     newmode &= ~0x20;
    861 
    862   if (oldmode & 0x80)	/* Only for character dev.  */
    863     {
    864       regs.x.ax = 0x4401;
    865       regs.x.bx = fd;
    866       regs.x.dx = newmode & 0xff;   /* Force upper byte zero, else it fails.  */
    867       __dpmi_int (0x21, &regs);
    868       if (regs.x.flags & 1)
    869 	return -1;
    870     }
    871   return (oldmode & 0x20) == 0x20;
    872 }
    873 
    874 
    875 static int inf_mode_valid = 0;
    876 static int inf_terminal_mode;
    877 
    878 /* This semaphore is needed because, amazingly enough, GDB calls
    879    target.to_terminal_ours more than once after the inferior stops.
    880    But we need the information from the first call only, since the
    881    second call will always see GDB's own cooked terminal.  */
    882 static int terminal_is_ours = 1;
    883 
    884 void
    885 go32_nat_target::terminal_init ()
    886 {
    887   inf_mode_valid = 0;	/* Reinitialize, in case they are restarting child.  */
    888   terminal_is_ours = 1;
    889 }
    890 
    891 void
    892 go32_nat_target::terminal_info (const char *args, int from_tty)
    893 {
    894   gdb_printf ("Inferior's terminal is in %s mode.\n",
    895 	      !inf_mode_valid
    896 	      ? "default" : inf_terminal_mode ? "raw" : "cooked");
    897 
    898 #if __DJGPP_MINOR__ > 2
    899   if (child_cmd.redirection)
    900     {
    901       int i;
    902 
    903       for (i = 0; i < DBG_HANDLES; i++)
    904 	{
    905 	  if (child_cmd.redirection[i]->file_name)
    906 	    gdb_printf ("\tFile handle %d is redirected to `%s'.\n",
    907 			i, child_cmd.redirection[i]->file_name);
    908 	  else if (_get_dev_info (child_cmd.redirection[i]->inf_handle) == -1)
    909 	    gdb_printf
    910 	      ("\tFile handle %d appears to be closed by inferior.\n", i);
    911 	  /* Mask off the raw/cooked bit when comparing device info words.  */
    912 	  else if ((_get_dev_info (child_cmd.redirection[i]->inf_handle) & 0xdf)
    913 		   != (_get_dev_info (i) & 0xdf))
    914 	    gdb_printf
    915 	      ("\tFile handle %d appears to be redirected by inferior.\n", i);
    916 	}
    917     }
    918 #endif
    919 }
    920 
    921 void
    922 go32_nat_target::terminal_inferior ()
    923 {
    924   /* Redirect standard handles as child wants them.  */
    925   errno = 0;
    926   if (redir_to_child (&child_cmd) == -1)
    927     {
    928       redir_to_debugger (&child_cmd);
    929       error (_("Cannot redirect standard handles for program: %s."),
    930 	     safe_strerror (errno));
    931     }
    932   /* Set the console device of the inferior to whatever mode
    933      (raw or cooked) we found it last time.  */
    934   if (terminal_is_ours)
    935     {
    936       if (inf_mode_valid)
    937 	device_mode (0, inf_terminal_mode);
    938       terminal_is_ours = 0;
    939     }
    940 }
    941 
    942 void
    943 go32_nat_target::terminal_ours ()
    944 {
    945   /* Switch to cooked mode on the gdb terminal and save the inferior
    946      terminal mode to be restored when it is resumed.  */
    947   if (!terminal_is_ours)
    948     {
    949       inf_terminal_mode = device_mode (0, 0);
    950       if (inf_terminal_mode != -1)
    951 	inf_mode_valid = 1;
    952       else
    953 	/* If device_mode returned -1, we don't know what happens with
    954 	   handle 0 anymore, so make the info invalid.  */
    955 	inf_mode_valid = 0;
    956       terminal_is_ours = 1;
    957 
    958       /* Restore debugger's standard handles.  */
    959       errno = 0;
    960       if (redir_to_debugger (&child_cmd) == -1)
    961 	{
    962 	  redir_to_child (&child_cmd);
    963 	  error (_("Cannot redirect standard handles for debugger: %s."),
    964 		 safe_strerror (errno));
    965 	}
    966     }
    967 }
    968 
    969 void
    970 go32_nat_target::pass_ctrlc ()
    971 {
    972 }
    973 
    974 bool
    975 go32_nat_target::thread_alive (ptid_t ptid)
    976 {
    977   return ptid != null_ptid;
    978 }
    979 
    980 std::string
    981 go32_nat_target::pid_to_str (ptid_t ptid)
    982 {
    983   return normal_pid_to_str (ptid);
    984 }
    985 
    986 /* Return the current DOS codepage number.  */
    987 static int
    988 dos_codepage (void)
    989 {
    990   __dpmi_regs regs;
    991 
    992   regs.x.ax = 0x6601;
    993   __dpmi_int (0x21, &regs);
    994   if (!(regs.x.flags & 1))
    995     return regs.x.bx & 0xffff;
    996   else
    997     return 437;	/* default */
    998 }
    999 
   1000 /* Limited emulation of `nl_langinfo', for charset.c.  */
   1001 char *
   1002 nl_langinfo (nl_item item)
   1003 {
   1004   char *retval;
   1005 
   1006   switch (item)
   1007     {
   1008       case CODESET:
   1009 	{
   1010 	  /* 8 is enough for SHORT_MAX + "CP" + null.  */
   1011 	  char buf[8];
   1012 	  int blen = sizeof (buf);
   1013 	  int needed = snprintf (buf, blen, "CP%d", dos_codepage ());
   1014 
   1015 	  if (needed > blen)	/* Should never happen.  */
   1016 	    buf[0] = 0;
   1017 	  retval = xstrdup (buf);
   1018 	}
   1019 	break;
   1020       default:
   1021 	retval = xstrdup ("");
   1022 	break;
   1023     }
   1024   return retval;
   1025 }
   1026 
   1027 unsigned short windows_major, windows_minor;
   1028 
   1029 /* Compute the version Windows reports via Int 2Fh/AX=1600h.  */
   1030 static void
   1031 go32_get_windows_version(void)
   1032 {
   1033   __dpmi_regs r;
   1034 
   1035   r.x.ax = 0x1600;
   1036   __dpmi_int(0x2f, &r);
   1037   if (r.h.al > 2 && r.h.al != 0x80 && r.h.al != 0xff
   1038       && (r.h.al > 3 || r.h.ah > 0))
   1039     {
   1040       windows_major = r.h.al;
   1041       windows_minor = r.h.ah;
   1042     }
   1043   else
   1044     windows_major = 0xff;	/* meaning no Windows */
   1045 }
   1046 
   1047 /* A subroutine of go32_sysinfo to display memory info.  */
   1048 static void
   1049 print_mem (unsigned long datum, const char *header, int in_pages_p)
   1050 {
   1051   if (datum != 0xffffffffUL)
   1052     {
   1053       if (in_pages_p)
   1054 	datum <<= 12;
   1055       gdb_puts (header);
   1056       if (datum > 1024)
   1057 	{
   1058 	  gdb_printf ("%lu KB", datum >> 10);
   1059 	  if (datum > 1024 * 1024)
   1060 	    gdb_printf (" (%lu MB)", datum >> 20);
   1061 	}
   1062       else
   1063 	gdb_printf ("%lu Bytes", datum);
   1064       gdb_puts ("\n");
   1065     }
   1066 }
   1067 
   1068 /* Display assorted information about the underlying OS.  */
   1069 static void
   1070 go32_sysinfo (const char *arg, int from_tty)
   1071 {
   1072   static const char test_pattern[] =
   1073     "deadbeafdeadbeafdeadbeafdeadbeafdeadbeaf"
   1074     "deadbeafdeadbeafdeadbeafdeadbeafdeadbeaf"
   1075     "deadbeafdeadbeafdeadbeafdeadbeafdeadbeafdeadbeaf";
   1076   struct utsname u;
   1077   char cpuid_vendor[13];
   1078   unsigned cpuid_max = 0, cpuid_eax, cpuid_ebx, cpuid_ecx, cpuid_edx;
   1079   unsigned true_dos_version = _get_dos_version (1);
   1080   unsigned advertized_dos_version = ((unsigned int)_osmajor << 8) | _osminor;
   1081   int dpmi_flags;
   1082   char dpmi_vendor_info[129];
   1083   int dpmi_vendor_available;
   1084   __dpmi_version_ret dpmi_version_data;
   1085   long eflags;
   1086   __dpmi_free_mem_info mem_info;
   1087   __dpmi_regs regs;
   1088 
   1089   cpuid_vendor[0] = '\0';
   1090   if (uname (&u))
   1091     strcpy (u.machine, "Unknown x86");
   1092   else if (u.machine[0] == 'i' && u.machine[1] > 4)
   1093     {
   1094       /* CPUID with EAX = 0 returns the Vendor ID.  */
   1095 #if 0
   1096       /* Ideally we would use x86_cpuid(), but it needs someone to run
   1097 	 native tests first to make sure things actually work.  They should.
   1098 	 http://sourceware.org/ml/gdb-patches/2013-05/msg00164.html  */
   1099       unsigned int eax, ebx, ecx, edx;
   1100 
   1101       if (x86_cpuid (0, &eax, &ebx, &ecx, &edx))
   1102 	{
   1103 	  cpuid_max = eax;
   1104 	  memcpy (&vendor[0], &ebx, 4);
   1105 	  memcpy (&vendor[4], &ecx, 4);
   1106 	  memcpy (&vendor[8], &edx, 4);
   1107 	  cpuid_vendor[12] = '\0';
   1108 	}
   1109 #else
   1110       __asm__ __volatile__ ("xorl   %%ebx, %%ebx;"
   1111 			    "xorl   %%ecx, %%ecx;"
   1112 			    "xorl   %%edx, %%edx;"
   1113 			    "movl   $0,    %%eax;"
   1114 			    "cpuid;"
   1115 			    "movl   %%ebx,  %0;"
   1116 			    "movl   %%edx,  %1;"
   1117 			    "movl   %%ecx,  %2;"
   1118 			    "movl   %%eax,  %3;"
   1119 			    : "=m" (cpuid_vendor[0]),
   1120 			      "=m" (cpuid_vendor[4]),
   1121 			      "=m" (cpuid_vendor[8]),
   1122 			      "=m" (cpuid_max)
   1123 			    :
   1124 			    : "%eax", "%ebx", "%ecx", "%edx");
   1125       cpuid_vendor[12] = '\0';
   1126 #endif
   1127     }
   1128 
   1129   gdb_printf ("CPU Type.......................%s", u.machine);
   1130   if (cpuid_vendor[0])
   1131     gdb_printf (" (%s)", cpuid_vendor);
   1132   gdb_puts ("\n");
   1133 
   1134   /* CPUID with EAX = 1 returns processor signature and features.  */
   1135   if (cpuid_max >= 1)
   1136     {
   1137       static const char *brand_name[] = {
   1138 	"",
   1139 	" Celeron",
   1140 	" III",
   1141 	" III Xeon",
   1142 	"", "", "", "",
   1143 	" 4"
   1144       };
   1145       char cpu_string[80];
   1146       char cpu_brand[20];
   1147       unsigned brand_idx;
   1148       int intel_p = strcmp (cpuid_vendor, "GenuineIntel") == 0;
   1149       int amd_p = strcmp (cpuid_vendor, "AuthenticAMD") == 0;
   1150       int hygon_p = strcmp (cpuid_vendor, "HygonGenuine") == 0;
   1151       unsigned cpu_family, cpu_model;
   1152 
   1153 #if 0
   1154       /* See comment above about cpuid usage.  */
   1155       x86_cpuid (1, &cpuid_eax, &cpuid_ebx, NULL, &cpuid_edx);
   1156 #else
   1157       __asm__ __volatile__ ("movl   $1, %%eax;"
   1158 			    "cpuid;"
   1159 			    : "=a" (cpuid_eax),
   1160 			      "=b" (cpuid_ebx),
   1161 			      "=d" (cpuid_edx)
   1162 			    :
   1163 			    : "%ecx");
   1164 #endif
   1165       brand_idx = cpuid_ebx & 0xff;
   1166       cpu_family = (cpuid_eax >> 8) & 0xf;
   1167       cpu_model  = (cpuid_eax >> 4) & 0xf;
   1168       cpu_brand[0] = '\0';
   1169       if (intel_p)
   1170 	{
   1171 	  if (brand_idx > 0
   1172 	      && brand_idx < sizeof(brand_name)/sizeof(brand_name[0])
   1173 	      && *brand_name[brand_idx])
   1174 	    strcpy (cpu_brand, brand_name[brand_idx]);
   1175 	  else if (cpu_family == 5)
   1176 	    {
   1177 	      if (((cpuid_eax >> 12) & 3) == 0 && cpu_model == 4)
   1178 		strcpy (cpu_brand, " MMX");
   1179 	      else if (cpu_model > 1 && ((cpuid_eax >> 12) & 3) == 1)
   1180 		strcpy (cpu_brand, " OverDrive");
   1181 	      else if (cpu_model > 1 && ((cpuid_eax >> 12) & 3) == 2)
   1182 		strcpy (cpu_brand, " Dual");
   1183 	    }
   1184 	  else if (cpu_family == 6 && cpu_model < 8)
   1185 	    {
   1186 	      switch (cpu_model)
   1187 		{
   1188 		  case 1:
   1189 		    strcpy (cpu_brand, " Pro");
   1190 		    break;
   1191 		  case 3:
   1192 		    strcpy (cpu_brand, " II");
   1193 		    break;
   1194 		  case 5:
   1195 		    strcpy (cpu_brand, " II Xeon");
   1196 		    break;
   1197 		  case 6:
   1198 		    strcpy (cpu_brand, " Celeron");
   1199 		    break;
   1200 		  case 7:
   1201 		    strcpy (cpu_brand, " III");
   1202 		    break;
   1203 		}
   1204 	    }
   1205 	}
   1206       else if (amd_p)
   1207 	{
   1208 	  switch (cpu_family)
   1209 	    {
   1210 	      case 4:
   1211 		strcpy (cpu_brand, "486/5x86");
   1212 		break;
   1213 	      case 5:
   1214 		switch (cpu_model)
   1215 		  {
   1216 		    case 0:
   1217 		    case 1:
   1218 		    case 2:
   1219 		    case 3:
   1220 		      strcpy (cpu_brand, "-K5");
   1221 		      break;
   1222 		    case 6:
   1223 		    case 7:
   1224 		      strcpy (cpu_brand, "-K6");
   1225 		      break;
   1226 		    case 8:
   1227 		      strcpy (cpu_brand, "-K6-2");
   1228 		      break;
   1229 		    case 9:
   1230 		      strcpy (cpu_brand, "-K6-III");
   1231 		      break;
   1232 		  }
   1233 		break;
   1234 	      case 6:
   1235 		switch (cpu_model)
   1236 		  {
   1237 		    case 1:
   1238 		    case 2:
   1239 		    case 4:
   1240 		      strcpy (cpu_brand, " Athlon");
   1241 		      break;
   1242 		    case 3:
   1243 		      strcpy (cpu_brand, " Duron");
   1244 		      break;
   1245 		  }
   1246 		break;
   1247 	    }
   1248 	}
   1249       xsnprintf (cpu_string, sizeof (cpu_string), "%s%s Model %d Stepping %d",
   1250 		 intel_p ? "Pentium" : (amd_p ? "AMD" : (hygon_p ? "Hygon" : "ix86")),
   1251 		 cpu_brand, cpu_model, cpuid_eax & 0xf);
   1252       gdb_printf ("%*s%s\n", 31, "", cpu_string);
   1253       if (((cpuid_edx & (6 | (0x0d << 23))) != 0)
   1254 	  || ((cpuid_edx & 1) == 0)
   1255 	  || ((amd_p || hygon_p) && (cpuid_edx & (3 << 30)) != 0))
   1256 	{
   1257 	  gdb_puts ("CPU Features...................");
   1258 	  /* We only list features which might be useful in the DPMI
   1259 	     environment.  */
   1260 	  if ((cpuid_edx & 1) == 0)
   1261 	    gdb_puts ("No FPU "); /* It's unusual to not have an FPU.  */
   1262 	  if ((cpuid_edx & (1 << 1)) != 0)
   1263 	    gdb_puts ("VME ");
   1264 	  if ((cpuid_edx & (1 << 2)) != 0)
   1265 	    gdb_puts ("DE ");
   1266 	  if ((cpuid_edx & (1 << 4)) != 0)
   1267 	    gdb_puts ("TSC ");
   1268 	  if ((cpuid_edx & (1 << 23)) != 0)
   1269 	    gdb_puts ("MMX ");
   1270 	  if ((cpuid_edx & (1 << 25)) != 0)
   1271 	    gdb_puts ("SSE ");
   1272 	  if ((cpuid_edx & (1 << 26)) != 0)
   1273 	    gdb_puts ("SSE2 ");
   1274 	  if (amd_p || hygon_p)
   1275 	    {
   1276 	      if ((cpuid_edx & (1 << 31)) != 0)
   1277 		gdb_puts ("3DNow! ");
   1278 	      if ((cpuid_edx & (1 << 30)) != 0)
   1279 		gdb_puts ("3DNow!Ext");
   1280 	    }
   1281 	  gdb_puts ("\n");
   1282 	}
   1283     }
   1284   gdb_puts ("\n");
   1285   gdb_printf ("DOS Version....................%s %s.%s",
   1286 	      _os_flavor, u.release, u.version);
   1287   if (true_dos_version != advertized_dos_version)
   1288     gdb_printf (" (disguised as v%d.%d)", _osmajor, _osminor);
   1289   gdb_puts ("\n");
   1290   if (!windows_major)
   1291     go32_get_windows_version ();
   1292   if (windows_major != 0xff)
   1293     {
   1294       const char *windows_flavor;
   1295 
   1296       gdb_printf ("Windows Version................%d.%02d (Windows ",
   1297 		  windows_major, windows_minor);
   1298       switch (windows_major)
   1299 	{
   1300 	  case 3:
   1301 	    windows_flavor = "3.X";
   1302 	    break;
   1303 	  case 4:
   1304 	    switch (windows_minor)
   1305 	      {
   1306 		case 0:
   1307 		  windows_flavor = "95, 95A, or 95B";
   1308 		  break;
   1309 		case 3:
   1310 		  windows_flavor = "95B OSR2.1 or 95C OSR2.5";
   1311 		  break;
   1312 		case 10:
   1313 		  windows_flavor = "98 or 98 SE";
   1314 		  break;
   1315 		case 90:
   1316 		  windows_flavor = "ME";
   1317 		  break;
   1318 		default:
   1319 		  windows_flavor = "9X";
   1320 		  break;
   1321 	      }
   1322 	    break;
   1323 	  default:
   1324 	    windows_flavor = "??";
   1325 	    break;
   1326 	}
   1327       gdb_printf ("%s)\n", windows_flavor);
   1328     }
   1329   else if (true_dos_version == 0x532 && advertized_dos_version == 0x500)
   1330     gdb_printf ("Windows Version................"
   1331 		"Windows NT family (W2K/XP/W2K3/Vista/W2K8)\n");
   1332   gdb_puts ("\n");
   1333   /* On some versions of Windows, __dpmi_get_capabilities returns
   1334      zero, but the buffer is not filled with info, so we fill the
   1335      buffer with a known pattern and test for it afterwards.  */
   1336   memcpy (dpmi_vendor_info, test_pattern, sizeof(dpmi_vendor_info));
   1337   dpmi_vendor_available =
   1338     __dpmi_get_capabilities (&dpmi_flags, dpmi_vendor_info);
   1339   if (dpmi_vendor_available == 0
   1340       && memcmp (dpmi_vendor_info, test_pattern,
   1341 		 sizeof(dpmi_vendor_info)) != 0)
   1342     {
   1343       /* The DPMI spec says the vendor string should be ASCIIZ, but
   1344 	 I don't trust the vendors to follow that...  */
   1345       if (!memchr (&dpmi_vendor_info[2], 0, 126))
   1346 	dpmi_vendor_info[128] = '\0';
   1347       gdb_printf ("DPMI Host......................"
   1348 		  "%s v%d.%d (capabilities: %#x)\n",
   1349 		  &dpmi_vendor_info[2],
   1350 		  (unsigned)dpmi_vendor_info[0],
   1351 		  (unsigned)dpmi_vendor_info[1],
   1352 		  ((unsigned)dpmi_flags & 0x7f));
   1353     }
   1354   else
   1355     gdb_printf ("DPMI Host......................(Info not available)\n");
   1356   __dpmi_get_version (&dpmi_version_data);
   1357   gdb_printf ("DPMI Version...................%d.%02d\n",
   1358 	      dpmi_version_data.major, dpmi_version_data.minor);
   1359   gdb_printf ("DPMI Info......................"
   1360 	      "%s-bit DPMI, with%s Virtual Memory support\n",
   1361 	      (dpmi_version_data.flags & 1) ? "32" : "16",
   1362 	      (dpmi_version_data.flags & 4) ? "" : "out");
   1363   gdb_printf ("%*sInterrupts reflected to %s mode\n", 31, "",
   1364 	      (dpmi_version_data.flags & 2) ? "V86" : "Real");
   1365   gdb_printf ("%*sProcessor type: i%d86\n", 31, "",
   1366 	      dpmi_version_data.cpu);
   1367   gdb_printf ("%*sPIC base interrupt: Master: %#x  Slave: %#x\n", 31, "",
   1368 	      dpmi_version_data.master_pic, dpmi_version_data.slave_pic);
   1369 
   1370   /* a_tss is only initialized when the debuggee is first run.  */
   1371   if (prog_has_started)
   1372     {
   1373       __asm__ __volatile__ ("pushfl ; popl %0" : "=g" (eflags));
   1374       gdb_printf ("Protection....................."
   1375 		  "Ring %d (in %s), with%s I/O protection\n",
   1376 		  a_tss.tss_cs & 3, (a_tss.tss_cs & 4) ? "LDT" : "GDT",
   1377 		  (a_tss.tss_cs & 3) > ((eflags >> 12) & 3) ? "" : "out");
   1378     }
   1379   gdb_puts ("\n");
   1380   __dpmi_get_free_memory_information (&mem_info);
   1381   print_mem (mem_info.total_number_of_physical_pages,
   1382 	     "DPMI Total Physical Memory.....", 1);
   1383   print_mem (mem_info.total_number_of_free_pages,
   1384 	     "DPMI Free Physical Memory......", 1);
   1385   print_mem (mem_info.size_of_paging_file_partition_in_pages,
   1386 	     "DPMI Swap Space................", 1);
   1387   print_mem (mem_info.linear_address_space_size_in_pages,
   1388 	     "DPMI Total Linear Address Size.", 1);
   1389   print_mem (mem_info.free_linear_address_space_in_pages,
   1390 	     "DPMI Free Linear Address Size..", 1);
   1391   print_mem (mem_info.largest_available_free_block_in_bytes,
   1392 	     "DPMI Largest Free Memory Block.", 0);
   1393 
   1394   regs.h.ah = 0x48;
   1395   regs.x.bx = 0xffff;
   1396   __dpmi_int (0x21, &regs);
   1397   print_mem (regs.x.bx << 4, "Free DOS Memory................", 0);
   1398   regs.x.ax = 0x5800;
   1399   __dpmi_int (0x21, &regs);
   1400   if ((regs.x.flags & 1) == 0)
   1401     {
   1402       static const char *dos_hilo[] = {
   1403 	"Low", "", "", "", "High", "", "", "", "High, then Low"
   1404       };
   1405       static const char *dos_fit[] = {
   1406 	"First", "Best", "Last"
   1407       };
   1408       int hilo_idx = (regs.x.ax >> 4) & 0x0f;
   1409       int fit_idx  = regs.x.ax & 0x0f;
   1410 
   1411       if (hilo_idx > 8)
   1412 	hilo_idx = 0;
   1413       if (fit_idx > 2)
   1414 	fit_idx = 0;
   1415       gdb_printf ("DOS Memory Allocation..........%s memory, %s fit\n",
   1416 		  dos_hilo[hilo_idx], dos_fit[fit_idx]);
   1417       regs.x.ax = 0x5802;
   1418       __dpmi_int (0x21, &regs);
   1419       if ((regs.x.flags & 1) != 0)
   1420 	regs.h.al = 0;
   1421       gdb_printf ("%*sUMBs %sin DOS memory chain\n", 31, "",
   1422 		  regs.h.al == 0 ? "not " : "");
   1423     }
   1424 }
   1425 
   1426 struct seg_descr {
   1427   unsigned short limit0;
   1428   unsigned short base0;
   1429   unsigned char  base1;
   1430   unsigned       stype:5;
   1431   unsigned       dpl:2;
   1432   unsigned       present:1;
   1433   unsigned       limit1:4;
   1434   unsigned       available:1;
   1435   unsigned       dummy:1;
   1436   unsigned       bit32:1;
   1437   unsigned       page_granular:1;
   1438   unsigned char  base2;
   1439 } __attribute__ ((packed));
   1440 
   1441 struct gate_descr {
   1442   unsigned short offset0;
   1443   unsigned short selector;
   1444   unsigned       param_count:5;
   1445   unsigned       dummy:3;
   1446   unsigned       stype:5;
   1447   unsigned       dpl:2;
   1448   unsigned       present:1;
   1449   unsigned short offset1;
   1450 } __attribute__ ((packed));
   1451 
   1452 /* Read LEN bytes starting at logical address ADDR, and put the result
   1453    into DEST.  Return 1 if success, zero if not.  */
   1454 static int
   1455 read_memory_region (unsigned long addr, void *dest, size_t len)
   1456 {
   1457   unsigned long dos_ds_limit = __dpmi_get_segment_limit (_dos_ds);
   1458   int retval = 1;
   1459 
   1460   /* For the low memory, we can simply use _dos_ds.  */
   1461   if (addr <= dos_ds_limit - len)
   1462     dosmemget (addr, len, dest);
   1463   else
   1464     {
   1465       /* For memory above 1MB we need to set up a special segment to
   1466 	 be able to access that memory.  */
   1467       int sel = __dpmi_allocate_ldt_descriptors (1);
   1468 
   1469       if (sel <= 0)
   1470 	retval = 0;
   1471       else
   1472 	{
   1473 	  int access_rights = __dpmi_get_descriptor_access_rights (sel);
   1474 	  size_t segment_limit = len - 1;
   1475 
   1476 	  /* Make sure the crucial bits in the descriptor access
   1477 	     rights are set correctly.  Some DPMI providers might barf
   1478 	     if we set the segment limit to something that is not an
   1479 	     integral multiple of 4KB pages if the granularity bit is
   1480 	     not set to byte-granular, even though the DPMI spec says
   1481 	     it's the host's responsibility to set that bit correctly.  */
   1482 	  if (len > 1024 * 1024)
   1483 	    {
   1484 	      access_rights |= 0x8000;
   1485 	      /* Page-granular segments should have the low 12 bits of
   1486 		 the limit set.  */
   1487 	      segment_limit |= 0xfff;
   1488 	    }
   1489 	  else
   1490 	    access_rights &= ~0x8000;
   1491 
   1492 	  if (__dpmi_set_segment_base_address (sel, addr) != -1
   1493 	      && __dpmi_set_descriptor_access_rights (sel, access_rights) != -1
   1494 	      && __dpmi_set_segment_limit (sel, segment_limit) != -1
   1495 	      /* W2K silently fails to set the segment limit, leaving
   1496 		 it at zero; this test avoids the resulting crash.  */
   1497 	      && __dpmi_get_segment_limit (sel) >= segment_limit)
   1498 	    movedata (sel, 0, _my_ds (), (unsigned)dest, len);
   1499 	  else
   1500 	    retval = 0;
   1501 
   1502 	  __dpmi_free_ldt_descriptor (sel);
   1503 	}
   1504     }
   1505   return retval;
   1506 }
   1507 
   1508 /* Get a segment descriptor stored at index IDX in the descriptor
   1509    table whose base address is TABLE_BASE.  Return the descriptor
   1510    type, or -1 if failure.  */
   1511 static int
   1512 get_descriptor (unsigned long table_base, int idx, void *descr)
   1513 {
   1514   unsigned long addr = table_base + idx * 8; /* 8 bytes per entry */
   1515 
   1516   if (read_memory_region (addr, descr, 8))
   1517     return (int)((struct seg_descr *)descr)->stype;
   1518   return -1;
   1519 }
   1520 
   1521 struct dtr_reg {
   1522   unsigned short limit __attribute__((packed));
   1523   unsigned long  base  __attribute__((packed));
   1524 };
   1525 
   1526 /* Display a segment descriptor stored at index IDX in a descriptor
   1527    table whose type is TYPE and whose base address is BASE_ADDR.  If
   1528    FORCE is non-zero, display even invalid descriptors.  */
   1529 static void
   1530 display_descriptor (unsigned type, unsigned long base_addr, int idx, int force)
   1531 {
   1532   struct seg_descr descr;
   1533   struct gate_descr gate;
   1534 
   1535   /* Get the descriptor from the table.  */
   1536   if (idx == 0 && type == 0)
   1537     gdb_puts ("0x000: null descriptor\n");
   1538   else if (get_descriptor (base_addr, idx, &descr) != -1)
   1539     {
   1540       /* For each type of descriptor table, this has a bit set if the
   1541 	 corresponding type of selectors is valid in that table.  */
   1542       static unsigned allowed_descriptors[] = {
   1543 	  0xffffdafeL,   /* GDT */
   1544 	  0x0000c0e0L,   /* IDT */
   1545 	  0xffffdafaL    /* LDT */
   1546       };
   1547 
   1548       /* If the program hasn't started yet, assume the debuggee will
   1549 	 have the same CPL as the debugger.  */
   1550       int cpl = prog_has_started ? (a_tss.tss_cs & 3) : _my_cs () & 3;
   1551       unsigned long limit = (descr.limit1 << 16) | descr.limit0;
   1552 
   1553       if (descr.present
   1554 	  && (allowed_descriptors[type] & (1 << descr.stype)) != 0)
   1555 	{
   1556 	  gdb_printf ("0x%03x: ",
   1557 		      type == 1
   1558 		      ? idx : (idx * 8) | (type ? (cpl | 4) : 0));
   1559 	  if (descr.page_granular)
   1560 	    limit = (limit << 12) | 0xfff; /* big segment: low 12 bit set */
   1561 	  if (descr.stype == 1 || descr.stype == 2 || descr.stype == 3
   1562 	      || descr.stype == 9 || descr.stype == 11
   1563 	      || (descr.stype >= 16 && descr.stype < 32))
   1564 	    gdb_printf ("base=0x%02x%02x%04x limit=0x%08lx",
   1565 			descr.base2, descr.base1, descr.base0, limit);
   1566 
   1567 	  switch (descr.stype)
   1568 	    {
   1569 	      case 1:
   1570 	      case 3:
   1571 		gdb_printf (" 16-bit TSS  (task %sactive)",
   1572 			    descr.stype == 3 ? "" : "in");
   1573 		break;
   1574 	      case 2:
   1575 		gdb_puts (" LDT");
   1576 		break;
   1577 	      case 4:
   1578 		memcpy (&gate, &descr, sizeof gate);
   1579 		gdb_printf ("selector=0x%04x  offs=0x%04x%04x",
   1580 			    gate.selector, gate.offset1, gate.offset0);
   1581 		gdb_printf (" 16-bit Call Gate (params=%d)",
   1582 			    gate.param_count);
   1583 		break;
   1584 	      case 5:
   1585 		gdb_printf ("TSS selector=0x%04x", descr.base0);
   1586 		gdb_printf ("%*sTask Gate", 16, "");
   1587 		break;
   1588 	      case 6:
   1589 	      case 7:
   1590 		memcpy (&gate, &descr, sizeof gate);
   1591 		gdb_printf ("selector=0x%04x  offs=0x%04x%04x",
   1592 			    gate.selector, gate.offset1, gate.offset0);
   1593 		gdb_printf (" 16-bit %s Gate",
   1594 			    descr.stype == 6 ? "Interrupt" : "Trap");
   1595 		break;
   1596 	      case 9:
   1597 	      case 11:
   1598 		gdb_printf (" 32-bit TSS (task %sactive)",
   1599 			    descr.stype == 3 ? "" : "in");
   1600 		break;
   1601 	      case 12:
   1602 		memcpy (&gate, &descr, sizeof gate);
   1603 		gdb_printf ("selector=0x%04x  offs=0x%04x%04x",
   1604 			    gate.selector, gate.offset1, gate.offset0);
   1605 		gdb_printf (" 32-bit Call Gate (params=%d)",
   1606 			    gate.param_count);
   1607 		break;
   1608 	      case 14:
   1609 	      case 15:
   1610 		memcpy (&gate, &descr, sizeof gate);
   1611 		gdb_printf ("selector=0x%04x  offs=0x%04x%04x",
   1612 			    gate.selector, gate.offset1, gate.offset0);
   1613 		gdb_printf (" 32-bit %s Gate",
   1614 			    descr.stype == 14 ? "Interrupt" : "Trap");
   1615 		break;
   1616 	      case 16:		/* data segments */
   1617 	      case 17:
   1618 	      case 18:
   1619 	      case 19:
   1620 	      case 20:
   1621 	      case 21:
   1622 	      case 22:
   1623 	      case 23:
   1624 		gdb_printf (" %s-bit Data (%s Exp-%s%s)",
   1625 			    descr.bit32 ? "32" : "16",
   1626 			    descr.stype & 2
   1627 			    ? "Read/Write," : "Read-Only, ",
   1628 			    descr.stype & 4 ? "down" : "up",
   1629 			    descr.stype & 1 ? "" : ", N.Acc");
   1630 		break;
   1631 	      case 24:		/* code segments */
   1632 	      case 25:
   1633 	      case 26:
   1634 	      case 27:
   1635 	      case 28:
   1636 	      case 29:
   1637 	      case 30:
   1638 	      case 31:
   1639 		gdb_printf (" %s-bit Code (%s,  %sConf%s)",
   1640 			    descr.bit32 ? "32" : "16",
   1641 			    descr.stype & 2 ? "Exec/Read" : "Exec-Only",
   1642 			    descr.stype & 4 ? "" : "N.",
   1643 			    descr.stype & 1 ? "" : ", N.Acc");
   1644 		break;
   1645 	      default:
   1646 		gdb_printf ("Unknown type 0x%02x", descr.stype);
   1647 		break;
   1648 	    }
   1649 	  gdb_puts ("\n");
   1650 	}
   1651       else if (force)
   1652 	{
   1653 	  gdb_printf ("0x%03x: ",
   1654 		      type == 1
   1655 		      ? idx : (idx * 8) | (type ? (cpl | 4) : 0));
   1656 	  if (!descr.present)
   1657 	    gdb_puts ("Segment not present\n");
   1658 	  else
   1659 	    gdb_printf ("Segment type 0x%02x is invalid in this table\n",
   1660 			descr.stype);
   1661 	}
   1662     }
   1663   else if (force)
   1664     gdb_printf ("0x%03x: Cannot read this descriptor\n", idx);
   1665 }
   1666 
   1667 static void
   1668 go32_sldt (const char *arg, int from_tty)
   1669 {
   1670   struct dtr_reg gdtr;
   1671   unsigned short ldtr = 0;
   1672   int ldt_idx;
   1673   struct seg_descr ldt_descr;
   1674   long ldt_entry = -1L;
   1675   int cpl = (prog_has_started ? a_tss.tss_cs : _my_cs ()) & 3;
   1676 
   1677   if (arg && *arg)
   1678     {
   1679       arg = skip_spaces (arg);
   1680 
   1681       if (*arg)
   1682 	{
   1683 	  ldt_entry = parse_and_eval_long (arg);
   1684 	  if (ldt_entry < 0
   1685 	      || (ldt_entry & 4) == 0
   1686 	      || (ldt_entry & 3) != (cpl & 3))
   1687 	    error (_("Invalid LDT entry 0x%03lx."), (unsigned long)ldt_entry);
   1688 	}
   1689     }
   1690 
   1691   __asm__ __volatile__ ("sgdt   %0" : "=m" (gdtr) : /* no inputs */ );
   1692   __asm__ __volatile__ ("sldt   %0" : "=m" (ldtr) : /* no inputs */ );
   1693   ldt_idx = ldtr / 8;
   1694   if (ldt_idx == 0)
   1695     gdb_puts ("There is no LDT.\n");
   1696   /* LDT's entry in the GDT must have the type LDT, which is 2.  */
   1697   else if (get_descriptor (gdtr.base, ldt_idx, &ldt_descr) != 2)
   1698     gdb_printf ("LDT is present (at %#x), but unreadable by GDB.\n",
   1699 		ldt_descr.base0
   1700 		| (ldt_descr.base1 << 16)
   1701 		| (ldt_descr.base2 << 24));
   1702   else
   1703     {
   1704       unsigned base =
   1705 	ldt_descr.base0
   1706 	| (ldt_descr.base1 << 16)
   1707 	| (ldt_descr.base2 << 24);
   1708       unsigned limit = ldt_descr.limit0 | (ldt_descr.limit1 << 16);
   1709       int max_entry;
   1710 
   1711       if (ldt_descr.page_granular)
   1712 	/* Page-granular segments must have the low 12 bits of their
   1713 	   limit set.  */
   1714 	limit = (limit << 12) | 0xfff;
   1715       /* LDT cannot have more than 8K 8-byte entries, i.e. more than
   1716 	 64KB.  */
   1717       if (limit > 0xffff)
   1718 	limit = 0xffff;
   1719 
   1720       max_entry = (limit + 1) / 8;
   1721 
   1722       if (ldt_entry >= 0)
   1723 	{
   1724 	  if (ldt_entry > limit)
   1725 	    error (_("Invalid LDT entry %#lx: outside valid limits [0..%#x]"),
   1726 		   (unsigned long)ldt_entry, limit);
   1727 
   1728 	  display_descriptor (ldt_descr.stype, base, ldt_entry / 8, 1);
   1729 	}
   1730       else
   1731 	{
   1732 	  int i;
   1733 
   1734 	  for (i = 0; i < max_entry; i++)
   1735 	    display_descriptor (ldt_descr.stype, base, i, 0);
   1736 	}
   1737     }
   1738 }
   1739 
   1740 static void
   1741 go32_sgdt (const char *arg, int from_tty)
   1742 {
   1743   struct dtr_reg gdtr;
   1744   long gdt_entry = -1L;
   1745   int max_entry;
   1746 
   1747   if (arg && *arg)
   1748     {
   1749       arg = skip_spaces (arg);
   1750 
   1751       if (*arg)
   1752 	{
   1753 	  gdt_entry = parse_and_eval_long (arg);
   1754 	  if (gdt_entry < 0 || (gdt_entry & 7) != 0)
   1755 	    error (_("Invalid GDT entry 0x%03lx: "
   1756 		     "not an integral multiple of 8."),
   1757 		   (unsigned long)gdt_entry);
   1758 	}
   1759     }
   1760 
   1761   __asm__ __volatile__ ("sgdt   %0" : "=m" (gdtr) : /* no inputs */ );
   1762   max_entry = (gdtr.limit + 1) / 8;
   1763 
   1764   if (gdt_entry >= 0)
   1765     {
   1766       if (gdt_entry > gdtr.limit)
   1767 	error (_("Invalid GDT entry %#lx: outside valid limits [0..%#x]"),
   1768 	       (unsigned long)gdt_entry, gdtr.limit);
   1769 
   1770       display_descriptor (0, gdtr.base, gdt_entry / 8, 1);
   1771     }
   1772   else
   1773     {
   1774       int i;
   1775 
   1776       for (i = 0; i < max_entry; i++)
   1777 	display_descriptor (0, gdtr.base, i, 0);
   1778     }
   1779 }
   1780 
   1781 static void
   1782 go32_sidt (const char *arg, int from_tty)
   1783 {
   1784   struct dtr_reg idtr;
   1785   long idt_entry = -1L;
   1786   int max_entry;
   1787 
   1788   if (arg && *arg)
   1789     {
   1790       arg = skip_spaces (arg);
   1791 
   1792       if (*arg)
   1793 	{
   1794 	  idt_entry = parse_and_eval_long (arg);
   1795 	  if (idt_entry < 0)
   1796 	    error (_("Invalid (negative) IDT entry %ld."), idt_entry);
   1797 	}
   1798     }
   1799 
   1800   __asm__ __volatile__ ("sidt   %0" : "=m" (idtr) : /* no inputs */ );
   1801   max_entry = (idtr.limit + 1) / 8;
   1802   if (max_entry > 0x100)	/* No more than 256 entries.  */
   1803     max_entry = 0x100;
   1804 
   1805   if (idt_entry >= 0)
   1806     {
   1807       if (idt_entry > idtr.limit)
   1808 	error (_("Invalid IDT entry %#lx: outside valid limits [0..%#x]"),
   1809 	       (unsigned long)idt_entry, idtr.limit);
   1810 
   1811       display_descriptor (1, idtr.base, idt_entry, 1);
   1812     }
   1813   else
   1814     {
   1815       int i;
   1816 
   1817       for (i = 0; i < max_entry; i++)
   1818 	display_descriptor (1, idtr.base, i, 0);
   1819     }
   1820 }
   1821 
   1822 /* Cached linear address of the base of the page directory.  For
   1823    now, available only under CWSDPMI.  Code based on ideas and
   1824    suggestions from Charles Sandmann <sandmann (at) clio.rice.edu>.  */
   1825 static unsigned long pdbr;
   1826 
   1827 static unsigned long
   1828 get_cr3 (void)
   1829 {
   1830   unsigned offset;
   1831   unsigned taskreg;
   1832   unsigned long taskbase, cr3;
   1833   struct dtr_reg gdtr;
   1834 
   1835   if (pdbr > 0 && pdbr <= 0xfffff)
   1836     return pdbr;
   1837 
   1838   /* Get the linear address of GDT and the Task Register.  */
   1839   __asm__ __volatile__ ("sgdt   %0" : "=m" (gdtr) : /* no inputs */ );
   1840   __asm__ __volatile__ ("str    %0" : "=m" (taskreg) : /* no inputs */ );
   1841 
   1842   /* Task Register is a segment selector for the TSS of the current
   1843      task.  Therefore, it can be used as an index into the GDT to get
   1844      at the segment descriptor for the TSS.  To get the index, reset
   1845      the low 3 bits of the selector (which give the CPL).  Add 2 to the
   1846      offset to point to the 3 low bytes of the base address.  */
   1847   offset = gdtr.base + (taskreg & 0xfff8) + 2;
   1848 
   1849 
   1850   /* CWSDPMI's task base is always under the 1MB mark.  */
   1851   if (offset > 0xfffff)
   1852     return 0;
   1853 
   1854   _farsetsel (_dos_ds);
   1855   taskbase  = _farnspeekl (offset) & 0xffffffU;
   1856   taskbase += _farnspeekl (offset + 2) & 0xff000000U;
   1857   if (taskbase > 0xfffff)
   1858     return 0;
   1859 
   1860   /* CR3 (a.k.a. PDBR, the Page Directory Base Register) is stored at
   1861      offset 1Ch in the TSS.  */
   1862   cr3 = _farnspeekl (taskbase + 0x1c) & ~0xfff;
   1863   if (cr3 > 0xfffff)
   1864     {
   1865 #if 0  /* Not fully supported yet.  */
   1866       /* The Page Directory is in UMBs.  In that case, CWSDPMI puts
   1867 	 the first Page Table right below the Page Directory.  Thus,
   1868 	 the first Page Table's entry for its own address and the Page
   1869 	 Directory entry for that Page Table will hold the same
   1870 	 physical address.  The loop below searches the entire UMB
   1871 	 range of addresses for such an occurrence.  */
   1872       unsigned long addr, pte_idx;
   1873 
   1874       for (addr = 0xb0000, pte_idx = 0xb0;
   1875 	   pte_idx < 0xff;
   1876 	   addr += 0x1000, pte_idx++)
   1877 	{
   1878 	  if (((_farnspeekl (addr + 4 * pte_idx) & 0xfffff027) ==
   1879 	       (_farnspeekl (addr + 0x1000) & 0xfffff027))
   1880 	      && ((_farnspeekl (addr + 4 * pte_idx + 4) & 0xfffff000) == cr3))
   1881 	    {
   1882 	      cr3 = addr + 0x1000;
   1883 	      break;
   1884 	    }
   1885 	}
   1886 #endif
   1887 
   1888       if (cr3 > 0xfffff)
   1889 	cr3 = 0;
   1890     }
   1891 
   1892   return cr3;
   1893 }
   1894 
   1895 /* Return the N'th Page Directory entry.  */
   1896 static unsigned long
   1897 get_pde (int n)
   1898 {
   1899   unsigned long pde = 0;
   1900 
   1901   if (pdbr && n >= 0 && n < 1024)
   1902     {
   1903       pde = _farpeekl (_dos_ds, pdbr + 4*n);
   1904     }
   1905   return pde;
   1906 }
   1907 
   1908 /* Return the N'th entry of the Page Table whose Page Directory entry
   1909    is PDE.  */
   1910 static unsigned long
   1911 get_pte (unsigned long pde, int n)
   1912 {
   1913   unsigned long pte = 0;
   1914 
   1915   /* pde & 0x80 tests the 4MB page bit.  We don't support 4MB
   1916      page tables, for now.  */
   1917   if ((pde & 1) && !(pde & 0x80) && n >= 0 && n < 1024)
   1918     {
   1919       pde &= ~0xfff;	/* Clear non-address bits.  */
   1920       pte = _farpeekl (_dos_ds, pde + 4*n);
   1921     }
   1922   return pte;
   1923 }
   1924 
   1925 /* Display a Page Directory or Page Table entry.  IS_DIR, if non-zero,
   1926    says this is a Page Directory entry.  If FORCE is non-zero, display
   1927    the entry even if its Present flag is off.  OFF is the offset of the
   1928    address from the page's base address.  */
   1929 static void
   1930 display_ptable_entry (unsigned long entry, int is_dir, int force, unsigned off)
   1931 {
   1932   if ((entry & 1) != 0)
   1933     {
   1934       gdb_printf ("Base=0x%05lx000", entry >> 12);
   1935       if ((entry & 0x100) && !is_dir)
   1936 	gdb_puts (" Global");
   1937       if ((entry & 0x40) && !is_dir)
   1938 	gdb_puts (" Dirty");
   1939       gdb_printf (" %sAcc.", (entry & 0x20) ? "" : "Not-");
   1940       gdb_printf (" %sCached", (entry & 0x10) ? "" : "Not-");
   1941       gdb_printf (" Write-%s", (entry & 8) ? "Thru" : "Back");
   1942       gdb_printf (" %s", (entry & 4) ? "Usr" : "Sup");
   1943       gdb_printf (" Read-%s", (entry & 2) ? "Write" : "Only");
   1944       if (off)
   1945 	gdb_printf (" +0x%x", off);
   1946       gdb_puts ("\n");
   1947     }
   1948   else if (force)
   1949     gdb_printf ("Page%s not present or not supported; value=0x%lx.\n",
   1950 		is_dir ? " Table" : "", entry >> 1);
   1951 }
   1952 
   1953 static void
   1954 go32_pde (const char *arg, int from_tty)
   1955 {
   1956   long pde_idx = -1, i;
   1957 
   1958   if (arg && *arg)
   1959     {
   1960       arg = skip_spaces (arg);
   1961 
   1962       if (*arg)
   1963 	{
   1964 	  pde_idx = parse_and_eval_long (arg);
   1965 	  if (pde_idx < 0 || pde_idx >= 1024)
   1966 	    error (_("Entry %ld is outside valid limits [0..1023]."), pde_idx);
   1967 	}
   1968     }
   1969 
   1970   pdbr = get_cr3 ();
   1971   if (!pdbr)
   1972     gdb_puts ("Access to Page Directories is "
   1973 	      "not supported on this system.\n");
   1974   else if (pde_idx >= 0)
   1975     display_ptable_entry (get_pde (pde_idx), 1, 1, 0);
   1976   else
   1977     for (i = 0; i < 1024; i++)
   1978       display_ptable_entry (get_pde (i), 1, 0, 0);
   1979 }
   1980 
   1981 /* A helper function to display entries in a Page Table pointed to by
   1982    the N'th entry in the Page Directory.  If FORCE is non-zero, say
   1983    something even if the Page Table is not accessible.  */
   1984 static void
   1985 display_page_table (long n, int force)
   1986 {
   1987   unsigned long pde = get_pde (n);
   1988 
   1989   if ((pde & 1) != 0)
   1990     {
   1991       int i;
   1992 
   1993       gdb_printf ("Page Table pointed to by "
   1994 		  "Page Directory entry 0x%lx:\n", n);
   1995       for (i = 0; i < 1024; i++)
   1996 	display_ptable_entry (get_pte (pde, i), 0, 0, 0);
   1997       gdb_puts ("\n");
   1998     }
   1999   else if (force)
   2000     gdb_printf ("Page Table not present; value=0x%lx.\n", pde >> 1);
   2001 }
   2002 
   2003 static void
   2004 go32_pte (const char *arg, int from_tty)
   2005 {
   2006   long pde_idx = -1L, i;
   2007 
   2008   if (arg && *arg)
   2009     {
   2010       arg = skip_spaces (arg);
   2011 
   2012       if (*arg)
   2013 	{
   2014 	  pde_idx = parse_and_eval_long (arg);
   2015 	  if (pde_idx < 0 || pde_idx >= 1024)
   2016 	    error (_("Entry %ld is outside valid limits [0..1023]."), pde_idx);
   2017 	}
   2018     }
   2019 
   2020   pdbr = get_cr3 ();
   2021   if (!pdbr)
   2022     gdb_puts ("Access to Page Tables is not supported on this system.\n");
   2023   else if (pde_idx >= 0)
   2024     display_page_table (pde_idx, 1);
   2025   else
   2026     for (i = 0; i < 1024; i++)
   2027       display_page_table (i, 0);
   2028 }
   2029 
   2030 static void
   2031 go32_pte_for_address (const char *arg, int from_tty)
   2032 {
   2033   CORE_ADDR addr = 0, i;
   2034 
   2035   if (arg && *arg)
   2036     {
   2037       arg = skip_spaces (arg);
   2038 
   2039       if (*arg)
   2040 	addr = parse_and_eval_address (arg);
   2041     }
   2042   if (!addr)
   2043     error_no_arg (_("linear address"));
   2044 
   2045   pdbr = get_cr3 ();
   2046   if (!pdbr)
   2047     gdb_puts ("Access to Page Tables is not supported on this system.\n");
   2048   else
   2049     {
   2050       int pde_idx = (addr >> 22) & 0x3ff;
   2051       int pte_idx = (addr >> 12) & 0x3ff;
   2052       unsigned offs = addr & 0xfff;
   2053 
   2054       gdb_printf ("Page Table entry for address %s:\n",
   2055 		  hex_string(addr));
   2056       display_ptable_entry (get_pte (get_pde (pde_idx), pte_idx), 0, 1, offs);
   2057     }
   2058 }
   2059 
   2060 static struct cmd_list_element *info_dos_cmdlist = NULL;
   2061 
   2062 void _initialize_go32_nat ();
   2063 void
   2064 _initialize_go32_nat ()
   2065 {
   2066   x86_dr_low.set_control = go32_set_dr7;
   2067   x86_dr_low.set_addr = go32_set_dr;
   2068   x86_dr_low.get_status = go32_get_dr6;
   2069   x86_dr_low.get_control = go32_get_dr7;
   2070   x86_dr_low.get_addr = go32_get_dr;
   2071   x86_set_debug_register_length (4);
   2072 
   2073   add_inf_child_target (&the_go32_nat_target);
   2074 
   2075   /* Initialize child's cwd as empty to be initialized when starting
   2076      the child.  */
   2077   *child_cwd = 0;
   2078 
   2079   /* Initialize child's command line storage.  */
   2080   if (redir_debug_init (&child_cmd) == -1)
   2081     internal_error (_("Cannot allocate redirection storage: "
   2082 		      "not enough memory.\n"));
   2083 
   2084   /* We are always processing GCC-compiled programs.  */
   2085   processing_gcc_compilation = 2;
   2086 
   2087   add_basic_prefix_cmd ("dos", class_info, _("\
   2088 Print information specific to DJGPP (aka MS-DOS) debugging."),
   2089 			&info_dos_cmdlist, 0, &infolist);
   2090 
   2091   add_cmd ("sysinfo", class_info, go32_sysinfo, _("\
   2092 Display information about the target system, including CPU, OS, DPMI, etc."),
   2093 	   &info_dos_cmdlist);
   2094   add_cmd ("ldt", class_info, go32_sldt, _("\
   2095 Display entries in the LDT (Local Descriptor Table).\n\
   2096 Entry number (an expression) as an argument means display only that entry."),
   2097 	   &info_dos_cmdlist);
   2098   add_cmd ("gdt", class_info, go32_sgdt, _("\
   2099 Display entries in the GDT (Global Descriptor Table).\n\
   2100 Entry number (an expression) as an argument means display only that entry."),
   2101 	   &info_dos_cmdlist);
   2102   add_cmd ("idt", class_info, go32_sidt, _("\
   2103 Display entries in the IDT (Interrupt Descriptor Table).\n\
   2104 Entry number (an expression) as an argument means display only that entry."),
   2105 	   &info_dos_cmdlist);
   2106   add_cmd ("pde", class_info, go32_pde, _("\
   2107 Display entries in the Page Directory.\n\
   2108 Entry number (an expression) as an argument means display only that entry."),
   2109 	   &info_dos_cmdlist);
   2110   add_cmd ("pte", class_info, go32_pte, _("\
   2111 Display entries in Page Tables.\n\
   2112 Entry number (an expression) as an argument means display only entries\n\
   2113 from the Page Table pointed to by the specified Page Directory entry."),
   2114 	   &info_dos_cmdlist);
   2115   add_cmd ("address-pte", class_info, go32_pte_for_address, _("\
   2116 Display a Page Table entry for a linear address.\n\
   2117 The address argument must be a linear address, after adding to\n\
   2118 it the base address of the appropriate segment.\n\
   2119 The base address of variables and functions in the debuggee's data\n\
   2120 or code segment is stored in the variable __djgpp_base_address,\n\
   2121 so use `__djgpp_base_address + (char *)&var' as the argument.\n\
   2122 For other segments, look up their base address in the output of\n\
   2123 the `info dos ldt' command."),
   2124 	   &info_dos_cmdlist);
   2125 }
   2126 
   2127 pid_t
   2128 tcgetpgrp (int fd)
   2129 {
   2130   if (isatty (fd))
   2131     return SOME_PID;
   2132   errno = ENOTTY;
   2133   return -1;
   2134 }
   2135 
   2136 int
   2137 tcsetpgrp (int fd, pid_t pgid)
   2138 {
   2139   if (isatty (fd) && pgid == SOME_PID)
   2140     return 0;
   2141   errno = pgid == SOME_PID ? ENOTTY : ENOSYS;
   2142   return -1;
   2143 }
   2144