1 /* Low level interface to ptrace, for GDB when running under Unix.
2 Copyright 1986, 1987, 1989, 1991, 1992 Free Software Foundation, Inc.
4 This file is part of GDB.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
30 #include <sys/types.h>
33 /* Some USG-esque systems (some of which are BSD-esque enough so that USG
34 is not defined) want this header, and it won't do any harm. */
37 #include <sys/param.h>
40 extern char *strerror(); /* strings corresponding to errno */
42 extern struct target_ops child_ops
;
44 /* Nonzero if we are debugging an attached outside process
45 rather than an inferior. */
50 /* Record terminal status separately for debugger and inferior. */
52 /* Does GDB have a terminal (on stdin)? */
53 int gdb_has_a_terminal
;
55 static TERMINAL sg_inferior
;
56 static TERMINAL sg_ours
;
58 static int tflags_inferior
;
59 static int tflags_ours
;
61 #if defined(TIOCGETC) && !defined(TIOCGETC_BROKEN)
62 static struct tchars tc_inferior
;
63 static struct tchars tc_ours
;
66 #if defined(TIOCGLTC) && !defined(TIOCGLTC_BROKEN)
67 static struct ltchars ltc_inferior
;
68 static struct ltchars ltc_ours
;
72 static int lmode_inferior
;
73 static int lmode_ours
;
78 static short pgrp_inferior
;
79 static short pgrp_ours
;
80 # else /* not def SHORT_PGRP */
81 static int pgrp_inferior
;
83 # endif /* not def SHORT_PGRP */
84 #else /* not def TIOCGPGRP */
85 static void (*sigint_ours
) ();
86 static void (*sigquit_ours
) ();
87 #endif /* TIOCGPGRP */
89 /* The name of the tty (from the `tty' command) that we gave to the inferior
90 when it was last started. */
92 static char *inferior_thisrun_terminal
;
94 /* Nonzero if our terminal settings are in effect.
95 Zero if the inferior's settings are in effect. */
97 static int terminal_is_ours
;
99 /* Macro for printing errors from ioctl operations */
101 #define OOPSY(what) \
103 fprintf(stderr, "[%s failed in terminal_inferior: %s]\n", \
104 what, strerror (errno))
106 static void terminal_ours_1 ();
108 /* Initialize the terminal settings we record for the inferior,
109 before we actually run the inferior. */
112 terminal_init_inferior ()
114 sg_inferior
= sg_ours
;
115 tflags_inferior
= tflags_ours
;
117 #if defined(TIOCGETC) && !defined(TIOCGETC_BROKEN)
118 tc_inferior
= tc_ours
;
121 #if defined(TIOCGLTC) && !defined(TIOCGLTC_BROKEN)
122 ltc_inferior
= ltc_ours
;
126 lmode_inferior
= lmode_ours
;
130 pgrp_inferior
= inferior_pid
;
131 #endif /* TIOCGPGRP */
133 terminal_is_ours
= 1;
136 /* Put the inferior's terminal settings into effect.
137 This is preparation for starting or resuming the inferior. */
144 if (gdb_has_a_terminal
&& terminal_is_ours
&& inferior_thisrun_terminal
== 0)
146 result
= fcntl (0, F_SETFL
, tflags_inferior
);
147 result
= fcntl (0, F_SETFL
, tflags_inferior
);
148 OOPSY ("fcntl F_SETFL");
149 result
= ioctl (0, TIOCSETN
, &sg_inferior
);
150 OOPSY ("ioctl TIOCSETN");
152 #if defined(TIOCGETC) && !defined(TIOCGETC_BROKEN)
153 result
= ioctl (0, TIOCSETC
, &tc_inferior
);
154 OOPSY ("ioctl TIOCSETC");
156 #if defined(TIOCGLTC) && !defined(TIOCGLTC_BROKEN)
157 result
= ioctl (0, TIOCSLTC
, <c_inferior
);
158 OOPSY ("ioctl TIOCSLTC");
161 result
= ioctl (0, TIOCLSET
, &lmode_inferior
);
162 OOPSY ("ioctl TIOCLSET");
166 result
= ioctl (0, TIOCSPGRP
, &pgrp_inferior
);
167 /* If we attached to the process, we might or might not be sharing
168 a terminal. Avoid printing error msg if we are unable to set our
169 terminal's process group to his process group ID. */
171 OOPSY ("ioctl TIOCSPGRP");
174 sigint_ours
= (void (*) ()) signal (SIGINT
, SIG_IGN
);
175 sigquit_ours
= (void (*) ()) signal (SIGQUIT
, SIG_IGN
);
176 #endif /* TIOCGPGRP */
178 terminal_is_ours
= 0;
181 /* Put some of our terminal settings into effect,
182 enough to get proper results from our output,
183 but do not change into or out of RAW mode
184 so that no input is discarded.
186 After doing this, either terminal_ours or terminal_inferior
187 should be called to get back to a normal state of affairs. */
190 terminal_ours_for_output ()
195 /* Put our terminal settings into effect.
196 First record the inferior's terminal settings
197 so they can be restored properly later. */
206 terminal_ours_1 (output_only
)
211 /* Ignore this signal since it will happen when we try to set the pgrp. */
213 #endif /* TIOCGPGRP */
215 /* Checking inferior_thisrun_terminal is necessary so that
216 if GDB is running in the background, it won't block trying
217 to do the ioctl()'s below. Checking gdb_has_a_terminal
218 avoids attempting all the ioctl's when running in batch. */
219 if (inferior_thisrun_terminal
!= 0 || gdb_has_a_terminal
== 0)
222 if (!terminal_is_ours
)
224 terminal_is_ours
= 1;
227 osigttou
= (void (*) ()) signal (SIGTTOU
, SIG_IGN
);
229 result
= ioctl (0, TIOCGPGRP
, &pgrp_inferior
);
230 result
= ioctl (0, TIOCSPGRP
, &pgrp_ours
);
232 signal (SIGTTOU
, osigttou
);
234 signal (SIGINT
, sigint_ours
);
235 signal (SIGQUIT
, sigquit_ours
);
236 #endif /* TIOCGPGRP */
238 tflags_inferior
= fcntl (0, F_GETFL
, 0);
239 result
= ioctl (0, TIOCGETP
, &sg_inferior
);
241 #if defined(TIOCGETC) && !defined(TIOCGETC_BROKEN)
242 result
= ioctl (0, TIOCGETC
, &tc_inferior
);
244 #if defined(TIOCGLTC) && !defined(TIOCGLTC_BROKEN)
245 result
= ioctl (0, TIOCGLTC
, <c_inferior
);
248 result
= ioctl (0, TIOCLGET
, &lmode_inferior
);
253 sg_ours
.c_lflag
|= ICANON
;
254 if (output_only
&& !(sg_inferior
.c_lflag
& ICANON
))
255 sg_ours
.c_lflag
&= ~ICANON
;
256 #else /* not HAVE_TERMIO */
257 sg_ours
.sg_flags
&= ~RAW
& ~CBREAK
;
259 sg_ours
.sg_flags
|= (RAW
| CBREAK
) & sg_inferior
.sg_flags
;
260 #endif /* not HAVE_TERMIO */
262 result
= fcntl (0, F_SETFL
, tflags_ours
);
263 result
= fcntl (0, F_SETFL
, tflags_ours
);
264 result
= ioctl (0, TIOCSETN
, &sg_ours
);
266 #if defined(TIOCGETC) && !defined(TIOCGETC_BROKEN)
267 result
= ioctl (0, TIOCSETC
, &tc_ours
);
269 #if defined(TIOCGLTC) && !defined(TIOCGLTC_BROKEN)
270 result
= ioctl (0, TIOCSLTC
, <c_ours
);
273 result
= ioctl (0, TIOCLSET
, &lmode_ours
);
277 sg_ours
.c_lflag
|= ICANON
;
278 #else /* not HAVE_TERMIO */
279 sg_ours
.sg_flags
&= ~RAW
& ~CBREAK
;
280 #endif /* not HAVE_TERMIO */
285 term_info (arg
, from_tty
)
289 target_terminal_info (arg
, from_tty
);
294 child_terminal_info (args
, from_tty
)
300 if (!gdb_has_a_terminal
) {
301 printf_filtered ("This GDB does not control a terminal.\n");
306 printf_filtered ("Inferior's terminal status (currently saved by GDB):\n");
308 printf_filtered ("owner pgrp = %d, fcntl flags = 0x%x.\n",
309 pgrp_inferior
, tflags_inferior
);
310 #endif /* TIOCGPGRP */
314 printf_filtered ("c_iflag = 0x%x, c_oflag = 0x%x,\n",
315 sg_inferior
.c_iflag
, sg_inferior
.c_oflag
);
316 printf_filtered ("c_cflag = 0x%x, c_lflag = 0x%x, c_line = 0x%x.\n",
317 sg_inferior
.c_cflag
, sg_inferior
.c_lflag
, sg_inferior
.c_line
);
318 printf_filtered ("c_cc: ");
319 for (i
= 0; (i
< NCC
); i
+= 1)
320 printf_filtered ("0x%x ", sg_inferior
.c_cc
[i
]);
321 printf_filtered ("\n");
323 #else /* not HAVE_TERMIO */
325 printf_filtered ("sgttyb.sg_flags = 0x%x.\n", sg_inferior
.sg_flags
);
327 #endif /* not HAVE_TERMIO */
329 #if defined(TIOCGETC) && !defined(TIOCGETC_BROKEN)
330 printf_filtered ("tchars: ");
331 for (i
= 0; i
< (int)sizeof (struct tchars
); i
++)
332 printf_filtered ("0x%x ", ((unsigned char *)&tc_inferior
)[i
]);
333 printf_filtered ("\n");
336 #if defined(TIOCGLTC) && !defined(TIOCGLTC_BROKEN)
337 printf_filtered ("ltchars: ");
338 for (i
= 0; i
< (int)sizeof (struct ltchars
); i
++)
339 printf_filtered ("0x%x ", ((unsigned char *)<c_inferior
)[i
]);
340 printf_filtered ("\n");
344 printf_filtered ("lmode: 0x%x\n", lmode_inferior
);
348 /* NEW_TTY_PREFORK is called before forking a new child process,
349 so we can record the state of ttys in the child to be formed.
350 TTYNAME is null if we are to share the terminal with gdb;
351 or points to a string containing the name of the desired tty.
353 NEW_TTY is called in new child processes under Unix, which will
354 become debugger target processes. This actually switches to
355 the terminal specified in the NEW_TTY_PREFORK call. */
358 new_tty_prefork (ttyname
)
361 /* Save the name for later, for determining whether we and the child
362 are sharing a tty. */
363 inferior_thisrun_terminal
= ttyname
;
371 if (inferior_thisrun_terminal
== 0)
375 /* Disconnect the child process from our controlling terminal. */
376 tty
= open("/dev/tty", O_RDWR
);
379 ioctl(tty
, TIOCNOTTY
, 0);
384 /* Now open the specified new terminal. */
387 tty
= open(inferior_thisrun_terminal
, O_RDWR
| O_NOCTTY
);
389 tty
= open(inferior_thisrun_terminal
, O_RDWR
);
393 print_sys_errmsg (inferior_thisrun_terminal
, errno
);
397 /* Avoid use of dup2; doesn't exist on all systems. */
399 { close (0); dup (tty
); }
401 { close (1); dup (tty
); }
403 { close (2); dup (tty
); }
408 /* Kill the inferior process. Make us have no inferior. */
412 kill_command (arg
, from_tty
)
416 if (inferior_pid
== 0)
417 error ("The program is not being run.");
418 if (!query ("Kill the inferior process? "))
419 error ("Not confirmed.");
422 /* Killing off the inferior can leave us with a core file. If so,
423 print the state we are left in. */
424 if (target_has_stack
) {
425 printf_filtered ("In %s,\n", current_target
->to_longname
);
426 if (selected_frame
== NULL
)
427 fputs_filtered ("No selected stack frame.\n", stdout
);
429 print_stack_frame (selected_frame
, selected_frame_level
, 1);
433 /* The inferior process has died. Long live the inferior! */
436 generic_mourn_inferior ()
440 mark_breakpoints_out ();
441 registers_changed ();
443 #ifdef CLEAR_DEFERRED_STORES
444 /* Delete any pending stores to the inferior... */
445 CLEAR_DEFERRED_STORES
;
449 if (target_has_stack
) {
450 set_current_frame ( create_new_frame (read_register (FP_REGNUM
),
452 select_frame (get_current_frame (), 0);
454 set_current_frame (0);
455 select_frame ((FRAME
) 0, -1);
457 /* It is confusing to the user for ignore counts to stick around
458 from previous runs of the inferior. So clear them. */
459 breakpoint_clear_ignore_counts ();
463 child_mourn_inferior ()
465 unpush_target (&child_ops
);
466 generic_mourn_inferior ();
470 /* This function is just for testing, and on some systems (Sony NewsOS
471 3.2) <sys/user.h> also includes <sys/time.h> which leads to errors
472 (since on this system at least sys/time.h is not protected against
473 multiple inclusion). */
476 try_writing_regs_command (arg
, from_tty
)
483 if (inferior_pid
== 0)
484 error ("There is no inferior process now.");
486 /* A Sun 3/50 or 3/60 (at least) running SunOS 4.0.3 will have a
487 kernel panic if we try to write past the end of the user area.
488 Presumably Sun will fix this bug (it has been reported), but it
489 is tacky to crash the system, so at least on SunOS4 we need to
490 stop writing when we hit the end of the user area. */
491 for (i
= 0; i
< sizeof (struct user
); i
+= 2)
495 value
= call_ptrace (3, inferior_pid
, i
, 0);
496 call_ptrace (6, inferior_pid
, i
, value
);
499 printf (" Succeeded with address 0x%x; value 0x%x (%d).\n",
502 else if ((i
& 0377) == 0)
503 printf (" Failed at 0x%x.\n", i
);
509 _initialize_inflow ()
513 add_info ("terminal", term_info
,
514 "Print inferior's saved terminal status.");
517 add_com ("try-writing-regs", class_obscure
, try_writing_regs_command
,
518 "Try writing all locations in inferior's system block.\n\
519 Report which ones can be written.");
522 add_com ("kill", class_run
, kill_command
,
523 "Kill execution of program being debugged.");
527 /* Get all the current tty settings (including whether we have a tty at
530 tflags_ours
= fcntl (0, F_GETFL
, 0);
531 OOPSY ("fcntl F_GETFL"); /* Should always work */
533 result
= ioctl (0, TIOCGETP
, &sg_ours
);
535 gdb_has_a_terminal
= 1;
536 /* Get the rest of the tty settings, then... */
537 #if defined(TIOCGETC) && !defined(TIOCGETC_BROKEN)
538 ioctl (0, TIOCGETC
, &tc_ours
);
540 #if defined(TIOCGLTC) && !defined(TIOCGLTC_BROKEN)
541 ioctl (0, TIOCGLTC
, <c_ours
);
544 ioctl (0, TIOCLGET
, &lmode_ours
);
547 ioctl (0, TIOCGPGRP
, &pgrp_ours
);
548 #endif /* TIOCGPGRP */
550 gdb_has_a_terminal
= 0;
553 terminal_is_ours
= 1;