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