1 /* Native debugging support for Intel x86 running DJGPP.
2 Copyright 1997, 1999 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"
32 #include <stdio.h> /* required for __DJGPP_MINOR__ */
39 #include <debug/v2load.h>
40 #include <debug/dbgcom.h>
41 #if __DJGPP_MINOR__ > 2
42 #include <debug/redir.h>
45 #if __DJGPP_MINOR__ < 3
46 /* This code will be provided from DJGPP 2.03 on. Until then I code it
54 unsigned short exponent:15;
55 unsigned short sign:1;
74 static void save_npx (void); /* Save the FPU of the debugged program */
75 static void load_npx (void); /* Restore the FPU of the debugged program */
77 /* ------------------------------------------------------------------------- */
78 /* Store the contents of the NPX in the global variable `npx'. */
106 /* ------------------------------------------------------------------------- */
107 /* Reload the contents of the NPX from the global variable `npx'. */
112 asm ("frstor %0":"=m" (npx));
114 /* ------------------------------------------------------------------------- */
115 /* Stubs for the missing redirection functions. */
121 void redir_cmdline_delete (cmdline_t *ptr) {ptr->redirected = 0;}
122 int redir_cmdline_parse (const char *args, cmdline_t *ptr)
126 int redir_to_child (cmdline_t *ptr)
130 int redir_to_debugger (cmdline_t *ptr)
134 int redir_debug_init (cmdline_t *ptr) { return 0; }
135 #endif /* __DJGPP_MINOR < 3 */
137 extern void _initialize_go32_nat (void);
139 typedef enum { wp_insert, wp_remove, wp_count } wp_op;
141 /* This holds the current reference counts for each debug register. */
142 static int dr_ref_count[4];
144 extern char **environ;
148 static int prog_has_started = 0;
149 static void go32_open (char *name, int from_tty);
150 static void go32_close (int quitting);
151 static void go32_attach (char *args, int from_tty);
152 static void go32_detach (char *args, int from_tty);
153 static void go32_resume (int pid, int step, enum target_signal siggnal);
154 static int go32_wait (int pid, struct target_waitstatus *status);
155 static void go32_fetch_registers (int regno);
156 static void store_register (int regno);
157 static void go32_store_registers (int regno);
158 static void go32_prepare_to_store (void);
159 static int go32_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len,
160 int write, struct target_ops *target);
161 static void go32_files_info (struct target_ops *target);
162 static void go32_stop (void);
163 static void go32_kill_inferior (void);
164 static void go32_create_inferior (char *exec_file, char *args, char **env);
165 static void cleanup_dregs (void);
166 static void go32_mourn_inferior (void);
167 static int go32_can_run (void);
168 static int go32_insert_aligned_watchpoint (CORE_ADDR waddr, CORE_ADDR addr,
170 static int go32_remove_aligned_watchpoint (CORE_ADDR waddr, CORE_ADDR addr,
172 static int go32_handle_nonaligned_watchpoint (wp_op what, CORE_ADDR waddr,
173 CORE_ADDR addr, int len, int rw);
175 static struct target_ops go32_ops;
176 static void go32_terminal_init (void);
177 static void go32_terminal_inferior (void);
178 static void go32_terminal_ours (void);
180 #define r_ofs(x) (offsetof(TSS,x))
189 {r_ofs (tss_eax), 4}, /* normal registers, from a_tss */
190 {r_ofs (tss_ecx), 4},
191 {r_ofs (tss_edx), 4},
192 {r_ofs (tss_ebx), 4},
193 {r_ofs (tss_esp), 4},
194 {r_ofs (tss_ebp), 4},
195 {r_ofs (tss_esi), 4},
196 {r_ofs (tss_edi), 4},
197 {r_ofs (tss_eip), 4},
198 {r_ofs (tss_eflags), 4},
205 {0, 10}, /* 8 FP registers, from npx.reg[] */
213 /* The order of the next 7 registers must be consistent
214 with their numbering in config/i386/tm-i386.h, which see. */
215 {0, 2}, /* control word, from npx */
216 {4, 2}, /* status word, from npx */
217 {8, 2}, /* tag word, from npx */
218 {16, 2}, /* last FP exception CS from npx */
219 {12, 4}, /* last FP exception EIP from npx */
220 {24, 2}, /* last FP exception operand selector from npx */
221 {20, 4}, /* last FP exception operand offset from npx */
222 {18, 2} /* last FP opcode from npx */
228 enum target_signal gdb_sig;
232 {0, TARGET_SIGNAL_FPE},
233 {1, TARGET_SIGNAL_TRAP},
234 /* Exception 2 is triggered by the NMI. DJGPP handles it as SIGILL,
235 but I think SIGBUS is better, since the NMI is usually activated
236 as a result of a memory parity check failure. */
237 {2, TARGET_SIGNAL_BUS},
238 {3, TARGET_SIGNAL_TRAP},
239 {4, TARGET_SIGNAL_FPE},
240 {5, TARGET_SIGNAL_SEGV},
241 {6, TARGET_SIGNAL_ILL},
242 {7, TARGET_SIGNAL_EMT}, /* no-coprocessor exception */
243 {8, TARGET_SIGNAL_SEGV},
244 {9, TARGET_SIGNAL_SEGV},
245 {10, TARGET_SIGNAL_BUS},
246 {11, TARGET_SIGNAL_SEGV},
247 {12, TARGET_SIGNAL_SEGV},
248 {13, TARGET_SIGNAL_SEGV},
249 {14, TARGET_SIGNAL_SEGV},
250 {16, TARGET_SIGNAL_FPE},
251 {17, TARGET_SIGNAL_BUS},
252 {31, TARGET_SIGNAL_ILL},
253 {0x1b, TARGET_SIGNAL_INT},
254 {0x75, TARGET_SIGNAL_FPE},
255 {0x78, TARGET_SIGNAL_ALRM},
256 {0x79, TARGET_SIGNAL_INT},
257 {0x7a, TARGET_SIGNAL_QUIT},
258 {-1, TARGET_SIGNAL_LAST}
262 enum target_signal gdb_sig;
265 {TARGET_SIGNAL_0, -1},
266 {TARGET_SIGNAL_ILL, 6}, /* Invalid Opcode */
267 {TARGET_SIGNAL_EMT, 7}, /* triggers SIGNOFP */
268 {TARGET_SIGNAL_SEGV, 13}, /* GPF */
269 {TARGET_SIGNAL_BUS, 17}, /* Alignment Check */
270 /* The rest are fake exceptions, see dpmiexcp.c in djlsr*.zip for
272 {TARGET_SIGNAL_TERM, 0x1b}, /* triggers Ctrl-Break type of SIGINT */
273 {TARGET_SIGNAL_FPE, 0x75},
274 {TARGET_SIGNAL_INT, 0x79},
275 {TARGET_SIGNAL_QUIT, 0x7a},
276 {TARGET_SIGNAL_ALRM, 0x78}, /* triggers SIGTIMR */
277 {TARGET_SIGNAL_PROF, 0x78},
278 {TARGET_SIGNAL_LAST, -1}
282 go32_open (char *name ATTRIBUTE_UNUSED, int from_tty ATTRIBUTE_UNUSED)
284 printf_unfiltered ("Done. Use the \"run\" command to run the program.\n");
288 go32_close (int quitting ATTRIBUTE_UNUSED)
293 go32_attach (char *args ATTRIBUTE_UNUSED, int from_tty ATTRIBUTE_UNUSED)
296 You cannot attach to a running program on this platform.\n\
297 Use the `run' command to run DJGPP programs.");
301 go32_detach (char *args ATTRIBUTE_UNUSED, int from_tty ATTRIBUTE_UNUSED)
305 static int resume_is_step;
306 static int resume_signal = -1;
309 go32_resume (int pid ATTRIBUTE_UNUSED, int step, enum target_signal siggnal)
313 resume_is_step = step;
315 if (siggnal != TARGET_SIGNAL_0 && siggnal != TARGET_SIGNAL_TRAP)
317 for (i = 0, resume_signal = -1;
318 excepn_map[i].gdb_sig != TARGET_SIGNAL_LAST; i++)
319 if (excepn_map[i].gdb_sig == siggnal)
321 resume_signal = excepn_map[i].djgpp_excepno;
324 if (resume_signal == -1)
325 printf_unfiltered ("Cannot deliver signal %s on this platform.\n",
326 target_signal_to_name (siggnal));
330 static char child_cwd[FILENAME_MAX];
333 go32_wait (int pid ATTRIBUTE_UNUSED, struct target_waitstatus *status)
336 unsigned char saved_opcode;
337 unsigned long INT3_addr = 0;
338 int stepping_over_INT = 0;
340 a_tss.tss_eflags &= 0xfeff; /* reset the single-step flag (TF) */
343 /* If the next instruction is INT xx or INTO, we need to handle
344 them specially. Intel manuals say that these instructions
345 reset the single-step flag (a.k.a. TF). However, it seems
346 that, at least in the DPMI environment, and at least when
347 stepping over the DPMI interrupt 31h, the problem is having
348 TF set at all when INT 31h is executed: the debuggee either
349 crashes (and takes the system with it) or is killed by a
352 So we need to emulate single-step mode: we put an INT3 opcode
353 right after the INT xx instruction, let the debuggee run
354 until it hits INT3 and stops, then restore the original
355 instruction which we overwrote with the INT3 opcode, and back
356 up the debuggee's EIP to that instruction. */
357 read_child (a_tss.tss_eip, &saved_opcode, 1);
358 if (saved_opcode == 0xCD || saved_opcode == 0xCE)
360 unsigned char INT3_opcode = 0xCC;
363 = saved_opcode == 0xCD ? a_tss.tss_eip + 2 : a_tss.tss_eip + 1;
364 stepping_over_INT = 1;
365 read_child (INT3_addr, &saved_opcode, 1);
366 write_child (INT3_addr, &INT3_opcode, 1);
369 a_tss.tss_eflags |= 0x0100; /* normal instruction: set TF */
372 /* The special value FFFFh in tss_trap indicates to run_child that
373 tss_irqn holds a signal to be delivered to the debuggee. */
374 if (resume_signal <= -1)
377 a_tss.tss_irqn = 0xff;
381 a_tss.tss_trap = 0xffff; /* run_child looks for this */
382 a_tss.tss_irqn = resume_signal;
385 /* The child might change working directory behind our back. The
386 GDB users won't like the side effects of that when they work with
387 relative file names, and GDB might be confused by its current
388 directory not being in sync with the truth. So we always make a
389 point of changing back to where GDB thinks is its cwd, when we
390 return control to the debugger, but restore child's cwd before we
392 /* Initialize child_cwd, before the first call to run_child and not
393 in the initialization, so the child get also the changed directory
394 set with the gdb-command "cd ..." */
396 /* Initialize child's cwd with the current one. */
397 getcwd (child_cwd, sizeof (child_cwd));
401 #if __DJGPP_MINOR__ < 3
405 #if __DJGPP_MINOR__ < 3
409 /* Did we step over an INT xx instruction? */
410 if (stepping_over_INT && a_tss.tss_eip == INT3_addr + 1)
412 /* Restore the original opcode. */
413 a_tss.tss_eip--; /* EIP points *after* the INT3 instruction */
414 write_child (a_tss.tss_eip, &saved_opcode, 1);
415 /* Simulate a TRAP exception. */
417 a_tss.tss_eflags |= 0x0100;
420 getcwd (child_cwd, sizeof (child_cwd)); /* in case it has changed */
421 chdir (current_directory);
423 if (a_tss.tss_irqn == 0x21)
425 status->kind = TARGET_WAITKIND_EXITED;
426 status->value.integer = a_tss.tss_eax & 0xff;
430 status->value.sig = TARGET_SIGNAL_UNKNOWN;
431 status->kind = TARGET_WAITKIND_STOPPED;
432 for (i = 0; sig_map[i].go32_sig != -1; i++)
434 if (a_tss.tss_irqn == sig_map[i].go32_sig)
436 #if __DJGPP_MINOR__ < 3
437 if ((status->value.sig = sig_map[i].gdb_sig) !=
439 status->kind = TARGET_WAITKIND_SIGNALLED;
441 status->value.sig = sig_map[i].gdb_sig;
451 go32_fetch_registers (int regno)
454 int end_reg = regno + 1; /* just one reg initially */
456 if (regno < 0) /* do the all registers */
458 regno = 0; /* start at first register */
459 /* # regs in table */
460 end_reg = sizeof (regno_mapping) / sizeof (regno_mapping[0]);
463 for (; regno < end_reg; regno++)
466 supply_register (regno,
467 (char *) &a_tss + regno_mapping[regno].tss_ofs);
469 supply_register (regno,
470 (char *) &npx.reg[regno_mapping[regno].tss_ofs]);
475 switch (regno_mapping[regno].size)
478 regval = *(unsigned short *)
479 ((char *) &npx + regno_mapping[regno].tss_ofs);
481 if (regno == FOP_REGNUM && regval)
482 /* Feature: restore the 5 bits of the opcode
483 stripped by FSAVE/FNSAVE. */
487 regval = *(unsigned *)
488 ((char *) &npx + regno_mapping[regno].tss_ofs);
492 Invalid native size for register no. %d in go32_fetch_register.", regno);
494 supply_register (regno, (char *) ®val);
497 internal_error ("Invalid register no. %d in go32_fetch_register.",
503 store_register (int regno)
506 void *v = (void *) ®isters[REGISTER_BYTE (regno)];
509 rp = (char *) &a_tss + regno_mapping[regno].tss_ofs;
511 rp = (char *) &npx.reg[regno_mapping[regno].tss_ofs];
513 rp = (char *) &npx + regno_mapping[regno].tss_ofs;
515 internal_error ("Invalid register no. %d in store_register.", regno);
516 memcpy (rp, v, regno_mapping[regno].size);
517 if (regno == FOP_REGNUM)
518 *(short *)rp &= 0x07ff; /* strip high 5 bits, in case they added them */
522 go32_store_registers (int regno)
527 store_register (regno);
530 for (r = 0; r < sizeof (regno_mapping) / sizeof (regno_mapping[0]); r++)
536 go32_prepare_to_store (void)
541 go32_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
542 struct target_ops *target ATTRIBUTE_UNUSED)
546 if (write_child (memaddr, myaddr, len))
557 if (read_child (memaddr, myaddr, len))
568 static cmdline_t child_cmd; /* parsed child's command line kept here */
571 go32_files_info (struct target_ops *target ATTRIBUTE_UNUSED)
573 printf_unfiltered ("You are running a DJGPP V2 program.\n");
582 prog_has_started = 0;
586 go32_kill_inferior (void)
588 redir_cmdline_delete (&child_cmd);
591 unpush_target (&go32_ops);
595 go32_create_inferior (char *exec_file, char *args, char **env)
599 char **env_save = environ;
601 /* If no exec file handed to us, get it from the exec-file command -- with
602 a good, common error message if none is specified. */
604 exec_file = get_exec_file (1);
606 if (prog_has_started)
609 go32_kill_inferior ();
614 /* Initialize child's cwd as empty to be initialized when starting
618 /* Init command line storage. */
619 if (redir_debug_init (&child_cmd) == -1)
620 internal_error ("Cannot allocate redirection storage: not enough memory.\n");
622 /* Parse the command line and create redirections. */
623 if (strpbrk (args, "<>"))
625 if (redir_cmdline_parse (args, &child_cmd) == 0)
626 args = child_cmd.command;
628 error ("Syntax error in command line.");
631 child_cmd.command = xstrdup (args);
633 cmdline = (char *) alloca (strlen (args) + 4);
634 cmdline[0] = strlen (args);
635 strcpy (cmdline + 1, args);
636 cmdline[strlen (args) + 1] = 13;
640 if (v2loadimage (exec_file, cmdline, start_state))
643 printf_unfiltered ("Load failed for image %s\n", exec_file);
648 edi_init (start_state);
649 #if __DJGPP_MINOR__ < 3
653 inferior_pid = SOME_PID;
654 push_target (&go32_ops);
655 clear_proceed_status ();
656 insert_breakpoints ();
657 proceed ((CORE_ADDR) -1, TARGET_SIGNAL_0, 0);
658 prog_has_started = 1;
662 go32_mourn_inferior (void)
664 /* We need to make sure all the breakpoint enable bits in the DR7
665 register are reset when the inferior exits. Otherwise, if they
666 rerun the inferior, the uncleared bits may cause random SIGTRAPs,
667 failure to set more watchpoints, and other calamities. It would
668 be nice if GDB itself would take care to remove all breakpoints
669 at all times, but it doesn't, probably under an assumption that
670 the OS cleans up when the debuggee exits. */
672 go32_kill_inferior ();
673 generic_mourn_inferior ();
682 /* Hardware watchpoint support. */
686 #define DR_ENABLE_SIZE 2
687 #define DR_LOCAL_ENABLE_SHIFT 0
688 #define DR_GLOBAL_ENABLE_SHIFT 1
689 #define DR_LOCAL_SLOWDOWN 0x100
690 #define DR_GLOBAL_SLOWDOWN 0x200
691 #define DR_CONTROL_SHIFT 16
692 #define DR_CONTROL_SIZE 4
693 #define DR_RW_READWRITE 0x3
694 #define DR_RW_WRITE 0x1
695 #define DR_CONTROL_MASK 0xf
696 #define DR_ENABLE_MASK 0x3
701 #define D_REGS edi.dr
702 #define CONTROL D_REGS[DR_CONTROL]
703 #define STATUS D_REGS[DR_STATUS]
705 #define IS_REG_FREE(index) \
706 (!(CONTROL & (3 << (DR_ENABLE_SIZE * (index)))))
708 #define LOCAL_ENABLE_REG(index) \
709 (CONTROL |= (1 << (DR_LOCAL_ENABLE_SHIFT + DR_ENABLE_SIZE * (index))))
711 #define GLOBAL_ENABLE_REG(index) \
712 (CONTROL |= (1 << (DR_GLOBAL_ENABLE_SHIFT + DR_ENABLE_SIZE * (index))))
714 #define DISABLE_REG(index) \
715 (CONTROL &= ~(3 << (DR_ENABLE_SIZE * (index))))
717 #define SET_LOCAL_EXACT() \
718 (CONTROL |= DR_LOCAL_SLOWDOWN)
720 #define SET_GLOBAL_EXACT() \
721 (CONTROL |= DR_GLOBAL_SLOWDOWN)
723 #define RESET_LOCAL_EXACT() \
724 (CONTROL &= ~(DR_LOCAL_SLOWDOWN))
726 #define RESET_GLOBAL_EXACT() \
727 (CONTROL &= ~(DR_GLOBAL_SLOWDOWN))
729 #define SET_BREAK(index,address) \
731 CONTROL &= ~(DR_CONTROL_MASK << (DR_CONTROL_SHIFT + DR_CONTROL_SIZE * (index)));\
732 D_REGS[index] = address;\
733 dr_ref_count[index]++;\
736 #define SET_WATCH(index,address,rw,len) \
738 SET_BREAK(index,address);\
739 CONTROL |= ((len)|(rw)) << (DR_CONTROL_SHIFT + DR_CONTROL_SIZE * (index));\
742 #define IS_WATCH(index) \
743 (CONTROL & (DR_CONTROL_MASK << (DR_CONTROL_SHIFT + DR_CONTROL_SIZE*(index))))
745 #define WATCH_HIT(index) ((STATUS & (1 << (index))) && IS_WATCH(index))
747 #define DR_DEF(index) \
748 ((CONTROL >> (DR_CONTROL_SHIFT + DR_CONTROL_SIZE * (index))) & 0x0f)
751 #if 0 /* use debugging macro */
752 #define SHOW_DR(text,len) \
754 if (!getenv ("GDB_SHOW_DR")) break; \
755 fprintf(stderr,"%08x %08x ",edi.dr[7],edi.dr[6]); \
756 fprintf(stderr,"%08x %d %08x %d ", \
757 edi.dr[0],dr_ref_count[0],edi.dr[1],dr_ref_count[1]); \
758 fprintf(stderr,"%08x %d %08x %d ", \
759 edi.dr[2],dr_ref_count[2],edi.dr[3],dr_ref_count[3]); \
760 fprintf(stderr,(len)?"(%s:%d)\n":"(%s)\n",#text,len); \
763 #define SHOW_DR(text,len) do {} while (0)
773 for (i = 0; i < 4; i++)
780 /* Insert a watchpoint. */
783 go32_insert_watchpoint (int pid ATTRIBUTE_UNUSED, CORE_ADDR addr,
786 int ret = go32_insert_aligned_watchpoint (addr, addr, len, rw);
788 SHOW_DR (insert_watch, len);
793 go32_insert_aligned_watchpoint (CORE_ADDR waddr, CORE_ADDR addr,
797 int read_write_bits, len_bits;
799 /* Values of rw: 0 - write, 1 - read, 2 - access (read and write).
800 However, x86 doesn't support read-only data breakpoints. */
801 read_write_bits = rw ? DR_RW_READWRITE : DR_RW_WRITE;
815 /* The debug registers only have 2 bits for the length, so
816 so this value will always fail the loop below. */
820 /* Look for an occupied debug register with the same address and the
821 same RW and LEN definitions. If we find one, we can use it for
822 this watchpoint as well (and save a register). */
823 for (i = 0; i < 4; i++)
825 if (!IS_REG_FREE (i) && D_REGS[i] == addr
826 && DR_DEF (i) == (unsigned)(len_bits | read_write_bits))
833 /* Look for a free debug register. */
834 for (i = 0; i <= 3; i++)
840 /* No more debug registers! */
847 return go32_handle_nonaligned_watchpoint (wp_insert, waddr, addr,
853 return go32_handle_nonaligned_watchpoint (wp_insert, waddr, addr,
857 return go32_handle_nonaligned_watchpoint (wp_insert, waddr, addr, len, rw);
859 SET_WATCH (i, addr, read_write_bits, len_bits);
860 LOCAL_ENABLE_REG (i);
867 go32_handle_nonaligned_watchpoint (wp_op what, CORE_ADDR waddr, CORE_ADDR addr,
872 int rv = 0, status = 0;
874 static int size_try_array[4][4] =
876 { 1, 1, 1, 1 }, /* trying size one */
877 { 2, 1, 2, 1 }, /* trying size two */
878 { 2, 1, 2, 1 }, /* trying size three */
879 { 4, 1, 2, 1 } /* trying size four */
885 /* Four is the maximum length a 386 debug register can watch. */
886 size = size_try_array[len > 4 ? 3 : len - 1][align];
887 if (what == wp_insert)
888 status = go32_insert_aligned_watchpoint (waddr, addr, size, rw);
889 else if (what == wp_remove)
890 status = go32_remove_aligned_watchpoint (waddr, addr, size, rw);
891 else if (what == wp_count)
895 /* We keep the loop going even after a failure, because some of
896 the other aligned watchpoints might still succeed, e.g. if
897 they watch addresses that are already watched, and thus just
898 increment the reference counts of occupied debug registers.
899 If we break out of the loop too early, we could cause those
900 addresses watched by other watchpoints to be disabled when
901 GDB reacts to our failure to insert this watchpoint and tries
911 /* Remove a watchpoint. */
914 go32_remove_watchpoint (int pid ATTRIBUTE_UNUSED, CORE_ADDR addr,
917 int ret = go32_remove_aligned_watchpoint (addr, addr, len, rw);
919 SHOW_DR (remove_watch, len);
924 go32_remove_aligned_watchpoint (CORE_ADDR waddr, CORE_ADDR addr,
928 int read_write_bits, len_bits;
930 /* Values of rw: 0 - write, 1 - read, 2 - access (read and write).
931 However, x86 doesn't support read-only data breakpoints. */
932 read_write_bits = rw ? DR_RW_READWRITE : DR_RW_WRITE;
946 /* The debug registers only have 2 bits for the length, so
947 so this value will always fail the loop below. */
954 return go32_handle_nonaligned_watchpoint (wp_remove, waddr, addr,
960 return go32_handle_nonaligned_watchpoint (wp_remove, waddr, addr,
964 return go32_handle_nonaligned_watchpoint (wp_remove, waddr, addr, len, rw);
966 for (i = 0; i <= 3; i++)
968 if (!IS_REG_FREE (i) && D_REGS[i] == addr
969 && DR_DEF (i) == (unsigned)(len_bits | read_write_bits))
972 if (dr_ref_count[i] == 0)
976 RESET_LOCAL_EXACT ();
977 RESET_GLOBAL_EXACT ();
982 /* Can we use debug registers to watch a region whose address is ADDR
983 and whose length is LEN bytes? */
986 go32_region_ok_for_watchpoint (CORE_ADDR addr, int len)
988 /* Compute how many aligned watchpoints we would need to cover this
990 int nregs = go32_handle_nonaligned_watchpoint (wp_count, addr, addr, len, 0);
992 return nregs <= 4 ? 1 : 0;
995 /* Check if stopped by a data watchpoint. If so, return the address
996 whose access triggered the watchpoint. */
999 go32_stopped_by_watchpoint (int pid ATTRIBUTE_UNUSED, int data_watchpoint)
1004 status = edi.dr[DR_STATUS];
1005 SHOW_DR (stopped_by, 0);
1006 for (i = 0; i <= 3; i++)
1008 if (WATCH_HIT (i) && data_watchpoint)
1010 SHOW_DR (WP_HIT, 0);
1018 /* Remove a breakpoint. */
1021 go32_remove_hw_breakpoint (CORE_ADDR addr, void *shadow ATTRIBUTE_UNUSED)
1024 for (i = 0; i <= 3; i++)
1026 if (!IS_REG_FREE (i) && D_REGS[i] == addr && DR_DEF (i) == 0)
1029 if (dr_ref_count[i] == 0)
1033 SHOW_DR (remove_hw, 0);
1038 go32_insert_hw_breakpoint (CORE_ADDR addr, void *shadow ATTRIBUTE_UNUSED)
1042 /* Look for an occupied debug register with the same address and the
1043 same RW and LEN definitions. If we find one, we can use it for
1044 this breakpoint as well (and save a register). */
1045 for (i = 0; i < 4; i++)
1047 if (!IS_REG_FREE (i) && D_REGS[i] == addr && DR_DEF (i) == 0)
1050 SHOW_DR (insert_hw, 0);
1055 /* Look for a free debug register. */
1056 for (i = 0; i <= 3; i++)
1058 if (IS_REG_FREE (i))
1062 /* No more debug registers? */
1065 SET_BREAK (i, addr);
1066 LOCAL_ENABLE_REG (i);
1068 SHOW_DR (insert_hw, 0);
1070 return i < 4 ? 0 : EBUSY;
1073 /* Put the device open on handle FD into either raw or cooked
1074 mode, return 1 if it was in raw mode, zero otherwise. */
1077 device_mode (int fd, int raw_p)
1079 int oldmode, newmode;
1084 __dpmi_int (0x21, ®s);
1085 if (regs.x.flags & 1)
1087 newmode = oldmode = regs.x.dx;
1094 if (oldmode & 0x80) /* Only for character dev */
1098 regs.x.dx = newmode & 0xff; /* Force upper byte zero, else it fails */
1099 __dpmi_int (0x21, ®s);
1100 if (regs.x.flags & 1)
1103 return (oldmode & 0x20) == 0x20;
1107 static int inf_mode_valid = 0;
1108 static int inf_terminal_mode;
1110 /* This semaphore is needed because, amazingly enough, GDB calls
1111 target.to_terminal_ours more than once after the inferior stops.
1112 But we need the information from the first call only, since the
1113 second call will always see GDB's own cooked terminal. */
1114 static int terminal_is_ours = 1;
1117 go32_terminal_init (void)
1119 inf_mode_valid = 0; /* reinitialize, in case they are restarting child */
1120 terminal_is_ours = 1;
1124 go32_terminal_info (char *args ATTRIBUTE_UNUSED, int from_tty ATTRIBUTE_UNUSED)
1126 printf_unfiltered ("Inferior's terminal is in %s mode.\n",
1128 ? "default" : inf_terminal_mode ? "raw" : "cooked");
1130 #if __DJGPP_MINOR__ > 2
1131 if (child_cmd.redirection)
1135 for (i = 0; i < DBG_HANDLES; i++)
1137 if (child_cmd.redirection[i]->file_name)
1138 printf_unfiltered ("\tFile handle %d is redirected to `%s'.\n",
1139 i, child_cmd.redirection[i]->file_name);
1140 else if (_get_dev_info (child_cmd.redirection[i]->inf_handle) == -1)
1142 ("\tFile handle %d appears to be closed by inferior.\n", i);
1143 /* Mask off the raw/cooked bit when comparing device info words. */
1144 else if ((_get_dev_info (child_cmd.redirection[i]->inf_handle) & 0xdf)
1145 != (_get_dev_info (i) & 0xdf))
1147 ("\tFile handle %d appears to be redirected by inferior.\n", i);
1154 go32_terminal_inferior (void)
1156 /* Redirect standard handles as child wants them. */
1158 if (redir_to_child (&child_cmd) == -1)
1160 redir_to_debugger (&child_cmd);
1161 error ("Cannot redirect standard handles for program: %s.",
1164 /* set the console device of the inferior to whatever mode
1165 (raw or cooked) we found it last time */
1166 if (terminal_is_ours)
1169 device_mode (0, inf_terminal_mode);
1170 terminal_is_ours = 0;
1175 go32_terminal_ours (void)
1177 /* Switch to cooked mode on the gdb terminal and save the inferior
1178 terminal mode to be restored when it is resumed */
1179 if (!terminal_is_ours)
1181 inf_terminal_mode = device_mode (0, 0);
1182 if (inf_terminal_mode != -1)
1185 /* If device_mode returned -1, we don't know what happens with
1186 handle 0 anymore, so make the info invalid. */
1188 terminal_is_ours = 1;
1190 /* Restore debugger's standard handles. */
1192 if (redir_to_debugger (&child_cmd) == -1)
1194 redir_to_child (&child_cmd);
1195 error ("Cannot redirect standard handles for debugger: %s.",
1202 init_go32_ops (void)
1204 go32_ops.to_shortname = "djgpp";
1205 go32_ops.to_longname = "djgpp target process";
1207 "Program loaded by djgpp, when gdb is used as an external debugger";
1208 go32_ops.to_open = go32_open;
1209 go32_ops.to_close = go32_close;
1210 go32_ops.to_attach = go32_attach;
1211 go32_ops.to_detach = go32_detach;
1212 go32_ops.to_resume = go32_resume;
1213 go32_ops.to_wait = go32_wait;
1214 go32_ops.to_fetch_registers = go32_fetch_registers;
1215 go32_ops.to_store_registers = go32_store_registers;
1216 go32_ops.to_prepare_to_store = go32_prepare_to_store;
1217 go32_ops.to_xfer_memory = go32_xfer_memory;
1218 go32_ops.to_files_info = go32_files_info;
1219 go32_ops.to_insert_breakpoint = memory_insert_breakpoint;
1220 go32_ops.to_remove_breakpoint = memory_remove_breakpoint;
1221 go32_ops.to_terminal_init = go32_terminal_init;
1222 go32_ops.to_terminal_inferior = go32_terminal_inferior;
1223 go32_ops.to_terminal_ours_for_output = go32_terminal_ours;
1224 go32_ops.to_terminal_ours = go32_terminal_ours;
1225 go32_ops.to_terminal_info = go32_terminal_info;
1226 go32_ops.to_kill = go32_kill_inferior;
1227 go32_ops.to_create_inferior = go32_create_inferior;
1228 go32_ops.to_mourn_inferior = go32_mourn_inferior;
1229 go32_ops.to_can_run = go32_can_run;
1230 go32_ops.to_stop = go32_stop;
1231 go32_ops.to_stratum = process_stratum;
1232 go32_ops.to_has_all_memory = 1;
1233 go32_ops.to_has_memory = 1;
1234 go32_ops.to_has_stack = 1;
1235 go32_ops.to_has_registers = 1;
1236 go32_ops.to_has_execution = 1;
1237 go32_ops.to_magic = OPS_MAGIC;
1239 /* Initialize child's cwd as empty to be initialized when starting
1243 /* Initialize child's command line storage. */
1244 if (redir_debug_init (&child_cmd) == -1)
1245 internal_error ("Cannot allocate redirection storage: not enough memory.\n");
1247 /* We are always processing GCC-compiled programs. */
1248 processing_gcc_compilation = 2;
1252 _initialize_go32_nat (void)
1255 add_target (&go32_ops);
1268 tcsetpgrp (int fd, pid_t pgid)
1270 if (isatty (fd) && pgid == SOME_PID)
1272 errno = pgid == SOME_PID ? ENOTTY : ENOSYS;