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. */
29 #include <sys/types.h>
32 /* Some USG-esque systems (some of which are BSD-esque enough so that USG
33 is not defined) want this header, and it won't do any harm. */
36 #include <sys/param.h>
40 kill_command PARAMS ((char *, int));
43 terminal_ours_1 PARAMS ((int));
45 extern struct target_ops child_ops;
47 /* Nonzero if we are debugging an attached outside process
48 rather than an inferior. */
53 /* Record terminal status separately for debugger and inferior. */
55 /* Does GDB have a terminal (on stdin)? */
56 int gdb_has_a_terminal;
57 #if !defined(__GO32__)
58 static TERMINAL sg_inferior;
59 static TERMINAL sg_ours;
61 static int tflags_inferior;
62 static int tflags_ours;
64 #if defined(TIOCGETC) && !defined(TIOCGETC_BROKEN)
65 static struct tchars tc_inferior;
66 static struct tchars tc_ours;
69 #if defined(TIOCGLTC) && !defined(TIOCGLTC_BROKEN)
70 static struct ltchars ltc_inferior;
71 static struct ltchars ltc_ours;
75 static int lmode_inferior;
76 static int lmode_ours;
81 static short pgrp_inferior;
82 static short pgrp_ours;
83 # else /* not def SHORT_PGRP */
84 static int pgrp_inferior;
86 # endif /* not def SHORT_PGRP */
87 #else /* not def TIOCGPGRP */
88 static void (*sigint_ours) ();
89 static void (*sigquit_ours) ();
90 #endif /* TIOCGPGRP */
92 /* The name of the tty (from the `tty' command) that we gave to the inferior
93 when it was last started. */
95 static char *inferior_thisrun_terminal;
97 /* Nonzero if our terminal settings are in effect.
98 Zero if the inferior's settings are in effect. */
100 static int terminal_is_ours;
102 /* Macro for printing errors from ioctl operations */
104 #define OOPSY(what) \
106 fprintf(stderr, "[%s failed in terminal_inferior: %s]\n", \
107 what, strerror (errno))
109 static void terminal_ours_1 ();
111 /* Initialize the terminal settings we record for the inferior,
112 before we actually run the inferior. */
115 terminal_init_inferior ()
117 #if !defined(__GO32__)
118 sg_inferior = sg_ours;
119 tflags_inferior = tflags_ours;
121 #if defined(TIOCGETC) && !defined(TIOCGETC_BROKEN)
122 tc_inferior = tc_ours;
125 #if defined(TIOCGLTC) && !defined(TIOCGLTC_BROKEN)
126 ltc_inferior = ltc_ours;
130 lmode_inferior = lmode_ours;
134 pgrp_inferior = inferior_pid;
135 #endif /* TIOCGPGRP */
137 terminal_is_ours = 1;
140 /* Put the inferior's terminal settings into effect.
141 This is preparation for starting or resuming the inferior. */
146 #if !defined(__GO32__)
149 if (gdb_has_a_terminal && terminal_is_ours && inferior_thisrun_terminal == 0)
151 result = fcntl (0, F_SETFL, tflags_inferior);
152 result = fcntl (0, F_SETFL, tflags_inferior);
153 OOPSY ("fcntl F_SETFL");
154 result = ioctl (0, TIOCSETN, &sg_inferior);
155 OOPSY ("ioctl TIOCSETN");
157 #if defined(TIOCGETC) && !defined(TIOCGETC_BROKEN)
158 result = ioctl (0, TIOCSETC, &tc_inferior);
159 OOPSY ("ioctl TIOCSETC");
161 #if defined(TIOCGLTC) && !defined(TIOCGLTC_BROKEN)
162 result = ioctl (0, TIOCSLTC, <c_inferior);
163 OOPSY ("ioctl TIOCSLTC");
166 result = ioctl (0, TIOCLSET, &lmode_inferior);
167 OOPSY ("ioctl TIOCLSET");
171 result = ioctl (0, TIOCSPGRP, &pgrp_inferior);
172 /* If we attached to the process, we might or might not be sharing
173 a terminal. Avoid printing error msg if we are unable to set our
174 terminal's process group to his process group ID. */
176 OOPSY ("ioctl TIOCSPGRP");
179 sigint_ours = (void (*) ()) signal (SIGINT, SIG_IGN);
180 sigquit_ours = (void (*) ()) signal (SIGQUIT, SIG_IGN);
181 #endif /* TIOCGPGRP */
184 terminal_is_ours = 0;
187 /* Put some of our terminal settings into effect,
188 enough to get proper results from our output,
189 but do not change into or out of RAW mode
190 so that no input is discarded.
192 After doing this, either terminal_ours or terminal_inferior
193 should be called to get back to a normal state of affairs. */
196 terminal_ours_for_output ()
201 /* Put our terminal settings into effect.
202 First record the inferior's terminal settings
203 so they can be restored properly later. */
212 terminal_ours_1 (output_only)
215 #if !defined(__GO32__)
218 /* Ignore this signal since it will happen when we try to set the pgrp. */
220 #endif /* TIOCGPGRP */
222 /* Checking inferior_thisrun_terminal is necessary so that
223 if GDB is running in the background, it won't block trying
224 to do the ioctl()'s below. Checking gdb_has_a_terminal
225 avoids attempting all the ioctl's when running in batch. */
226 if (inferior_thisrun_terminal != 0 || gdb_has_a_terminal == 0)
229 if (!terminal_is_ours)
231 terminal_is_ours = 1;
234 osigttou = (void (*) ()) signal (SIGTTOU, SIG_IGN);
236 result = ioctl (0, TIOCGPGRP, &pgrp_inferior);
237 result = ioctl (0, TIOCSPGRP, &pgrp_ours);
239 signal (SIGTTOU, osigttou);
241 signal (SIGINT, sigint_ours);
242 signal (SIGQUIT, sigquit_ours);
243 #endif /* TIOCGPGRP */
245 tflags_inferior = fcntl (0, F_GETFL, 0);
246 result = ioctl (0, TIOCGETP, &sg_inferior);
248 #if defined(TIOCGETC) && !defined(TIOCGETC_BROKEN)
249 result = ioctl (0, TIOCGETC, &tc_inferior);
251 #if defined(TIOCGLTC) && !defined(TIOCGLTC_BROKEN)
252 result = ioctl (0, TIOCGLTC, <c_inferior);
255 result = ioctl (0, TIOCLGET, &lmode_inferior);
260 sg_ours.c_lflag |= ICANON;
261 if (output_only && !(sg_inferior.c_lflag & ICANON))
262 sg_ours.c_lflag &= ~ICANON;
263 #else /* not HAVE_TERMIO */
264 sg_ours.sg_flags &= ~RAW & ~CBREAK;
266 sg_ours.sg_flags |= (RAW | CBREAK) & sg_inferior.sg_flags;
267 #endif /* not HAVE_TERMIO */
269 result = fcntl (0, F_SETFL, tflags_ours);
270 result = fcntl (0, F_SETFL, tflags_ours);
271 result = ioctl (0, TIOCSETN, &sg_ours);
273 #if defined(TIOCGETC) && !defined(TIOCGETC_BROKEN)
274 result = ioctl (0, TIOCSETC, &tc_ours);
276 #if defined(TIOCGLTC) && !defined(TIOCGLTC_BROKEN)
277 result = ioctl (0, TIOCSLTC, <c_ours);
280 result = ioctl (0, TIOCLSET, &lmode_ours);
284 sg_ours.c_lflag |= ICANON;
285 #else /* not HAVE_TERMIO */
286 sg_ours.sg_flags &= ~RAW & ~CBREAK;
287 #endif /* not HAVE_TERMIO */
289 result = result; /* lint */
295 term_info (arg, from_tty)
299 target_terminal_info (arg, from_tty);
304 child_terminal_info (args, from_tty)
310 if (!gdb_has_a_terminal) {
311 printf_filtered ("This GDB does not control a terminal.\n");
314 #if !defined(__GO32__)
316 printf_filtered ("Inferior's terminal status (currently saved by GDB):\n");
318 printf_filtered ("owner pgrp = %d, fcntl flags = 0x%x.\n",
319 pgrp_inferior, tflags_inferior);
320 #endif /* TIOCGPGRP */
324 printf_filtered ("c_iflag = 0x%x, c_oflag = 0x%x,\n",
325 sg_inferior.c_iflag, sg_inferior.c_oflag);
326 printf_filtered ("c_cflag = 0x%x, c_lflag = 0x%x, c_line = 0x%x.\n",
327 sg_inferior.c_cflag, sg_inferior.c_lflag, sg_inferior.c_line);
328 printf_filtered ("c_cc: ");
329 for (i = 0; (i < NCC); i += 1)
330 printf_filtered ("0x%x ", sg_inferior.c_cc[i]);
331 printf_filtered ("\n");
333 #else /* not HAVE_TERMIO */
335 printf_filtered ("sgttyb.sg_flags = 0x%x.\n", sg_inferior.sg_flags);
337 #endif /* not HAVE_TERMIO */
339 #if defined(TIOCGETC) && !defined(TIOCGETC_BROKEN)
340 printf_filtered ("tchars: ");
341 for (i = 0; i < (int)sizeof (struct tchars); i++)
342 printf_filtered ("0x%x ", ((unsigned char *)&tc_inferior)[i]);
343 printf_filtered ("\n");
346 #if defined(TIOCGLTC) && !defined(TIOCGLTC_BROKEN)
347 printf_filtered ("ltchars: ");
348 for (i = 0; i < (int)sizeof (struct ltchars); i++)
349 printf_filtered ("0x%x ", ((unsigned char *)<c_inferior)[i]);
350 printf_filtered ("\n");
354 printf_filtered ("lmode: 0x%x\n", lmode_inferior);
357 printf_filtered("This is a DOS machine; there is no terminal state\n");
362 /* NEW_TTY_PREFORK is called before forking a new child process,
363 so we can record the state of ttys in the child to be formed.
364 TTYNAME is null if we are to share the terminal with gdb;
365 or points to a string containing the name of the desired tty.
367 NEW_TTY is called in new child processes under Unix, which will
368 become debugger target processes. This actually switches to
369 the terminal specified in the NEW_TTY_PREFORK call. */
372 new_tty_prefork (ttyname)
375 /* Save the name for later, for determining whether we and the child
376 are sharing a tty. */
377 inferior_thisrun_terminal = ttyname;
386 if (inferior_thisrun_terminal == 0)
388 #if !defined(__GO32__)
390 /* Disconnect the child process from our controlling terminal. On some
391 systems (SVR4 for example), this may cause a SIGTTOU, so temporarily
393 tty = open("/dev/tty", O_RDWR);
396 osigttou = (void (*)()) signal(SIGTTOU, SIG_IGN);
397 ioctl(tty, TIOCNOTTY, 0);
399 (void) signal(SIGTTOU, osigttou);
403 /* Now open the specified new terminal. */
406 tty = open(inferior_thisrun_terminal, O_RDWR | O_NOCTTY);
408 tty = open(inferior_thisrun_terminal, O_RDWR);
412 print_sys_errmsg (inferior_thisrun_terminal, errno);
416 /* Avoid use of dup2; doesn't exist on all systems. */
418 { close (0); dup (tty); }
420 { close (1); dup (tty); }
422 { close (2); dup (tty); }
428 /* Kill the inferior process. Make us have no inferior. */
432 kill_command (arg, from_tty)
436 if (inferior_pid == 0)
437 error ("The program is not being run.");
438 if (!query ("Kill the inferior process? "))
439 error ("Not confirmed.");
442 /* Killing off the inferior can leave us with a core file. If so,
443 print the state we are left in. */
444 if (target_has_stack) {
445 printf_filtered ("In %s,\n", current_target->to_longname);
446 if (selected_frame == NULL)
447 fputs_filtered ("No selected stack frame.\n", stdout);
449 print_stack_frame (selected_frame, selected_frame_level, 1);
453 /* The inferior process has died. Long live the inferior! */
456 generic_mourn_inferior ()
460 mark_breakpoints_out ();
461 registers_changed ();
463 #ifdef CLEAR_DEFERRED_STORES
464 /* Delete any pending stores to the inferior... */
465 CLEAR_DEFERRED_STORES;
469 if (target_has_stack) {
470 set_current_frame ( create_new_frame (read_register (FP_REGNUM),
472 select_frame (get_current_frame (), 0);
474 set_current_frame (0);
475 select_frame ((FRAME) 0, -1);
477 /* It is confusing to the user for ignore counts to stick around
478 from previous runs of the inferior. So clear them. */
479 breakpoint_clear_ignore_counts ();
483 child_mourn_inferior ()
485 unpush_target (&child_ops);
486 generic_mourn_inferior ();
490 /* This function is just for testing, and on some systems (Sony NewsOS
491 3.2) <sys/user.h> also includes <sys/time.h> which leads to errors
492 (since on this system at least sys/time.h is not protected against
493 multiple inclusion). */
496 try_writing_regs_command (arg, from_tty)
503 if (inferior_pid == 0)
504 error ("There is no inferior process now.");
506 /* A Sun 3/50 or 3/60 (at least) running SunOS 4.0.3 will have a
507 kernel panic if we try to write past the end of the user area.
508 Presumably Sun will fix this bug (it has been reported), but it
509 is tacky to crash the system, so at least on SunOS4 we need to
510 stop writing when we hit the end of the user area. */
511 for (i = 0; i < sizeof (struct user); i += 2)
515 value = call_ptrace (3, inferior_pid, (PTRACE_ARG3_TYPE) i, 0);
516 call_ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) i, value);
519 printf (" Succeeded with address 0x%x; value 0x%x (%d).\n",
522 else if ((i & 0377) == 0)
523 printf (" Failed at 0x%x.\n", i);
529 _initialize_inflow ()
533 add_info ("terminal", term_info,
534 "Print inferior's saved terminal status.");
537 add_com ("try-writing-regs", class_obscure, try_writing_regs_command,
538 "Try writing all locations in inferior's system block.\n\
539 Report which ones can be written.");
542 add_com ("kill", class_run, kill_command,
543 "Kill execution of program being debugged.");
547 /* Get all the current tty settings (including whether we have a tty at
550 #if !defined(__GO32__)
551 tflags_ours = fcntl (0, F_GETFL, 0);
553 result = ioctl (0, TIOCGETP, &sg_ours);
555 gdb_has_a_terminal = 1;
556 /* Get the rest of the tty settings, then... */
557 #if defined(TIOCGETC) && !defined(TIOCGETC_BROKEN)
558 ioctl (0, TIOCGETC, &tc_ours);
560 #if defined(TIOCGLTC) && !defined(TIOCGLTC_BROKEN)
561 ioctl (0, TIOCGLTC, <c_ours);
564 ioctl (0, TIOCLGET, &lmode_ours);
567 ioctl (0, TIOCGPGRP, &pgrp_ours);
568 #endif /* TIOCGPGRP */
570 gdb_has_a_terminal = 0;
573 gdb_has_a_terminal = 0;
577 terminal_is_ours = 1;