* go32-nat.c (go32_stop): Delete.
[deliverable/binutils-gdb.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 }
This page took 0.119162 seconds and 5 git commands to generate.