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