1 /* Low level interface to ptrace, for GDB when running under Unix.
2 Copyright (C) 1986, 1987, 1989, 1991 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>
41 extern char *strerror(); /* strings corresponding to errno */
43 extern struct target_ops child_ops
;
45 /* Nonzero if we are debugging an attached outside process
46 rather than an inferior. */
51 /* Record terminal status separately for debugger and inferior. */
53 /* Does GDB have a terminal (on stdin)? */
54 int gdb_has_a_terminal
;
56 static TERMINAL sg_inferior
;
57 static TERMINAL sg_ours
;
59 static int tflags_inferior
;
60 static int tflags_ours
;
62 #if defined(TIOCGETC) && !defined(TIOCGETC_BROKEN)
63 static struct tchars tc_inferior
;
64 static struct tchars tc_ours
;
67 #if defined(TIOCGLTC) && !defined(TIOCGLTC_BROKEN)
68 static struct ltchars ltc_inferior
;
69 static struct ltchars ltc_ours
;
73 static int lmode_inferior
;
74 static int lmode_ours
;
79 static short pgrp_inferior
;
80 static short pgrp_ours
;
82 static int pgrp_inferior
;
86 static void (*sigint_ours
) ();
87 static void (*sigquit_ours
) ();
88 #endif /* TIOCGPGRP */
90 /* The name of the tty (from the `tty' command) that we gave to the inferior
91 when it was last started. */
93 static char *inferior_thisrun_terminal
;
95 /* Nonzero if our terminal settings are in effect.
96 Zero if the inferior's settings are in effect. */
98 static int terminal_is_ours
;
100 /* Macro for printing errors from ioctl operations */
102 #define OOPSY(what) \
104 fprintf(stderr, "[%s failed in terminal_inferior: %s]\n", \
105 what, strerror (errno))
107 static void terminal_ours_1 ();
109 /* Initialize the terminal settings we record for the inferior,
110 before we actually run the inferior. */
113 terminal_init_inferior ()
115 sg_inferior
= sg_ours
;
116 tflags_inferior
= tflags_ours
;
118 #if defined(TIOCGETC) && !defined(TIOCGETC_BROKEN)
119 tc_inferior
= tc_ours
;
122 #if defined(TIOCGLTC) && !defined(TIOCGLTC_BROKEN)
123 ltc_inferior
= ltc_ours
;
127 lmode_inferior
= lmode_ours
;
131 pgrp_inferior
= inferior_pid
;
132 #endif /* TIOCGPGRP */
134 terminal_is_ours
= 1;
137 /* Put the inferior's terminal settings into effect.
138 This is preparation for starting or resuming the inferior. */
145 if (gdb_has_a_terminal
&& terminal_is_ours
&& inferior_thisrun_terminal
== 0)
147 result
= fcntl (0, F_SETFL
, tflags_inferior
);
148 result
= fcntl (0, F_SETFL
, tflags_inferior
);
149 OOPSY ("fcntl F_SETFL");
150 result
= ioctl (0, TIOCSETN
, &sg_inferior
);
151 OOPSY ("ioctl TIOCSETN");
153 #if defined(TIOCGETC) && !defined(TIOCGETC_BROKEN)
154 result
= ioctl (0, TIOCSETC
, &tc_inferior
);
155 OOPSY ("ioctl TIOCSETC");
157 #if defined(TIOCGLTC) && !defined(TIOCGLTC_BROKEN)
158 result
= ioctl (0, TIOCSLTC
, <c_inferior
);
159 OOPSY ("ioctl TIOCSLTC");
162 result
= ioctl (0, TIOCLSET
, &lmode_inferior
);
163 OOPSY ("ioctl TIOCLSET");
167 result
= ioctl (0, TIOCSPGRP
, &pgrp_inferior
);
168 OOPSY ("ioctl TIOCSPGRP");
170 sigint_ours
= (void (*) ()) signal (SIGINT
, SIG_IGN
);
171 sigquit_ours
= (void (*) ()) signal (SIGQUIT
, SIG_IGN
);
172 #endif /* TIOCGPGRP */
174 terminal_is_ours
= 0;
177 /* Put some of our terminal settings into effect,
178 enough to get proper results from our output,
179 but do not change into or out of RAW mode
180 so that no input is discarded.
182 After doing this, either terminal_ours or terminal_inferior
183 should be called to get back to a normal state of affairs. */
186 terminal_ours_for_output ()
191 /* Put our terminal settings into effect.
192 First record the inferior's terminal settings
193 so they can be restored properly later. */
202 terminal_ours_1 (output_only
)
207 /* Ignore this signal since it will happen when we try to set the pgrp. */
209 #endif /* TIOCGPGRP */
211 /* Checking inferior_thisrun_terminal is necessary so that
212 if GDB is running in the background, it won't block trying
213 to do the ioctl()'s below. Checking gdb_has_a_terminal
214 avoids attempting all the ioctl's when running in batch. */
215 if (inferior_thisrun_terminal
!= 0 || gdb_has_a_terminal
== 0)
218 if (!terminal_is_ours
)
220 terminal_is_ours
= 1;
223 osigttou
= (void (*) ()) signal (SIGTTOU
, SIG_IGN
);
225 result
= ioctl (0, TIOCGPGRP
, &pgrp_inferior
);
226 result
= ioctl (0, TIOCSPGRP
, &pgrp_ours
);
228 signal (SIGTTOU
, osigttou
);
230 signal (SIGINT
, sigint_ours
);
231 signal (SIGQUIT
, sigquit_ours
);
232 #endif /* TIOCGPGRP */
234 tflags_inferior
= fcntl (0, F_GETFL
, 0);
235 result
= ioctl (0, TIOCGETP
, &sg_inferior
);
237 #if defined(TIOCGETC) && !defined(TIOCGETC_BROKEN)
238 result
= ioctl (0, TIOCGETC
, &tc_inferior
);
240 #if defined(TIOCGLTC) && !defined(TIOCGLTC_BROKEN)
241 result
= ioctl (0, TIOCGLTC
, <c_inferior
);
244 result
= ioctl (0, TIOCLGET
, &lmode_inferior
);
249 sg_ours
.c_lflag
|= ICANON
;
250 if (output_only
&& !(sg_inferior
.c_lflag
& ICANON
))
251 sg_ours
.c_lflag
&= ~ICANON
;
252 #else /* not HAVE_TERMIO */
253 sg_ours
.sg_flags
&= ~RAW
& ~CBREAK
;
255 sg_ours
.sg_flags
|= (RAW
| CBREAK
) & sg_inferior
.sg_flags
;
256 #endif /* not HAVE_TERMIO */
258 result
= fcntl (0, F_SETFL
, tflags_ours
);
259 result
= fcntl (0, F_SETFL
, tflags_ours
);
260 result
= ioctl (0, TIOCSETN
, &sg_ours
);
262 #if defined(TIOCGETC) && !defined(TIOCGETC_BROKEN)
263 result
= ioctl (0, TIOCSETC
, &tc_ours
);
265 #if defined(TIOCGLTC) && !defined(TIOCGLTC_BROKEN)
266 result
= ioctl (0, TIOCSLTC
, <c_ours
);
269 result
= ioctl (0, TIOCLSET
, &lmode_ours
);
273 sg_ours
.c_lflag
|= ICANON
;
274 #else /* not HAVE_TERMIO */
275 sg_ours
.sg_flags
&= ~RAW
& ~CBREAK
;
276 #endif /* not HAVE_TERMIO */
281 term_info (arg
, from_tty
)
285 target_terminal_info (arg
, from_tty
);
290 child_terminal_info (args
, from_tty
)
296 if (!gdb_has_a_terminal
) {
297 printf_filtered ("This GDB does not control a terminal.\n");
301 printf_filtered ("Inferior's terminal status (currently saved by GDB):\n");
303 printf_filtered ("owner pgrp = %d, fcntl flags = 0x%x.\n",
304 pgrp_inferior
, tflags_inferior
);
308 printf_filtered (c_iflag
= 0x
%x
, c_oflag
= 0x
%x
,\n",
309 sg_inferior.c_iflag, sg_inferior.c_oflag);
310 printf_filtered ("c_cflag
= 0x
%x
, c_lflag
= 0x
%x
, c_line
= 0x
%x
.\n",
311 sg_inferior.c_cflag, sg_inferior.c_lflag, sg_inferior.c_line);
312 printf_filtered ("c_cc
: ");
313 for (i = 0; (i < NCC); i += 1)
314 printf_filtered ("0x
%x
", sg_inferior.c_cc[i]);
315 printf_filtered ("\n");
317 #else /* not HAVE_TERMIO */
319 printf_filtered ("sgttyb
.sg_flags
= 0x
%x
.\n", sg_inferior.sg_flags);
321 #endif /* not HAVE_TERMIO */
323 #if defined(TIOCGETC) && !defined(TIOCGETC_BROKEN)
324 printf_filtered ("tchars
: ");
325 for (i = 0; i < (int)sizeof (struct tchars); i++)
326 printf_filtered ("0x
%x
", ((unsigned char *)&tc_inferior)[i]);
327 printf_filtered ("\n");
330 #if defined(TIOCGLTC) && !defined(TIOCGLTC_BROKEN)
331 printf_filtered ("ltchars
: ");
332 for (i = 0; i < (int)sizeof (struct ltchars); i++)
333 printf_filtered ("0x
%x
", ((unsigned char *)<c_inferior)[i]);
334 printf_filtered ("\n");
338 printf_filtered ("lmode
: 0x
%x
\n", lmode_inferior);
342 /* NEW_TTY_PREFORK is called before forking a new child process,
343 so we can record the state of ttys in the child to be formed.
344 TTYNAME is null if we are to share the terminal with gdb;
345 or points to a string containing the name of the desired tty.
347 NEW_TTY is called in new child processes under Unix, which will
348 become debugger target processes. This actually switches to
349 the terminal specified in the NEW_TTY_PREFORK call. */
352 new_tty_prefork (ttyname)
355 /* Save the name for later, for determining whether we and the child
356 are sharing a tty. */
357 inferior_thisrun_terminal = ttyname;
365 if (inferior_thisrun_terminal == 0)
369 /* Disconnect the child process from our controlling terminal. */
370 tty = open("/dev
/tty
", O_RDWR);
373 ioctl(tty, TIOCNOTTY, 0);
378 /* Now open the specified new terminal. */
381 tty = open(inferior_thisrun_terminal, O_RDWR | O_NOCTTY);
383 tty = open(inferior_thisrun_terminal, O_RDWR);
387 print_sys_errmsg (inferior_thisrun_terminal, errno);
391 /* Avoid use of dup2; doesn't exist on all systems. */
393 { close (0); dup (tty); }
395 { close (1); dup (tty); }
397 { close (2); dup (tty); }
402 /* Kill the inferior process. Make us have no inferior. */
406 kill_command (arg, from_tty)
410 if (inferior_pid == 0)
411 error ("The program is
not being run
.");
412 if (!query ("Kill the inferior process
? "))
413 error ("Not confirmed
.");
414 target_kill (arg, from_tty);
416 /* Killing off the inferior can leave us with a core file. If so,
417 print the state we are left in. */
418 if (target_has_stack) {
419 printf_filtered ("In
%s
,\n", current_target->to_longname);
420 if (selected_frame == NULL)
421 fputs_filtered ("No selected stack frame
.\n", stdout);
423 print_stack_frame (selected_frame, selected_frame_level, 1);
427 /* The inferior process has died. Long live the inferior! */
430 generic_mourn_inferior ()
434 mark_breakpoints_out ();
435 registers_changed ();
437 #ifdef CLEAR_DEFERRED_STORES
438 /* Delete any pending stores to the inferior... */
439 CLEAR_DEFERRED_STORES;
443 if (target_has_stack) {
444 set_current_frame ( create_new_frame (read_register (FP_REGNUM),
446 select_frame (get_current_frame (), 0);
448 set_current_frame (0);
449 select_frame ((FRAME) 0, -1);
451 /* It is confusing to the user for ignore counts to stick around
452 from previous runs of the inferior. So clear them. */
453 breakpoint_clear_ignore_counts ();
457 child_mourn_inferior ()
459 unpush_target (&child_ops);
460 generic_mourn_inferior ();
464 /* This function is just for testing, and on some systems (Sony NewsOS
465 3.2) <sys/user.h> also includes <sys/time.h> which leads to errors
466 (since on this system at least sys/time.h is not protected against
467 multiple inclusion). */
470 try_writing_regs_command (arg, from_tty)
477 if (inferior_pid == 0)
478 error ("There is no inferior process now
.");
480 /* A Sun 3/50 or 3/60 (at least) running SunOS 4.0.3 will have a
481 kernel panic if we try to write past the end of the user area.
482 Presumably Sun will fix this bug (it has been reported), but it
483 is tacky to crash the system, so at least on SunOS4 we need to
484 stop writing when we hit the end of the user area. */
485 for (i = 0; i < sizeof (struct user); i += 2)
489 value = call_ptrace (3, inferior_pid, i, 0);
490 call_ptrace (6, inferior_pid, i, value);
493 printf (" Succeeded with address
0x
%x
; value
0x
%x (%d
).\n",
496 else if ((i & 0377) == 0)
497 printf (" Failed at
0x
%x
.\n", i);
503 _initialize_inflow ()
507 add_info ("terminal
", term_info,
508 "Print inferior
's saved terminal status.");
511 add_com ("try-writing-regs", class_obscure, try_writing_regs_command,
512 "Try writing all locations in inferior's system block
.\n\
513 Report which ones can be written
.");
516 add_com ("kill
", class_run, kill_command,
517 "Kill execution of program being debugged
.");
521 /* Get all the current tty settings (including whether we have a tty at
524 tflags_ours = fcntl (0, F_GETFL, 0);
525 OOPSY ("fcntl F_GETFL
"); /* Should always work */
527 result = ioctl (0, TIOCGETP, &sg_ours);
529 gdb_has_a_terminal = 1;
530 /* Get the rest of the tty settings, then... */
531 #if defined(TIOCGETC) && !defined(TIOCGETC_BROKEN)
532 ioctl (0, TIOCGETC, &tc_ours);
534 #if defined(TIOCGLTC) && !defined(TIOCGLTC_BROKEN)
535 ioctl (0, TIOCGLTC, <c_ours);
538 ioctl (0, TIOCLGET, &lmode_ours);
541 ioctl (0, TIOCGPGRP, &pgrp_ours);
542 #endif /* TIOCGPGRP */
544 gdb_has_a_terminal = 0;
547 terminal_is_ours = 1;