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