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.
6 This file is part of GDB.
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.
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.
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/>. */
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
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:
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)
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.
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!
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.
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
89 #include "gdbthread.h"
94 #include "floatformat.h"
96 #include "i387-tdep.h"
97 #include "i386-tdep.h"
100 #include "gdb_string.h"
103 #include <stdio.h> /* might be required for __DJGPP_MINOR__ */
108 #include <sys/utsname.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>
120 #include <langinfo.h>
122 #if __DJGPP_MINOR__ < 3
123 /* This code will be provided from DJGPP 2.03 on. Until then I code it
131 unsigned short exponent:15;
132 unsigned short sign:1;
138 unsigned int control;
143 unsigned int dataptr;
144 unsigned int datasel;
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 */
154 /* ------------------------------------------------------------------------- */
155 /* Store the contents of the NPX in the global variable `npx'. */
161 asm ("inb $0xa0, %%al \n\
162 testb $0x20, %%al \n\
180 /* ------------------------------------------------------------------------- */
181 /* Reload the contents of the NPX from the global variable `npx'. */
186 asm ("frstor %0":"=m" (npx));
188 /* ------------------------------------------------------------------------- */
189 /* Stubs for the missing redirection functions. */
196 redir_cmdline_delete (cmdline_t *ptr)
202 redir_cmdline_parse (const char *args, cmdline_t *ptr)
208 redir_to_child (cmdline_t *ptr)
214 redir_to_debugger (cmdline_t *ptr)
220 redir_debug_init (cmdline_t *ptr)
224 #endif /* __DJGPP_MINOR < 3 */
226 typedef enum { wp_insert, wp_remove, wp_count } wp_op;
228 /* This holds the current reference counts for each debug register. */
229 static int dr_ref_count[4];
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,
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);
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);
263 #define r_ofs(x) (offsetof(TSS,x))
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},
288 {0, 10}, /* 8 FP registers, from npx.reg[] */
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 */
311 enum target_signal gdb_sig;
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}
345 enum target_signal gdb_sig;
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
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}
365 go32_open (char *name, int from_tty)
367 printf_unfiltered ("Done. Use the \"run\" command to run the program.\n");
371 go32_close (int quitting)
376 go32_attach (struct target_ops *ops, char *args, int from_tty)
379 You cannot attach to a running program on this platform.\n\
380 Use the `run' command to run DJGPP programs."));
384 go32_detach (struct target_ops *ops, char *args, int from_tty)
388 static int resume_is_step;
389 static int resume_signal = -1;
392 go32_resume (struct target_ops *ops,
393 ptid_t ptid, int step, enum target_signal siggnal)
397 resume_is_step = step;
399 if (siggnal != TARGET_SIGNAL_0 && siggnal != TARGET_SIGNAL_TRAP)
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)
405 resume_signal = excepn_map[i].djgpp_excepno;
408 if (resume_signal == -1)
409 printf_unfiltered ("Cannot deliver signal %s on this platform.\n",
410 target_signal_to_name (siggnal));
414 static char child_cwd[FILENAME_MAX];
417 go32_wait (struct target_ops *ops,
418 ptid_t ptid, struct target_waitstatus *status)
421 unsigned char saved_opcode;
422 unsigned long INT3_addr = 0;
423 int stepping_over_INT = 0;
425 a_tss.tss_eflags &= 0xfeff; /* reset the single-step flag (TF) */
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
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)
445 unsigned char INT3_opcode = 0xCC;
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);
454 a_tss.tss_eflags |= 0x0100; /* normal instruction: set TF */
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)
462 a_tss.tss_irqn = 0xff;
466 a_tss.tss_trap = 0xffff; /* run_child looks for this */
467 a_tss.tss_irqn = resume_signal;
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
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 ..." */
481 /* Initialize child's cwd with the current one. */
482 getcwd (child_cwd, sizeof (child_cwd));
486 #if __DJGPP_MINOR__ < 3
490 #if __DJGPP_MINOR__ < 3
494 /* Did we step over an INT xx instruction? */
495 if (stepping_over_INT && a_tss.tss_eip == INT3_addr + 1)
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. */
502 a_tss.tss_eflags |= 0x0100;
505 getcwd (child_cwd, sizeof (child_cwd)); /* in case it has changed */
506 chdir (current_directory);
508 if (a_tss.tss_irqn == 0x21)
510 status->kind = TARGET_WAITKIND_EXITED;
511 status->value.integer = a_tss.tss_eax & 0xff;
515 status->value.sig = TARGET_SIGNAL_UNKNOWN;
516 status->kind = TARGET_WAITKIND_STOPPED;
517 for (i = 0; sig_map[i].go32_sig != -1; i++)
519 if (a_tss.tss_irqn == sig_map[i].go32_sig)
521 #if __DJGPP_MINOR__ < 3
522 if ((status->value.sig = sig_map[i].gdb_sig) !=
524 status->kind = TARGET_WAITKIND_SIGNALLED;
526 status->value.sig = sig_map[i].gdb_sig;
532 return pid_to_ptid (SOME_PID);
536 fetch_register (struct regcache *regcache, int regno)
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);
545 internal_error (__FILE__, __LINE__,
546 _("Invalid register no. %d in fetch_register."), regno);
550 go32_fetch_registers (struct target_ops *ops,
551 struct regcache *regcache, int regno)
554 fetch_register (regcache, regno);
558 regno < gdbarch_fp0_regnum (get_regcache_arch (regcache));
560 fetch_register (regcache, regno);
561 i387_supply_fsave (regcache, -1, &npx);
566 store_register (const struct regcache *regcache, int regno)
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);
575 internal_error (__FILE__, __LINE__,
576 _("Invalid register no. %d in store_register."), regno);
580 go32_store_registers (struct target_ops *ops,
581 struct regcache *regcache, int regno)
586 store_register (regcache, regno);
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);
596 go32_prepare_to_store (struct regcache *regcache)
601 go32_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write,
602 struct mem_attrib *attrib, struct target_ops *target)
606 if (write_child (memaddr, myaddr, len))
617 if (read_child (memaddr, myaddr, len))
628 static cmdline_t child_cmd; /* parsed child's command line kept here */
631 go32_files_info (struct target_ops *target)
633 printf_unfiltered ("You are running a DJGPP V2 program.\n");
637 go32_kill_inferior (struct target_ops *ops)
639 go32_mourn_inferior (ops);
643 go32_create_inferior (struct target_ops *ops, char *exec_file,
644 char *args, char **env, int from_tty)
646 extern char **environ;
649 char **env_save = environ;
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. */
655 exec_file = get_exec_file (1);
660 /* Initialize child's cwd as empty to be initialized when starting
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"));
669 /* Parse the command line and create redirections. */
670 if (strpbrk (args, "<>"))
672 if (redir_cmdline_parse (args, &child_cmd) == 0)
673 args = child_cmd.command;
675 error (_("Syntax error in command line."));
678 child_cmd.command = xstrdup (args);
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."));
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. */
693 cmdline[0] = strlen (args);
694 cmdline[cmdlen + 1] = 13;
697 cmdline[0] = 0xff; /* signal v2loadimage it's a long command */
701 if (v2loadimage (exec_file, cmdline, start_state))
704 printf_unfiltered ("Load failed for image %s\n", exec_file);
710 edi_init (start_state);
711 #if __DJGPP_MINOR__ < 3
715 inferior_ptid = pid_to_ptid (SOME_PID);
716 add_inferior_silent (SOME_PID);
718 push_target (&go32_ops);
720 add_thread_silent (inferior_ptid);
722 clear_proceed_status ();
723 insert_breakpoints ();
724 prog_has_started = 1;
728 go32_mourn_inferior (struct target_ops *ops)
732 redir_cmdline_delete (&child_cmd);
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 ();
747 ptid = inferior_ptid;
748 inferior_ptid = null_ptid;
749 delete_thread_silent (ptid);
750 prog_has_started = 0;
753 generic_mourn_inferior ();
762 /* Hardware watchpoint support. */
764 #define D_REGS edi.dr
765 #define CONTROL D_REGS[7]
766 #define STATUS D_REGS[6]
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. */
772 go32_set_dr (int i, CORE_ADDR addr)
775 internal_error (__FILE__, __LINE__,
776 _("Invalid register %d in go32_set_dr.\n"), i);
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. */
784 go32_set_dr7 (unsigned val)
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. */
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. */
802 device_mode (int fd, int raw_p)
804 int oldmode, newmode;
809 __dpmi_int (0x21, ®s);
810 if (regs.x.flags & 1)
812 newmode = oldmode = regs.x.dx;
819 if (oldmode & 0x80) /* Only for character dev */
823 regs.x.dx = newmode & 0xff; /* Force upper byte zero, else it fails */
824 __dpmi_int (0x21, ®s);
825 if (regs.x.flags & 1)
828 return (oldmode & 0x20) == 0x20;
832 static int inf_mode_valid = 0;
833 static int inf_terminal_mode;
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;
842 go32_terminal_init (void)
844 inf_mode_valid = 0; /* reinitialize, in case they are restarting child */
845 terminal_is_ours = 1;
849 go32_terminal_info (char *args, int from_tty)
851 printf_unfiltered ("Inferior's terminal is in %s mode.\n",
853 ? "default" : inf_terminal_mode ? "raw" : "cooked");
855 #if __DJGPP_MINOR__ > 2
856 if (child_cmd.redirection)
860 for (i = 0; i < DBG_HANDLES; i++)
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)
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))
872 ("\tFile handle %d appears to be redirected by inferior.\n", i);
879 go32_terminal_inferior (void)
881 /* Redirect standard handles as child wants them. */
883 if (redir_to_child (&child_cmd) == -1)
885 redir_to_debugger (&child_cmd);
886 error (_("Cannot redirect standard handles for program: %s."),
887 safe_strerror (errno));
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)
894 device_mode (0, inf_terminal_mode);
895 terminal_is_ours = 0;
900 go32_terminal_ours (void)
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)
906 inf_terminal_mode = device_mode (0, 0);
907 if (inf_terminal_mode != -1)
910 /* If device_mode returned -1, we don't know what happens with
911 handle 0 anymore, so make the info invalid. */
913 terminal_is_ours = 1;
915 /* Restore debugger's standard handles. */
917 if (redir_to_debugger (&child_cmd) == -1)
919 redir_to_child (&child_cmd);
920 error (_("Cannot redirect standard handles for debugger: %s."),
921 safe_strerror (errno));
927 go32_thread_alive (struct target_ops *ops, ptid_t ptid)
929 return !ptid_equal (inferior_ptid, null_ptid);
933 go32_pid_to_str (struct target_ops *ops, ptid_t ptid)
935 return normal_pid_to_str (ptid);
941 go32_ops.to_shortname = "djgpp";
942 go32_ops.to_longname = "djgpp target process";
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;
976 i386_use_watchpoints (&go32_ops);
978 go32_ops.to_magic = OPS_MAGIC;
980 /* Initialize child's cwd as empty to be initialized when starting
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"));
989 /* We are always processing GCC-compiled programs. */
990 processing_gcc_compilation = 2;
992 /* Override the default name of the GDB init file. */
993 strcpy (gdbinit, "gdb.ini");
996 /* Return the current DOS codepage number. */
1003 __dpmi_int (0x21, ®s);
1004 if (!(regs.x.flags & 1))
1005 return regs.x.bx & 0xffff;
1007 return 437; /* default */
1010 /* Limited emulation of `nl_langinfo', for charset.c. */
1012 nl_langinfo (nl_item item)
1020 /* 8 is enough for SHORT_MAX + "CP" + null. */
1022 int blen = sizeof (buf);
1023 int needed = snprintf (buf, blen, "CP%d", dos_codepage ());
1025 if (needed > blen) /* should never happen */
1027 retval = xstrdup (buf);
1031 retval = xstrdup ("");
1037 unsigned short windows_major, windows_minor;
1039 /* Compute the version Windows reports via Int 2Fh/AX=1600h. */
1041 go32_get_windows_version(void)
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))
1050 windows_major = r.h.al;
1051 windows_minor = r.h.ah;
1054 windows_major = 0xff; /* meaning no Windows */
1057 /* A subroutine of go32_sysinfo to display memory info. */
1059 print_mem (unsigned long datum, const char *header, int in_pages_p)
1061 if (datum != 0xffffffffUL)
1065 puts_filtered (header);
1068 printf_filtered ("%lu KB", datum >> 10);
1069 if (datum > 1024 * 1024)
1070 printf_filtered (" (%lu MB)", datum >> 20);
1073 printf_filtered ("%lu Bytes", datum);
1074 puts_filtered ("\n");
1078 /* Display assorted information about the underlying OS. */
1080 go32_sysinfo (char *arg, int from_tty)
1082 static const char test_pattern[] =
1083 "deadbeafdeadbeafdeadbeafdeadbeafdeadbeaf"
1084 "deadbeafdeadbeafdeadbeafdeadbeafdeadbeaf"
1085 "deadbeafdeadbeafdeadbeafdeadbeafdeadbeafdeadbeaf";
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;
1092 char dpmi_vendor_info[129];
1093 int dpmi_vendor_available;
1094 __dpmi_version_ret dpmi_version_data;
1096 __dpmi_free_mem_info mem_info;
1099 cpuid_vendor[0] = '\0';
1101 strcpy (u.machine, "Unknown x86");
1102 else if (u.machine[0] == 'i' && u.machine[1] > 4)
1104 /* CPUID with EAX = 0 returns the Vendor ID. */
1105 __asm__ __volatile__ ("xorl %%ebx, %%ebx;"
1106 "xorl %%ecx, %%ecx;"
1107 "xorl %%edx, %%edx;"
1114 : "=m" (cpuid_vendor[0]),
1115 "=m" (cpuid_vendor[4]),
1116 "=m" (cpuid_vendor[8]),
1119 : "%eax", "%ebx", "%ecx", "%edx");
1120 cpuid_vendor[12] = '\0';
1123 printf_filtered ("CPU Type.......................%s", u.machine);
1124 if (cpuid_vendor[0])
1125 printf_filtered (" (%s)", cpuid_vendor);
1126 puts_filtered ("\n");
1128 /* CPUID with EAX = 1 returns processor signature and features. */
1131 static char *brand_name[] = {
1139 char cpu_string[80];
1142 int intel_p = strcmp (cpuid_vendor, "GenuineIntel") == 0;
1143 int amd_p = strcmp (cpuid_vendor, "AuthenticAMD") == 0;
1144 unsigned cpu_family, cpu_model;
1146 __asm__ __volatile__ ("movl $1, %%eax;"
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';
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)
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");
1172 else if (cpu_family == 6 && cpu_model < 8)
1177 strcpy (cpu_brand, " Pro");
1180 strcpy (cpu_brand, " II");
1183 strcpy (cpu_brand, " II Xeon");
1186 strcpy (cpu_brand, " Celeron");
1189 strcpy (cpu_brand, " III");
1199 strcpy (cpu_brand, "486/5x86");
1208 strcpy (cpu_brand, "-K5");
1212 strcpy (cpu_brand, "-K6");
1215 strcpy (cpu_brand, "-K6-2");
1218 strcpy (cpu_brand, "-K6-III");
1228 strcpy (cpu_brand, " Athlon");
1231 strcpy (cpu_brand, " Duron");
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))
1245 puts_filtered ("CPU Features...................");
1246 /* We only list features which might be useful in the DPMI
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 ");
1264 if ((cpuid_edx & (1 << 31)) != 0)
1265 puts_filtered ("3DNow! ");
1266 if ((cpuid_edx & (1 << 30)) != 0)
1267 puts_filtered ("3DNow!Ext");
1269 puts_filtered ("\n");
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");
1279 go32_get_windows_version ();
1280 if (windows_major != 0xff)
1282 const char *windows_flavor;
1284 printf_filtered ("Windows Version................%d.%02d (Windows ",
1285 windows_major, windows_minor);
1286 switch (windows_major)
1289 windows_flavor = "3.X";
1292 switch (windows_minor)
1295 windows_flavor = "95, 95A, or 95B";
1298 windows_flavor = "95B OSR2.1 or 95C OSR2.5";
1301 windows_flavor = "98 or 98 SE";
1304 windows_flavor = "ME";
1307 windows_flavor = "9X";
1312 windows_flavor = "??";
1315 printf_filtered ("%s)\n", windows_flavor);
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)
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));
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);
1355 /* a_tss is only initialized when the debuggee is first run. */
1356 if (prog_has_started)
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");
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);
1380 __dpmi_int (0x21, ®s);
1381 print_mem (regs.x.bx << 4, "Free DOS Memory................", 0);
1383 __dpmi_int (0x21, ®s);
1384 if ((regs.x.flags & 1) == 0)
1386 static const char *dos_hilo[] = {
1387 "Low", "", "", "", "High", "", "", "", "High, then Low"
1389 static const char *dos_fit[] = {
1390 "First", "Best", "Last"
1392 int hilo_idx = (regs.x.ax >> 4) & 0x0f;
1393 int fit_idx = regs.x.ax & 0x0f;
1399 printf_filtered ("DOS Memory Allocation..........%s memory, %s fit\n",
1400 dos_hilo[hilo_idx], dos_fit[fit_idx]);
1402 __dpmi_int (0x21, ®s);
1403 if ((regs.x.flags & 1) != 0)
1405 printfi_filtered (31, "UMBs %sin DOS memory chain\n",
1406 regs.h.al == 0 ? "not " : "");
1411 unsigned short limit0;
1412 unsigned short base0;
1413 unsigned char base1;
1418 unsigned available:1;
1421 unsigned page_granular:1;
1422 unsigned char base2;
1423 } __attribute__ ((packed));
1426 unsigned short offset0;
1427 unsigned short selector;
1428 unsigned param_count:5;
1433 unsigned short offset1;
1434 } __attribute__ ((packed));
1436 /* Read LEN bytes starting at logical address ADDR, and put the result
1437 into DEST. Return 1 if success, zero if not. */
1439 read_memory_region (unsigned long addr, void *dest, size_t len)
1441 unsigned long dos_ds_limit = __dpmi_get_segment_limit (_dos_ds);
1444 /* For the low memory, we can simply use _dos_ds. */
1445 if (addr <= dos_ds_limit - len)
1446 dosmemget (addr, len, dest);
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);
1457 int access_rights = __dpmi_get_descriptor_access_rights (sel);
1458 size_t segment_limit = len - 1;
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)
1468 access_rights |= 0x8000;
1469 /* Page-granular segments should have the low 12 bits of
1471 segment_limit |= 0xfff;
1474 access_rights &= ~0x8000;
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);
1486 __dpmi_free_ldt_descriptor (sel);
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. */
1496 get_descriptor (unsigned long table_base, int idx, void *descr)
1498 unsigned long addr = table_base + idx * 8; /* 8 bytes per entry */
1500 if (read_memory_region (addr, descr, 8))
1501 return (int)((struct seg_descr *)descr)->stype;
1506 unsigned short limit __attribute__((packed));
1507 unsigned long base __attribute__((packed));
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. */
1514 display_descriptor (unsigned type, unsigned long base_addr, int idx, int force)
1516 struct seg_descr descr;
1517 struct gate_descr gate;
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)
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 */
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;
1538 && (allowed_descriptors[type] & (1 << descr.stype)) != 0)
1540 printf_filtered ("0x%03x: ",
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);
1551 switch (descr.stype)
1555 printf_filtered (" 16-bit TSS (task %sactive)",
1556 descr.stype == 3 ? "" : "in");
1559 puts_filtered (" LDT");
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)",
1569 printf_filtered ("TSS selector=0x%04x", descr.base0);
1570 printfi_filtered (16, "Task Gate");
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");
1582 printf_filtered (" 32-bit TSS (task %sactive)",
1583 descr.stype == 3 ? "" : "in");
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)",
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");
1600 case 16: /* data segments */
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");
1614 case 24: /* code segments */
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");
1629 printf_filtered ("Unknown type 0x%02x", descr.stype);
1632 puts_filtered ("\n");
1636 printf_filtered ("0x%03x: ",
1638 ? idx : (idx * 8) | (type ? (cpl | 4) : 0));
1640 puts_filtered ("Segment not present\n");
1642 printf_filtered ("Segment type 0x%02x is invalid in this table\n",
1647 printf_filtered ("0x%03x: Cannot read this descriptor\n", idx);
1651 go32_sldt (char *arg, int from_tty)
1653 struct dtr_reg gdtr;
1654 unsigned short ldtr = 0;
1656 struct seg_descr ldt_descr;
1657 long ldt_entry = -1L;
1658 int cpl = (prog_has_started ? a_tss.tss_cs : _my_cs ()) & 3;
1662 while (*arg && isspace(*arg))
1667 ldt_entry = parse_and_eval_long (arg);
1669 || (ldt_entry & 4) == 0
1670 || (ldt_entry & 3) != (cpl & 3))
1671 error (_("Invalid LDT entry 0x%03lx."), (unsigned long)ldt_entry);
1675 __asm__ __volatile__ ("sgdt %0" : "=m" (gdtr) : /* no inputs */ );
1676 __asm__ __volatile__ ("sldt %0" : "=m" (ldtr) : /* no inputs */ );
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",
1684 | (ldt_descr.base1 << 16)
1685 | (ldt_descr.base2 << 24));
1690 | (ldt_descr.base1 << 16)
1691 | (ldt_descr.base2 << 24);
1692 unsigned limit = ldt_descr.limit0 | (ldt_descr.limit1 << 16);
1695 if (ldt_descr.page_granular)
1696 /* Page-granular segments must have the low 12 bits of their
1698 limit = (limit << 12) | 0xfff;
1699 /* LDT cannot have more than 8K 8-byte entries, i.e. more than
1704 max_entry = (limit + 1) / 8;
1708 if (ldt_entry > limit)
1709 error (_("Invalid LDT entry %#lx: outside valid limits [0..%#x]"),
1710 (unsigned long)ldt_entry, limit);
1712 display_descriptor (ldt_descr.stype, base, ldt_entry / 8, 1);
1718 for (i = 0; i < max_entry; i++)
1719 display_descriptor (ldt_descr.stype, base, i, 0);
1725 go32_sgdt (char *arg, int from_tty)
1727 struct dtr_reg gdtr;
1728 long gdt_entry = -1L;
1733 while (*arg && isspace(*arg))
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);
1745 __asm__ __volatile__ ("sgdt %0" : "=m" (gdtr) : /* no inputs */ );
1746 max_entry = (gdtr.limit + 1) / 8;
1750 if (gdt_entry > gdtr.limit)
1751 error (_("Invalid GDT entry %#lx: outside valid limits [0..%#x]"),
1752 (unsigned long)gdt_entry, gdtr.limit);
1754 display_descriptor (0, gdtr.base, gdt_entry / 8, 1);
1760 for (i = 0; i < max_entry; i++)
1761 display_descriptor (0, gdtr.base, i, 0);
1766 go32_sidt (char *arg, int from_tty)
1768 struct dtr_reg idtr;
1769 long idt_entry = -1L;
1774 while (*arg && isspace(*arg))
1779 idt_entry = parse_and_eval_long (arg);
1781 error (_("Invalid (negative) IDT entry %ld."), idt_entry);
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 */
1792 if (idt_entry > idtr.limit)
1793 error (_("Invalid IDT entry %#lx: outside valid limits [0..%#x]"),
1794 (unsigned long)idt_entry, idtr.limit);
1796 display_descriptor (1, idtr.base, idt_entry, 1);
1802 for (i = 0; i < max_entry; i++)
1803 display_descriptor (1, idtr.base, i, 0);
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;
1812 static unsigned long
1817 unsigned long taskbase, cr3;
1818 struct dtr_reg gdtr;
1820 if (pdbr > 0 && pdbr <= 0xfffff)
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 */ );
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;
1835 /* CWSDPMI's task base is always under the 1MB mark. */
1836 if (offset > 0xfffff)
1839 _farsetsel (_dos_ds);
1840 taskbase = _farnspeekl (offset) & 0xffffffU;
1841 taskbase += _farnspeekl (offset + 2) & 0xff000000U;
1842 if (taskbase > 0xfffff)
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;
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;
1859 for (addr = 0xb0000, pte_idx = 0xb0;
1861 addr += 0x1000, pte_idx++)
1863 if (((_farnspeekl (addr + 4 * pte_idx) & 0xfffff027) ==
1864 (_farnspeekl (addr + 0x1000) & 0xfffff027))
1865 && ((_farnspeekl (addr + 4 * pte_idx + 4) & 0xfffff000) == cr3))
1867 cr3 = addr + 0x1000;
1880 /* Return the N'th Page Directory entry. */
1881 static unsigned long
1884 unsigned long pde = 0;
1886 if (pdbr && n >= 0 && n < 1024)
1888 pde = _farpeekl (_dos_ds, pdbr + 4*n);
1893 /* Return the N'th entry of the Page Table whose Page Directory entry
1895 static unsigned long
1896 get_pte (unsigned long pde, int n)
1898 unsigned long pte = 0;
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)
1904 pde &= ~0xfff; /* clear non-address bits */
1905 pte = _farpeekl (_dos_ds, pde + 4*n);
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. */
1915 display_ptable_entry (unsigned long entry, int is_dir, int force, unsigned off)
1917 if ((entry & 1) != 0)
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");
1930 printf_filtered (" +0x%x", off);
1931 puts_filtered ("\n");
1934 printf_filtered ("Page%s not present or not supported; value=0x%lx.\n",
1935 is_dir ? " Table" : "", entry >> 1);
1939 go32_pde (char *arg, int from_tty)
1941 long pde_idx = -1, i;
1945 while (*arg && isspace(*arg))
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);
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);
1962 for (i = 0; i < 1024; i++)
1963 display_ptable_entry (get_pde (i), 1, 0, 0);
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. */
1970 display_page_table (long n, int force)
1972 unsigned long pde = get_pde (n);
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");
1984 printf_filtered ("Page Table not present; value=0x%lx.\n", pde >> 1);
1988 go32_pte (char *arg, int from_tty)
1990 long pde_idx = -1L, i;
1994 while (*arg && isspace(*arg))
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);
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);
2011 for (i = 0; i < 1024; i++)
2012 display_page_table (i, 0);
2016 go32_pte_for_address (char *arg, int from_tty)
2018 CORE_ADDR addr = 0, i;
2022 while (*arg && isspace(*arg))
2026 addr = parse_and_eval_address (arg);
2029 error_no_arg (_("linear address"));
2033 puts_filtered ("Access to Page Tables is not supported on this system.\n");
2036 int pde_idx = (addr >> 22) & 0x3ff;
2037 int pte_idx = (addr >> 12) & 0x3ff;
2038 unsigned offs = addr & 0xfff;
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);
2046 static struct cmd_list_element *info_dos_cmdlist = NULL;
2049 go32_info_dos_command (char *args, int from_tty)
2051 help_list (info_dos_cmdlist, "info dos ", class_info, gdb_stdout);
2055 _initialize_go32_nat (void)
2058 add_target (&go32_ops);
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);
2064 add_cmd ("sysinfo", class_info, go32_sysinfo, _("\
2065 Display information about the target system, including CPU, OS, DPMI, etc."),
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."),
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."),
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."),
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."),
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."),
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."),
2110 tcsetpgrp (int fd, pid_t pgid)
2112 if (isatty (fd) && pgid == SOME_PID)
2114 errno = pgid == SOME_PID ? ENOTTY : ENOSYS;