1 /* Native debugging support for Intel x86 running DJGPP.
2 Copyright 1997, 1999, 2000, 2001 Free Software Foundation, Inc.
3 Written by Robert Hoehne.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
29 #include "floatformat.h"
34 #include "gdb_string.h"
36 #include <stdio.h> /* might be required for __DJGPP_MINOR__ */
41 #include <sys/utsname.h>
43 /* breakpoint.h defines `disable' which is an enum member. */
44 #define disable interrup_disable
49 #include <debug/v2load.h>
50 #include <debug/dbgcom.h>
51 #if __DJGPP_MINOR__ > 2
52 #include <debug/redir.h>
55 #if __DJGPP_MINOR__ < 3
56 /* This code will be provided from DJGPP 2.03 on. Until then I code it
64 unsigned short exponent
:15;
65 unsigned short sign
:1;
84 static void save_npx (void); /* Save the FPU of the debugged program */
85 static void load_npx (void); /* Restore the FPU of the debugged program */
87 /* ------------------------------------------------------------------------- */
88 /* Store the contents of the NPX in the global variable `npx'. */
116 /* ------------------------------------------------------------------------- */
117 /* Reload the contents of the NPX from the global variable `npx'. */
122 asm ("frstor %0":"=m" (npx
));
124 /* ------------------------------------------------------------------------- */
125 /* Stubs for the missing redirection functions. */
132 redir_cmdline_delete (cmdline_t
*ptr
)
138 redir_cmdline_parse (const char *args
, cmdline_t
*ptr
)
144 redir_to_child (cmdline_t
*ptr
)
150 redir_to_debugger (cmdline_t
*ptr
)
156 redir_debug_init (cmdline_t
*ptr
)
160 #endif /* __DJGPP_MINOR < 3 */
162 typedef enum { wp_insert
, wp_remove
, wp_count
} wp_op
;
164 /* This holds the current reference counts for each debug register. */
165 static int dr_ref_count
[4];
169 static int prog_has_started
= 0;
170 static void go32_open (char *name
, int from_tty
);
171 static void go32_close (int quitting
);
172 static void go32_attach (char *args
, int from_tty
);
173 static void go32_detach (char *args
, int from_tty
);
174 static void go32_resume (ptid_t ptid
, int step
,
175 enum target_signal siggnal
);
176 static ptid_t
go32_wait (ptid_t ptid
,
177 struct target_waitstatus
*status
);
178 static void go32_fetch_registers (int regno
);
179 static void store_register (int regno
);
180 static void go32_store_registers (int regno
);
181 static void go32_prepare_to_store (void);
182 static int go32_xfer_memory (CORE_ADDR memaddr
, char *myaddr
, int len
,
184 struct mem_attrib
*attrib
,
185 struct target_ops
*target
);
186 static void go32_files_info (struct target_ops
*target
);
187 static void go32_stop (void);
188 static void go32_kill_inferior (void);
189 static void go32_create_inferior (char *exec_file
, char *args
, char **env
);
190 static void go32_mourn_inferior (void);
191 static int go32_can_run (void);
193 static struct target_ops go32_ops
;
194 static void go32_terminal_init (void);
195 static void go32_terminal_inferior (void);
196 static void go32_terminal_ours (void);
198 #define r_ofs(x) (offsetof(TSS,x))
207 {r_ofs (tss_eax
), 4}, /* normal registers, from a_tss */
208 {r_ofs (tss_ecx
), 4},
209 {r_ofs (tss_edx
), 4},
210 {r_ofs (tss_ebx
), 4},
211 {r_ofs (tss_esp
), 4},
212 {r_ofs (tss_ebp
), 4},
213 {r_ofs (tss_esi
), 4},
214 {r_ofs (tss_edi
), 4},
215 {r_ofs (tss_eip
), 4},
216 {r_ofs (tss_eflags
), 4},
223 {0, 10}, /* 8 FP registers, from npx.reg[] */
231 /* The order of the next 7 registers must be consistent
232 with their numbering in config/i386/tm-i386.h, which see. */
233 {0, 2}, /* control word, from npx */
234 {4, 2}, /* status word, from npx */
235 {8, 2}, /* tag word, from npx */
236 {16, 2}, /* last FP exception CS from npx */
237 {12, 4}, /* last FP exception EIP from npx */
238 {24, 2}, /* last FP exception operand selector from npx */
239 {20, 4}, /* last FP exception operand offset from npx */
240 {18, 2} /* last FP opcode from npx */
246 enum target_signal gdb_sig
;
250 {0, TARGET_SIGNAL_FPE
},
251 {1, TARGET_SIGNAL_TRAP
},
252 /* Exception 2 is triggered by the NMI. DJGPP handles it as SIGILL,
253 but I think SIGBUS is better, since the NMI is usually activated
254 as a result of a memory parity check failure. */
255 {2, TARGET_SIGNAL_BUS
},
256 {3, TARGET_SIGNAL_TRAP
},
257 {4, TARGET_SIGNAL_FPE
},
258 {5, TARGET_SIGNAL_SEGV
},
259 {6, TARGET_SIGNAL_ILL
},
260 {7, TARGET_SIGNAL_EMT
}, /* no-coprocessor exception */
261 {8, TARGET_SIGNAL_SEGV
},
262 {9, TARGET_SIGNAL_SEGV
},
263 {10, TARGET_SIGNAL_BUS
},
264 {11, TARGET_SIGNAL_SEGV
},
265 {12, TARGET_SIGNAL_SEGV
},
266 {13, TARGET_SIGNAL_SEGV
},
267 {14, TARGET_SIGNAL_SEGV
},
268 {16, TARGET_SIGNAL_FPE
},
269 {17, TARGET_SIGNAL_BUS
},
270 {31, TARGET_SIGNAL_ILL
},
271 {0x1b, TARGET_SIGNAL_INT
},
272 {0x75, TARGET_SIGNAL_FPE
},
273 {0x78, TARGET_SIGNAL_ALRM
},
274 {0x79, TARGET_SIGNAL_INT
},
275 {0x7a, TARGET_SIGNAL_QUIT
},
276 {-1, TARGET_SIGNAL_LAST
}
280 enum target_signal gdb_sig
;
283 {TARGET_SIGNAL_0
, -1},
284 {TARGET_SIGNAL_ILL
, 6}, /* Invalid Opcode */
285 {TARGET_SIGNAL_EMT
, 7}, /* triggers SIGNOFP */
286 {TARGET_SIGNAL_SEGV
, 13}, /* GPF */
287 {TARGET_SIGNAL_BUS
, 17}, /* Alignment Check */
288 /* The rest are fake exceptions, see dpmiexcp.c in djlsr*.zip for
290 {TARGET_SIGNAL_TERM
, 0x1b}, /* triggers Ctrl-Break type of SIGINT */
291 {TARGET_SIGNAL_FPE
, 0x75},
292 {TARGET_SIGNAL_INT
, 0x79},
293 {TARGET_SIGNAL_QUIT
, 0x7a},
294 {TARGET_SIGNAL_ALRM
, 0x78}, /* triggers SIGTIMR */
295 {TARGET_SIGNAL_PROF
, 0x78},
296 {TARGET_SIGNAL_LAST
, -1}
300 go32_open (char *name
, int from_tty
)
302 printf_unfiltered ("Done. Use the \"run\" command to run the program.\n");
306 go32_close (int quitting
)
311 go32_attach (char *args
, int from_tty
)
314 You cannot attach to a running program on this platform.\n\
315 Use the `run' command to run DJGPP programs.");
319 go32_detach (char *args
, int from_tty
)
323 static int resume_is_step
;
324 static int resume_signal
= -1;
327 go32_resume (ptid_t ptid
, int step
, enum target_signal siggnal
)
331 resume_is_step
= step
;
333 if (siggnal
!= TARGET_SIGNAL_0
&& siggnal
!= TARGET_SIGNAL_TRAP
)
335 for (i
= 0, resume_signal
= -1;
336 excepn_map
[i
].gdb_sig
!= TARGET_SIGNAL_LAST
; i
++)
337 if (excepn_map
[i
].gdb_sig
== siggnal
)
339 resume_signal
= excepn_map
[i
].djgpp_excepno
;
342 if (resume_signal
== -1)
343 printf_unfiltered ("Cannot deliver signal %s on this platform.\n",
344 target_signal_to_name (siggnal
));
348 static char child_cwd
[FILENAME_MAX
];
351 go32_wait (ptid_t ptid
, struct target_waitstatus
*status
)
354 unsigned char saved_opcode
;
355 unsigned long INT3_addr
= 0;
356 int stepping_over_INT
= 0;
358 a_tss
.tss_eflags
&= 0xfeff; /* reset the single-step flag (TF) */
361 /* If the next instruction is INT xx or INTO, we need to handle
362 them specially. Intel manuals say that these instructions
363 reset the single-step flag (a.k.a. TF). However, it seems
364 that, at least in the DPMI environment, and at least when
365 stepping over the DPMI interrupt 31h, the problem is having
366 TF set at all when INT 31h is executed: the debuggee either
367 crashes (and takes the system with it) or is killed by a
370 So we need to emulate single-step mode: we put an INT3 opcode
371 right after the INT xx instruction, let the debuggee run
372 until it hits INT3 and stops, then restore the original
373 instruction which we overwrote with the INT3 opcode, and back
374 up the debuggee's EIP to that instruction. */
375 read_child (a_tss
.tss_eip
, &saved_opcode
, 1);
376 if (saved_opcode
== 0xCD || saved_opcode
== 0xCE)
378 unsigned char INT3_opcode
= 0xCC;
381 = saved_opcode
== 0xCD ? a_tss
.tss_eip
+ 2 : a_tss
.tss_eip
+ 1;
382 stepping_over_INT
= 1;
383 read_child (INT3_addr
, &saved_opcode
, 1);
384 write_child (INT3_addr
, &INT3_opcode
, 1);
387 a_tss
.tss_eflags
|= 0x0100; /* normal instruction: set TF */
390 /* The special value FFFFh in tss_trap indicates to run_child that
391 tss_irqn holds a signal to be delivered to the debuggee. */
392 if (resume_signal
<= -1)
395 a_tss
.tss_irqn
= 0xff;
399 a_tss
.tss_trap
= 0xffff; /* run_child looks for this */
400 a_tss
.tss_irqn
= resume_signal
;
403 /* The child might change working directory behind our back. The
404 GDB users won't like the side effects of that when they work with
405 relative file names, and GDB might be confused by its current
406 directory not being in sync with the truth. So we always make a
407 point of changing back to where GDB thinks is its cwd, when we
408 return control to the debugger, but restore child's cwd before we
410 /* Initialize child_cwd, before the first call to run_child and not
411 in the initialization, so the child get also the changed directory
412 set with the gdb-command "cd ..." */
414 /* Initialize child's cwd with the current one. */
415 getcwd (child_cwd
, sizeof (child_cwd
));
419 #if __DJGPP_MINOR__ < 3
423 #if __DJGPP_MINOR__ < 3
427 /* Did we step over an INT xx instruction? */
428 if (stepping_over_INT
&& a_tss
.tss_eip
== INT3_addr
+ 1)
430 /* Restore the original opcode. */
431 a_tss
.tss_eip
--; /* EIP points *after* the INT3 instruction */
432 write_child (a_tss
.tss_eip
, &saved_opcode
, 1);
433 /* Simulate a TRAP exception. */
435 a_tss
.tss_eflags
|= 0x0100;
438 getcwd (child_cwd
, sizeof (child_cwd
)); /* in case it has changed */
439 chdir (current_directory
);
441 if (a_tss
.tss_irqn
== 0x21)
443 status
->kind
= TARGET_WAITKIND_EXITED
;
444 status
->value
.integer
= a_tss
.tss_eax
& 0xff;
448 status
->value
.sig
= TARGET_SIGNAL_UNKNOWN
;
449 status
->kind
= TARGET_WAITKIND_STOPPED
;
450 for (i
= 0; sig_map
[i
].go32_sig
!= -1; i
++)
452 if (a_tss
.tss_irqn
== sig_map
[i
].go32_sig
)
454 #if __DJGPP_MINOR__ < 3
455 if ((status
->value
.sig
= sig_map
[i
].gdb_sig
) !=
457 status
->kind
= TARGET_WAITKIND_SIGNALLED
;
459 status
->value
.sig
= sig_map
[i
].gdb_sig
;
465 return pid_to_ptid (SOME_PID
);
469 fetch_register (int regno
)
471 if (regno
< FP0_REGNUM
)
472 supply_register (regno
, (char *) &a_tss
+ regno_mapping
[regno
].tss_ofs
);
473 else if (regno
<= LAST_FPU_CTRL_REGNUM
)
474 i387_supply_register (regno
, (char *) &npx
);
476 internal_error (__FILE__
, __LINE__
,
477 "Invalid register no. %d in fetch_register.", regno
);
481 go32_fetch_registers (int regno
)
484 fetch_register (regno
);
487 for (regno
= 0; regno
< FP0_REGNUM
; regno
++)
488 fetch_register (regno
);
489 i387_supply_fsave ((char *) &npx
);
494 store_register (int regno
)
497 void *v
= (void *) register_buffer (regno
);
499 if (regno
< FP0_REGNUM
)
500 memcpy ((char *) &a_tss
+ regno_mapping
[regno
].tss_ofs
,
501 v
, regno_mapping
[regno
].size
);
502 else if (regno
<= LAST_FPU_CTRL_REGNUM
)
503 i387_fill_fsave ((char *)&npx
, regno
);
505 internal_error (__FILE__
, __LINE__
,
506 "Invalid register no. %d in store_register.", regno
);
510 go32_store_registers (int regno
)
515 store_register (regno
);
518 for (r
= 0; r
< FP0_REGNUM
; r
++)
520 i387_fill_fsave ((char *) &npx
, -1);
525 go32_prepare_to_store (void)
530 go32_xfer_memory (CORE_ADDR memaddr
, char *myaddr
, int len
, int write
,
531 struct mem_attrib
*attrib
, struct target_ops
*target
)
535 if (write_child (memaddr
, myaddr
, len
))
546 if (read_child (memaddr
, myaddr
, len
))
557 static cmdline_t child_cmd
; /* parsed child's command line kept here */
560 go32_files_info (struct target_ops
*target
)
562 printf_unfiltered ("You are running a DJGPP V2 program.\n");
570 inferior_ptid
= null_ptid
;
571 prog_has_started
= 0;
575 go32_kill_inferior (void)
577 redir_cmdline_delete (&child_cmd
);
580 unpush_target (&go32_ops
);
584 go32_create_inferior (char *exec_file
, char *args
, char **env
)
586 extern char **environ
;
589 char **env_save
= environ
;
591 /* If no exec file handed to us, get it from the exec-file command -- with
592 a good, common error message if none is specified. */
594 exec_file
= get_exec_file (1);
596 if (prog_has_started
)
599 go32_kill_inferior ();
604 /* Initialize child's cwd as empty to be initialized when starting
608 /* Init command line storage. */
609 if (redir_debug_init (&child_cmd
) == -1)
610 internal_error (__FILE__
, __LINE__
,
611 "Cannot allocate redirection storage: not enough memory.\n");
613 /* Parse the command line and create redirections. */
614 if (strpbrk (args
, "<>"))
616 if (redir_cmdline_parse (args
, &child_cmd
) == 0)
617 args
= child_cmd
.command
;
619 error ("Syntax error in command line.");
622 child_cmd
.command
= xstrdup (args
);
624 cmdline
= (char *) alloca (strlen (args
) + 4);
625 cmdline
[0] = strlen (args
);
626 strcpy (cmdline
+ 1, args
);
627 cmdline
[strlen (args
) + 1] = 13;
631 if (v2loadimage (exec_file
, cmdline
, start_state
))
634 printf_unfiltered ("Load failed for image %s\n", exec_file
);
639 edi_init (start_state
);
640 #if __DJGPP_MINOR__ < 3
644 inferior_ptid
= pid_to_ptid (SOME_PID
);
645 push_target (&go32_ops
);
646 clear_proceed_status ();
647 insert_breakpoints ();
648 proceed ((CORE_ADDR
) -1, TARGET_SIGNAL_0
, 0);
649 prog_has_started
= 1;
653 go32_mourn_inferior (void)
655 /* We need to make sure all the breakpoint enable bits in the DR7
656 register are reset when the inferior exits. Otherwise, if they
657 rerun the inferior, the uncleared bits may cause random SIGTRAPs,
658 failure to set more watchpoints, and other calamities. It would
659 be nice if GDB itself would take care to remove all breakpoints
660 at all times, but it doesn't, probably under an assumption that
661 the OS cleans up when the debuggee exits. */
662 i386_cleanup_dregs ();
663 go32_kill_inferior ();
664 generic_mourn_inferior ();
673 /* Hardware watchpoint support. */
675 #define D_REGS edi.dr
676 #define CONTROL D_REGS[7]
677 #define STATUS D_REGS[6]
679 /* Pass the address ADDR to the inferior in the I'th debug register.
680 Here we just store the address in D_REGS, the watchpoint will be
681 actually set up when go32_wait runs the debuggee. */
683 go32_set_dr (int i
, CORE_ADDR addr
)
686 internal_error (__FILE__
, __LINE__
,
687 "Invalid register %d in go32_set_dr.\n", i
);
691 /* Pass the value VAL to the inferior in the DR7 debug control
692 register. Here we just store the address in D_REGS, the watchpoint
693 will be actually set up when go32_wait runs the debuggee. */
695 go32_set_dr7 (unsigned val
)
700 /* Get the value of the DR6 debug status register from the inferior.
701 Here we just return the value stored in D_REGS, as we've got it
702 from the last go32_wait call. */
709 /* Put the device open on handle FD into either raw or cooked
710 mode, return 1 if it was in raw mode, zero otherwise. */
713 device_mode (int fd
, int raw_p
)
715 int oldmode
, newmode
;
720 __dpmi_int (0x21, ®s
);
721 if (regs
.x
.flags
& 1)
723 newmode
= oldmode
= regs
.x
.dx
;
730 if (oldmode
& 0x80) /* Only for character dev */
734 regs
.x
.dx
= newmode
& 0xff; /* Force upper byte zero, else it fails */
735 __dpmi_int (0x21, ®s
);
736 if (regs
.x
.flags
& 1)
739 return (oldmode
& 0x20) == 0x20;
743 static int inf_mode_valid
= 0;
744 static int inf_terminal_mode
;
746 /* This semaphore is needed because, amazingly enough, GDB calls
747 target.to_terminal_ours more than once after the inferior stops.
748 But we need the information from the first call only, since the
749 second call will always see GDB's own cooked terminal. */
750 static int terminal_is_ours
= 1;
753 go32_terminal_init (void)
755 inf_mode_valid
= 0; /* reinitialize, in case they are restarting child */
756 terminal_is_ours
= 1;
760 go32_terminal_info (char *args
, int from_tty
)
762 printf_unfiltered ("Inferior's terminal is in %s mode.\n",
764 ? "default" : inf_terminal_mode
? "raw" : "cooked");
766 #if __DJGPP_MINOR__ > 2
767 if (child_cmd
.redirection
)
771 for (i
= 0; i
< DBG_HANDLES
; i
++)
773 if (child_cmd
.redirection
[i
]->file_name
)
774 printf_unfiltered ("\tFile handle %d is redirected to `%s'.\n",
775 i
, child_cmd
.redirection
[i
]->file_name
);
776 else if (_get_dev_info (child_cmd
.redirection
[i
]->inf_handle
) == -1)
778 ("\tFile handle %d appears to be closed by inferior.\n", i
);
779 /* Mask off the raw/cooked bit when comparing device info words. */
780 else if ((_get_dev_info (child_cmd
.redirection
[i
]->inf_handle
) & 0xdf)
781 != (_get_dev_info (i
) & 0xdf))
783 ("\tFile handle %d appears to be redirected by inferior.\n", i
);
790 go32_terminal_inferior (void)
792 /* Redirect standard handles as child wants them. */
794 if (redir_to_child (&child_cmd
) == -1)
796 redir_to_debugger (&child_cmd
);
797 error ("Cannot redirect standard handles for program: %s.",
800 /* set the console device of the inferior to whatever mode
801 (raw or cooked) we found it last time */
802 if (terminal_is_ours
)
805 device_mode (0, inf_terminal_mode
);
806 terminal_is_ours
= 0;
811 go32_terminal_ours (void)
813 /* Switch to cooked mode on the gdb terminal and save the inferior
814 terminal mode to be restored when it is resumed */
815 if (!terminal_is_ours
)
817 inf_terminal_mode
= device_mode (0, 0);
818 if (inf_terminal_mode
!= -1)
821 /* If device_mode returned -1, we don't know what happens with
822 handle 0 anymore, so make the info invalid. */
824 terminal_is_ours
= 1;
826 /* Restore debugger's standard handles. */
828 if (redir_to_debugger (&child_cmd
) == -1)
830 redir_to_child (&child_cmd
);
831 error ("Cannot redirect standard handles for debugger: %s.",
840 go32_ops
.to_shortname
= "djgpp";
841 go32_ops
.to_longname
= "djgpp target process";
843 "Program loaded by djgpp, when gdb is used as an external debugger";
844 go32_ops
.to_open
= go32_open
;
845 go32_ops
.to_close
= go32_close
;
846 go32_ops
.to_attach
= go32_attach
;
847 go32_ops
.to_detach
= go32_detach
;
848 go32_ops
.to_resume
= go32_resume
;
849 go32_ops
.to_wait
= go32_wait
;
850 go32_ops
.to_fetch_registers
= go32_fetch_registers
;
851 go32_ops
.to_store_registers
= go32_store_registers
;
852 go32_ops
.to_prepare_to_store
= go32_prepare_to_store
;
853 go32_ops
.to_xfer_memory
= go32_xfer_memory
;
854 go32_ops
.to_files_info
= go32_files_info
;
855 go32_ops
.to_insert_breakpoint
= memory_insert_breakpoint
;
856 go32_ops
.to_remove_breakpoint
= memory_remove_breakpoint
;
857 go32_ops
.to_terminal_init
= go32_terminal_init
;
858 go32_ops
.to_terminal_inferior
= go32_terminal_inferior
;
859 go32_ops
.to_terminal_ours_for_output
= go32_terminal_ours
;
860 go32_ops
.to_terminal_ours
= go32_terminal_ours
;
861 go32_ops
.to_terminal_info
= go32_terminal_info
;
862 go32_ops
.to_kill
= go32_kill_inferior
;
863 go32_ops
.to_create_inferior
= go32_create_inferior
;
864 go32_ops
.to_mourn_inferior
= go32_mourn_inferior
;
865 go32_ops
.to_can_run
= go32_can_run
;
866 go32_ops
.to_stop
= go32_stop
;
867 go32_ops
.to_stratum
= process_stratum
;
868 go32_ops
.to_has_all_memory
= 1;
869 go32_ops
.to_has_memory
= 1;
870 go32_ops
.to_has_stack
= 1;
871 go32_ops
.to_has_registers
= 1;
872 go32_ops
.to_has_execution
= 1;
873 go32_ops
.to_magic
= OPS_MAGIC
;
875 /* Initialize child's cwd as empty to be initialized when starting
879 /* Initialize child's command line storage. */
880 if (redir_debug_init (&child_cmd
) == -1)
881 internal_error (__FILE__
, __LINE__
,
882 "Cannot allocate redirection storage: not enough memory.\n");
884 /* We are always processing GCC-compiled programs. */
885 processing_gcc_compilation
= 2;
888 unsigned short windows_major
, windows_minor
;
890 /* Compute the version Windows reports via Int 2Fh/AX=1600h. */
892 go32_get_windows_version(void)
897 __dpmi_int(0x2f, &r
);
898 if (r
.h
.al
> 2 && r
.h
.al
!= 0x80 && r
.h
.al
!= 0xff
899 && (r
.h
.al
> 3 || r
.h
.ah
> 0))
901 windows_major
= r
.h
.al
;
902 windows_minor
= r
.h
.ah
;
905 windows_major
= 0xff; /* meaning no Windows */
908 /* A subroutine of go32_sysinfo to display memory info. */
910 print_mem (unsigned long datum
, const char *header
, int in_pages_p
)
912 if (datum
!= 0xffffffffUL
)
916 puts_filtered (header
);
919 printf_filtered ("%lu KB", datum
>> 10);
920 if (datum
> 1024 * 1024)
921 printf_filtered (" (%lu MB)", datum
>> 20);
924 printf_filtered ("%lu Bytes", datum
);
925 puts_filtered ("\n");
929 /* Display assorted information about the underlying OS. */
931 go32_sysinfo (char *arg
, int from_tty
)
934 char cpuid_vendor
[13];
935 unsigned cpuid_max
= 0, cpuid_eax
, cpuid_ebx
, cpuid_ecx
, cpuid_edx
;
936 unsigned true_dos_version
= _get_dos_version (1);
937 unsigned advertized_dos_version
= ((unsigned int)_osmajor
<< 8) | _osminor
;
939 char dpmi_vendor_info
[129];
940 int dpmi_vendor_available
=
941 __dpmi_get_capabilities (&dpmi_flags
, dpmi_vendor_info
);
942 __dpmi_version_ret dpmi_version_data
;
944 __dpmi_free_mem_info mem_info
;
947 cpuid_vendor
[0] = '\0';
949 strcpy (u
.machine
, "Unknown x86");
950 else if (u
.machine
[0] == 'i' && u
.machine
[1] > 4)
952 /* CPUID with EAX = 0 returns the Vendor ID. */
953 __asm__
__volatile__ ("xorl %%ebx, %%ebx;"
962 : "=m" (cpuid_vendor
[0]),
963 "=m" (cpuid_vendor
[4]),
964 "=m" (cpuid_vendor
[8]),
967 : "%eax", "%ebx", "%ecx", "%edx");
968 cpuid_vendor
[12] = '\0';
971 printf_filtered ("CPU Type.......................%s", u
.machine
);
973 printf_filtered (" (%s)", cpuid_vendor
);
974 puts_filtered ("\n");
976 /* CPUID with EAX = 1 returns processor signature and features. */
979 static char *brand_name
[] = {
990 int intel_p
= strcmp (cpuid_vendor
, "GenuineIntel") == 0;
991 int amd_p
= strcmp (cpuid_vendor
, "AuthenticAMD") == 0;
992 unsigned cpu_family
, cpu_model
;
994 __asm__
__volatile__ ("movl $1, %%eax;"
1001 brand_idx
= cpuid_ebx
& 0xff;
1002 cpu_family
= (cpuid_eax
>> 8) & 0xf;
1003 cpu_model
= (cpuid_eax
>> 4) & 0xf;
1004 cpu_brand
[0] = '\0';
1008 && brand_idx
< sizeof(brand_name
)/sizeof(brand_name
[0])
1009 && *brand_name
[brand_idx
])
1010 strcpy (cpu_brand
, brand_name
[brand_idx
]);
1011 else if (cpu_family
== 5)
1013 if (((cpuid_eax
>> 12) & 3) == 0 && cpu_model
== 4)
1014 strcpy (cpu_brand
, " MMX");
1015 else if (cpu_model
> 1 && ((cpuid_eax
>> 12) & 3) == 1)
1016 strcpy (cpu_brand
, " OverDrive");
1017 else if (cpu_model
> 1 && ((cpuid_eax
>> 12) & 3) == 2)
1018 strcpy (cpu_brand
, " Dual");
1020 else if (cpu_family
== 6 && cpu_model
< 8)
1025 strcpy (cpu_brand
, " Pro");
1028 strcpy (cpu_brand
, " II");
1031 strcpy (cpu_brand
, " II Xeon");
1034 strcpy (cpu_brand
, " Celeron");
1037 strcpy (cpu_brand
, " III");
1047 strcpy (cpu_brand
, "486/5x86");
1056 strcpy (cpu_brand
, "-K5");
1060 strcpy (cpu_brand
, "-K6");
1063 strcpy (cpu_brand
, "-K6-2");
1066 strcpy (cpu_brand
, "-K6-III");
1076 strcpy (cpu_brand
, " Athlon");
1079 strcpy (cpu_brand
, " Duron");
1085 sprintf (cpu_string
, "%s%s Model %d Stepping %d",
1086 intel_p
? "Pentium" : (amd_p
? "AMD" : "ix86"),
1087 cpu_brand
, cpu_model
, cpuid_eax
& 0xf);
1088 printfi_filtered (31, "%s\n", cpu_string
);
1089 if (((cpuid_edx
& (6 | (0x0d << 23))) != 0)
1090 || ((cpuid_edx
& 1) == 0)
1091 || (amd_p
&& (cpuid_edx
& (3 << 30)) != 0))
1093 puts_filtered ("CPU Features...................");
1094 /* We only list features which might be useful in the DPMI
1096 if ((cpuid_edx
& 1) == 0)
1097 puts_filtered ("No FPU "); /* it's unusual to not have an FPU */
1098 if ((cpuid_edx
& (1 << 1)) != 0)
1099 puts_filtered ("VME ");
1100 if ((cpuid_edx
& (1 << 2)) != 0)
1101 puts_filtered ("DE ");
1102 if ((cpuid_edx
& (1 << 4)) != 0)
1103 puts_filtered ("TSC ");
1104 if ((cpuid_edx
& (1 << 23)) != 0)
1105 puts_filtered ("MMX ");
1106 if ((cpuid_edx
& (1 << 25)) != 0)
1107 puts_filtered ("SSE ");
1108 if ((cpuid_edx
& (1 << 26)) != 0)
1109 puts_filtered ("SSE2 ");
1112 if ((cpuid_edx
& (1 << 31)) != 0)
1113 puts_filtered ("3DNow! ");
1114 if ((cpuid_edx
& (1 << 30)) != 0)
1115 puts_filtered ("3DNow!Ext");
1117 puts_filtered ("\n");
1120 puts_filtered ("\n");
1121 printf_filtered ("DOS Version....................%s %s.%s",
1122 _os_flavor
, u
.release
, u
.version
);
1123 if (true_dos_version
!= advertized_dos_version
)
1124 printf_filtered (" (disguised as v%d.%d)", _osmajor
, _osminor
);
1125 puts_filtered ("\n");
1127 go32_get_windows_version ();
1128 if (windows_major
!= 0xff)
1130 const char *windows_flavor
;
1132 printf_filtered ("Windows Version................%d.%02d (Windows ",
1133 windows_major
, windows_minor
);
1134 switch (windows_major
)
1137 windows_flavor
= "3.X";
1140 switch (windows_minor
)
1143 windows_flavor
= "95, 95A, or 95B";
1146 windows_flavor
= "95B OSR2.1 or 95C OSR2.5";
1149 windows_flavor
= "98 or 98 SE";
1152 windows_flavor
= "ME";
1155 windows_flavor
= "9X";
1160 windows_flavor
= "??";
1163 printf_filtered ("%s)\n", windows_flavor
);
1165 else if (true_dos_version
== 0x532 && advertized_dos_version
== 0x500)
1166 printf_filtered ("Windows Version................Windows NT or Windows 2000\n");
1167 puts_filtered ("\n");
1168 if (dpmi_vendor_available
== 0)
1170 /* The DPMI spec says the vendor string should be ASCIIZ, but
1171 I don't trust the vendors to follow that... */
1172 if (!memchr (&dpmi_vendor_info
[2], 0, 126))
1173 dpmi_vendor_info
[128] = '\0';
1174 printf_filtered ("DPMI Host......................%s v%d.%d (capabilities: %#x)\n",
1175 &dpmi_vendor_info
[2],
1176 (unsigned)dpmi_vendor_info
[0],
1177 (unsigned)dpmi_vendor_info
[1],
1178 ((unsigned)dpmi_flags
& 0x7f));
1180 __dpmi_get_version (&dpmi_version_data
);
1181 printf_filtered ("DPMI Version...................%d.%02d\n",
1182 dpmi_version_data
.major
, dpmi_version_data
.minor
);
1183 printf_filtered ("DPMI Info......................%s-bit DPMI, with%s Virtual Memory support\n",
1184 (dpmi_version_data
.flags
& 1) ? "32" : "16",
1185 (dpmi_version_data
.flags
& 4) ? "" : "out");
1186 printfi_filtered (31, "Interrupts reflected to %s mode\n",
1187 (dpmi_version_data
.flags
& 2) ? "V86" : "Real");
1188 printfi_filtered (31, "Processor type: i%d86\n",
1189 dpmi_version_data
.cpu
);
1190 printfi_filtered (31, "PIC base interrupt: Master: %#x Slave: %#x\n",
1191 dpmi_version_data
.master_pic
, dpmi_version_data
.slave_pic
);
1193 /* a_tss is only initialized when the debuggee is first run. */
1194 if (prog_has_started
)
1196 __asm__
__volatile__ ("pushfl ; popl %0" : "=g" (eflags
));
1197 printf_filtered ("Protection.....................Ring %d (in %s), with%s I/O protection\n",
1198 a_tss
.tss_cs
& 3, (a_tss
.tss_cs
& 4) ? "LDT" : "GDT",
1199 (a_tss
.tss_cs
& 3) > ((eflags
>> 12) & 3) ? "" : "out");
1201 puts_filtered ("\n");
1202 __dpmi_get_free_memory_information (&mem_info
);
1203 print_mem (mem_info
.total_number_of_physical_pages
,
1204 "DPMI Total Physical Memory.....", 1);
1205 print_mem (mem_info
.total_number_of_free_pages
,
1206 "DPMI Free Physical Memory......", 1);
1207 print_mem (mem_info
.size_of_paging_file_partition_in_pages
,
1208 "DPMI Swap Space................", 1);
1209 print_mem (mem_info
.linear_address_space_size_in_pages
,
1210 "DPMI Total Linear Address Size.", 1);
1211 print_mem (mem_info
.free_linear_address_space_in_pages
,
1212 "DPMI Free Linear Address Size..", 1);
1213 print_mem (mem_info
.largest_available_free_block_in_bytes
,
1214 "DPMI Largest Free Memory Block.", 0);
1218 __dpmi_int (0x21, ®s
);
1219 print_mem (regs
.x
.bx
<< 4, "Free DOS Memory................", 0);
1221 __dpmi_int (0x21, ®s
);
1222 if ((regs
.x
.flags
& 1) == 0)
1224 static const char *dos_hilo
[] = {
1225 "Low", "", "", "", "High", "", "", "", "High, then Low"
1227 static const char *dos_fit
[] = {
1228 "First", "Best", "Last"
1230 int hilo_idx
= (regs
.x
.ax
>> 4) & 0x0f;
1231 int fit_idx
= regs
.x
.ax
& 0x0f;
1237 printf_filtered ("DOS Memory Allocation..........%s memory, %s fit\n",
1238 dos_hilo
[hilo_idx
], dos_fit
[fit_idx
]);
1240 __dpmi_int (0x21, ®s
);
1241 if ((regs
.x
.flags
& 1) != 0)
1243 printfi_filtered (31, "UMBs %sin DOS memory chain\n",
1244 regs
.h
.al
== 0 ? "not " : "");
1249 unsigned short limit0
__attribute__((packed
));
1250 unsigned short base0
__attribute__((packed
));
1251 unsigned char base1
__attribute__((packed
));
1252 unsigned stype
:5 __attribute__((packed
));
1253 unsigned dpl
:2 __attribute__((packed
));
1254 unsigned present
:1 __attribute__((packed
));
1255 unsigned limit1
:4 __attribute__((packed
));
1256 unsigned available
:1 __attribute__((packed
));
1257 unsigned dummy
:1 __attribute__((packed
));
1258 unsigned bit32
:1 __attribute__((packed
));
1259 unsigned page_granular
:1 __attribute__((packed
));
1260 unsigned char base2
__attribute__((packed
));
1264 unsigned short offset0
__attribute__((packed
));
1265 unsigned short selector
__attribute__((packed
));
1266 unsigned param_count
:5 __attribute__((packed
));
1267 unsigned dummy
:3 __attribute__((packed
));
1268 unsigned stype
:5 __attribute__((packed
));
1269 unsigned dpl
:2 __attribute__((packed
));
1270 unsigned present
:1 __attribute__((packed
));
1271 unsigned short offset1
__attribute__((packed
));
1274 /* Read LEN bytes starting at logical address ADDR, and put the result
1275 into DEST. Return 1 if success, zero if not. */
1277 read_memory_region (unsigned long addr
, void *dest
, size_t len
)
1279 unsigned long dos_ds_limit
= __dpmi_get_segment_limit (_dos_ds
);
1281 /* For the low memory, we can simply use _dos_ds. */
1282 if (addr
<= dos_ds_limit
- len
)
1283 dosmemget (addr
, len
, dest
);
1286 /* For memory above 1MB we need to set up a special segment to
1287 be able to access that memory. */
1288 int sel
= __dpmi_allocate_ldt_descriptors (1);
1291 || __dpmi_set_segment_base_address (sel
, addr
) == -1
1292 || __dpmi_set_segment_limit (sel
, len
- 1) == -1)
1294 movedata (sel
, 0, _my_ds (), (unsigned)dest
, len
);
1295 __dpmi_free_ldt_descriptor (sel
);
1300 /* Get a segment descriptor stored at index IDX in the descriptor
1301 table whose base address is TABLE_BASE. Return the descriptor
1302 type, or -1 if failure. */
1304 get_descriptor (unsigned long table_base
, int idx
, void *descr
)
1306 unsigned long addr
= table_base
+ idx
* 8; /* 8 bytes per entry */
1308 if (read_memory_region (addr
, descr
, 8))
1309 return (int)((struct seg_descr
*)descr
)->stype
;
1314 unsigned short limit
__attribute__((packed
));
1315 unsigned long base
__attribute__((packed
));
1318 /* Display a segment descriptor stored at index IDX in a descriptor
1319 table whose type is TYPE and whose base address is BASE_ADDR. If
1320 FORCE is non-zero, display even invalid descriptors. */
1322 display_descriptor (unsigned type
, unsigned long base_addr
, int idx
, int force
)
1324 struct seg_descr descr
;
1325 struct gate_descr gate
;
1327 /* Get the descriptor from the table. */
1328 if (idx
== 0 && type
== 0)
1329 puts_filtered ("0x000: null descriptor\n");
1330 else if (get_descriptor (base_addr
, idx
, &descr
) != -1)
1332 /* For each type of descriptor table, this has a bit set if the
1333 corresponding type of selectors is valid in that table. */
1334 static unsigned allowed_descriptors
[] = {
1335 0xffffdafeL
, /* GDT */
1336 0x0000c0e0L
, /* IDT */
1337 0xffffdafaL
/* LDT */
1340 /* If the program hasn't started yet, assume the debuggee will
1341 have the same CPL as the debugger. */
1342 int cpl
= prog_has_started
? (a_tss
.tss_cs
& 3) : _my_cs () & 3;
1343 unsigned long limit
= (descr
.limit1
<< 16) | descr
.limit0
;
1346 && (allowed_descriptors
[type
] & (1 << descr
.stype
)) != 0)
1348 printf_filtered ("0x%03x: ",
1350 ? idx
: (idx
* 8) | (type
? (cpl
| 4) : 0));
1351 if (descr
.page_granular
)
1352 limit
= (limit
<< 12) | 0xfff; /* big segment: low 12 bit set */
1353 if (descr
.stype
== 1 || descr
.stype
== 2 || descr
.stype
== 3
1354 || descr
.stype
== 9 || descr
.stype
== 11
1355 || (descr
.stype
>= 16 && descr
.stype
< 32))
1356 printf_filtered ("base=0x%02x%02x%04x limit=0x%08lx",
1357 descr
.base2
, descr
.base1
, descr
.base0
, limit
);
1359 switch (descr
.stype
)
1363 printf_filtered (" 16-bit TSS (task %sactive)",
1364 descr
.stype
== 3 ? "" : "in");
1367 puts_filtered (" LDT");
1370 memcpy (&gate
, &descr
, sizeof gate
);
1371 printf_filtered ("selector=0x%04x offs=0x%04x%04x",
1372 gate
.selector
, gate
.offset1
, gate
.offset0
);
1373 printf_filtered (" 16-bit Call Gate (params=%d)",
1377 printf_filtered ("TSS selector=0x%04x", descr
.base0
);
1378 printfi_filtered (16, "Task Gate");
1382 memcpy (&gate
, &descr
, sizeof gate
);
1383 printf_filtered ("selector=0x%04x offs=0x%04x%04x",
1384 gate
.selector
, gate
.offset1
, gate
.offset0
);
1385 printf_filtered (" 16-bit %s Gate",
1386 descr
.stype
== 6 ? "Interrupt" : "Trap");
1390 printf_filtered (" 32-bit TSS (task %sactive)",
1391 descr
.stype
== 3 ? "" : "in");
1394 memcpy (&gate
, &descr
, sizeof gate
);
1395 printf_filtered ("selector=0x%04x offs=0x%04x%04x",
1396 gate
.selector
, gate
.offset1
, gate
.offset0
);
1397 printf_filtered (" 32-bit Call Gate (params=%d)",
1402 memcpy (&gate
, &descr
, sizeof gate
);
1403 printf_filtered ("selector=0x%04x offs=0x%04x%04x",
1404 gate
.selector
, gate
.offset1
, gate
.offset0
);
1405 printf_filtered (" 32-bit %s Gate",
1406 descr
.stype
== 14 ? "Interrupt" : "Trap");
1408 case 16: /* data segments */
1416 printf_filtered (" %s-bit Data (%s Exp-%s%s)",
1417 descr
.bit32
? "32" : "16",
1418 descr
.stype
& 2 ? "Read/Write," : "Read-Only, ",
1419 descr
.stype
& 4 ? "down" : "up",
1420 descr
.stype
& 1 ? "" : ", N.Acc");
1422 case 24: /* code segments */
1430 printf_filtered (" %s-bit Code (%s, %sConf%s)",
1431 descr
.bit32
? "32" : "16",
1432 descr
.stype
& 2 ? "Exec/Read" : "Exec-Only",
1433 descr
.stype
& 4 ? "" : "N.",
1434 descr
.stype
& 1 ? "" : ", N.Acc");
1437 printf_filtered ("Unknown type 0x%02x", descr
.stype
);
1440 puts_filtered ("\n");
1444 printf_filtered ("0x%03x: ",
1446 ? idx
: (idx
* 8) | (type
? (cpl
| 4) : 0));
1448 puts_filtered ("Segment not present\n");
1450 printf_filtered ("Segment type 0x%02x is invalid in this table\n",
1455 printf_filtered ("0x%03x: Cannot read this descriptor\n", idx
);
1459 go32_sldt (char *arg
, int from_tty
)
1461 struct dtr_reg gdtr
;
1462 unsigned short ldtr
= 0;
1464 struct seg_descr ldt_descr
;
1465 long ldt_entry
= -1L;
1466 int cpl
= (prog_has_started
? a_tss
.tss_cs
: _my_cs ()) & 3;
1470 while (*arg
&& isspace(*arg
))
1475 ldt_entry
= parse_and_eval_long (arg
);
1477 || (ldt_entry
& 4) == 0
1478 || (ldt_entry
& 3) != (cpl
& 3))
1479 error ("Invalid LDT entry 0x%03x.", ldt_entry
);
1483 __asm__
__volatile__ ("sgdt %0" : "=m" (gdtr
) : /* no inputs */ );
1484 __asm__
__volatile__ ("sldt %0" : "=m" (ldtr
) : /* no inputs */ );
1487 puts_filtered ("There is no LDT.\n");
1488 /* LDT's entry in the GDT must have the type LDT, which is 2. */
1489 else if (get_descriptor (gdtr
.base
, ldt_idx
, &ldt_descr
) != 2)
1490 printf_filtered ("LDT is present (at %#x), but unreadable by GDB.\n",
1492 | (ldt_descr
.base1
<< 16)
1493 | (ldt_descr
.base2
<< 24));
1498 | (ldt_descr
.base1
<< 16)
1499 | (ldt_descr
.base2
<< 24);
1500 unsigned limit
= ldt_descr
.limit0
| (ldt_descr
.limit1
<< 16);
1503 if (ldt_descr
.page_granular
)
1504 /* Page-granular segments must have the low 12 bits of their
1506 limit
= (limit
<< 12) | 0xfff;
1507 /* LDT cannot have more than 8K 8-byte entries, i.e. more than
1512 max_entry
= (limit
+ 1) / 8;
1516 if (ldt_entry
> limit
)
1517 error ("Invalid LDT entry %#x: outside valid limits [0..%#x]",
1520 display_descriptor (ldt_descr
.stype
, base
, ldt_entry
/ 8, 1);
1526 for (i
= 0; i
< max_entry
; i
++)
1527 display_descriptor (ldt_descr
.stype
, base
, i
, 0);
1533 go32_sgdt (char *arg
, int from_tty
)
1535 struct dtr_reg gdtr
;
1536 long gdt_entry
= -1L;
1541 while (*arg
&& isspace(*arg
))
1546 gdt_entry
= parse_and_eval_long (arg
);
1547 if (gdt_entry
< 0 || (gdt_entry
& 7) != 0)
1548 error ("Invalid GDT entry 0x%03x: not an integral multiple of 8.",
1553 __asm__
__volatile__ ("sgdt %0" : "=m" (gdtr
) : /* no inputs */ );
1554 max_entry
= (gdtr
.limit
+ 1) / 8;
1558 if (gdt_entry
> gdtr
.limit
)
1559 error ("Invalid GDT entry %#x: outside valid limits [0..%#x]",
1560 gdt_entry
, gdtr
.limit
);
1562 display_descriptor (0, gdtr
.base
, gdt_entry
/ 8, 1);
1568 for (i
= 0; i
< max_entry
; i
++)
1569 display_descriptor (0, gdtr
.base
, i
, 0);
1574 go32_sidt (char *arg
, int from_tty
)
1576 struct dtr_reg idtr
;
1577 long idt_entry
= -1L;
1582 while (*arg
&& isspace(*arg
))
1587 idt_entry
= parse_and_eval_long (arg
);
1589 error ("Invalid (negative) IDT entry 0x%03x.", idt_entry
);
1593 __asm__
__volatile__ ("sidt %0" : "=m" (idtr
) : /* no inputs */ );
1594 max_entry
= (idtr
.limit
+ 1) / 8;
1595 if (max_entry
> 0x100) /* no more than 256 entries */
1600 if (idt_entry
> idtr
.limit
)
1601 error ("Invalid IDT entry %#x: outside valid limits [0..%#x]",
1602 idt_entry
, idtr
.limit
);
1604 display_descriptor (1, idtr
.base
, idt_entry
, 1);
1610 for (i
= 0; i
< max_entry
; i
++)
1611 display_descriptor (1, idtr
.base
, i
, 0);
1616 _initialize_go32_nat (void)
1619 add_target (&go32_ops
);
1621 add_info ("dos-sysinfo", go32_sysinfo
,
1622 "Display information about the target system, including CPU, OS, DPMI, etc.");
1623 add_info ("dos-ldt", go32_sldt
,
1624 "Display entries in the LDT (Local Descriptor Table).\n"
1625 "Entry number (an expression) as an argument means display only that entry.");
1626 add_info ("dos-gdt", go32_sgdt
,
1627 "Display entries in the GDT (Global Descriptor Table).\n"
1628 "Entry number (an expression) as an argument means display only that entry.");
1629 add_info ("dos-idt", go32_sidt
,
1630 "Display entries in the IDT (Interrupt Descriptor Table).\n"
1631 "Entry number (an expression) as an argument means display only that entry.");
1644 tcsetpgrp (int fd
, pid_t pgid
)
1646 if (isatty (fd
) && pgid
== SOME_PID
)
1648 errno
= pgid
== SOME_PID
? ENOTTY
: ENOSYS
;