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