2001-04-03 David Mosberger <davidm@hpl.hp.com>
[deliverable/binutils-gdb.git] / gdb / symm-nat.c
1 /* Sequent Symmetry host interface, for GDB when running under Unix.
2 Copyright 1986, 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1999, 2000,
3 2001
4 Free Software Foundation, Inc.
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
22
23 /* FIXME, some 387-specific items of use taken from i387-tdep.c -- ought to be
24 merged back in. */
25
26 #include "defs.h"
27 #include "frame.h"
28 #include "inferior.h"
29 #include "symtab.h"
30 #include "target.h"
31 #include "regcache.h"
32
33 /* FIXME: What is the _INKERNEL define for? */
34 #define _INKERNEL
35 #include <signal.h>
36 #undef _INKERNEL
37 #include <sys/wait.h>
38 #include <sys/param.h>
39 #include <sys/user.h>
40 #include <sys/proc.h>
41 #include <sys/dir.h>
42 #include <sys/ioctl.h>
43 #include "gdb_stat.h"
44 #ifdef _SEQUENT_
45 #include <sys/ptrace.h>
46 #else
47 /* Dynix has only machine/ptrace.h, which is already included by sys/user.h */
48 /* Dynix has no mptrace call */
49 #define mptrace ptrace
50 #endif
51 #include "gdbcore.h"
52 #include <fcntl.h>
53 #include <sgtty.h>
54 #define TERMINAL struct sgttyb
55
56 #include "gdbcore.h"
57
58 void
59 store_inferior_registers (int regno)
60 {
61 struct pt_regset regs;
62 int i;
63
64 /* FIXME: Fetching the registers is a kludge to initialize all elements
65 in the fpu and fpa status. This works for normal debugging, but
66 might cause problems when calling functions in the inferior.
67 At least fpu_control and fpa_pcr (probably more) should be added
68 to the registers array to solve this properly. */
69 mptrace (XPT_RREGS, inferior_pid, (PTRACE_ARG3_TYPE) & regs, 0);
70
71 regs.pr_eax = *(int *) &registers[REGISTER_BYTE (0)];
72 regs.pr_ebx = *(int *) &registers[REGISTER_BYTE (5)];
73 regs.pr_ecx = *(int *) &registers[REGISTER_BYTE (2)];
74 regs.pr_edx = *(int *) &registers[REGISTER_BYTE (1)];
75 regs.pr_esi = *(int *) &registers[REGISTER_BYTE (6)];
76 regs.pr_edi = *(int *) &registers[REGISTER_BYTE (7)];
77 regs.pr_esp = *(int *) &registers[REGISTER_BYTE (14)];
78 regs.pr_ebp = *(int *) &registers[REGISTER_BYTE (15)];
79 regs.pr_eip = *(int *) &registers[REGISTER_BYTE (16)];
80 regs.pr_flags = *(int *) &registers[REGISTER_BYTE (17)];
81 for (i = 0; i < 31; i++)
82 {
83 regs.pr_fpa.fpa_regs[i] =
84 *(int *) &registers[REGISTER_BYTE (FP1_REGNUM + i)];
85 }
86 memcpy (regs.pr_fpu.fpu_stack[0], &registers[REGISTER_BYTE (ST0_REGNUM)], 10);
87 memcpy (regs.pr_fpu.fpu_stack[1], &registers[REGISTER_BYTE (ST1_REGNUM)], 10);
88 memcpy (regs.pr_fpu.fpu_stack[2], &registers[REGISTER_BYTE (ST2_REGNUM)], 10);
89 memcpy (regs.pr_fpu.fpu_stack[3], &registers[REGISTER_BYTE (ST3_REGNUM)], 10);
90 memcpy (regs.pr_fpu.fpu_stack[4], &registers[REGISTER_BYTE (ST4_REGNUM)], 10);
91 memcpy (regs.pr_fpu.fpu_stack[5], &registers[REGISTER_BYTE (ST5_REGNUM)], 10);
92 memcpy (regs.pr_fpu.fpu_stack[6], &registers[REGISTER_BYTE (ST6_REGNUM)], 10);
93 memcpy (regs.pr_fpu.fpu_stack[7], &registers[REGISTER_BYTE (ST7_REGNUM)], 10);
94 mptrace (XPT_WREGS, inferior_pid, (PTRACE_ARG3_TYPE) & regs, 0);
95 }
96
97 void
98 fetch_inferior_registers (int regno)
99 {
100 int i;
101 struct pt_regset regs;
102
103 registers_fetched ();
104
105 mptrace (XPT_RREGS, inferior_pid, (PTRACE_ARG3_TYPE) & regs, 0);
106 *(int *) &registers[REGISTER_BYTE (EAX_REGNUM)] = regs.pr_eax;
107 *(int *) &registers[REGISTER_BYTE (EBX_REGNUM)] = regs.pr_ebx;
108 *(int *) &registers[REGISTER_BYTE (ECX_REGNUM)] = regs.pr_ecx;
109 *(int *) &registers[REGISTER_BYTE (EDX_REGNUM)] = regs.pr_edx;
110 *(int *) &registers[REGISTER_BYTE (ESI_REGNUM)] = regs.pr_esi;
111 *(int *) &registers[REGISTER_BYTE (EDI_REGNUM)] = regs.pr_edi;
112 *(int *) &registers[REGISTER_BYTE (EBP_REGNUM)] = regs.pr_ebp;
113 *(int *) &registers[REGISTER_BYTE (ESP_REGNUM)] = regs.pr_esp;
114 *(int *) &registers[REGISTER_BYTE (EIP_REGNUM)] = regs.pr_eip;
115 *(int *) &registers[REGISTER_BYTE (EFLAGS_REGNUM)] = regs.pr_flags;
116 for (i = 0; i < FPA_NREGS; i++)
117 {
118 *(int *) &registers[REGISTER_BYTE (FP1_REGNUM + i)] =
119 regs.pr_fpa.fpa_regs[i];
120 }
121 memcpy (&registers[REGISTER_BYTE (ST0_REGNUM)], regs.pr_fpu.fpu_stack[0], 10);
122 memcpy (&registers[REGISTER_BYTE (ST1_REGNUM)], regs.pr_fpu.fpu_stack[1], 10);
123 memcpy (&registers[REGISTER_BYTE (ST2_REGNUM)], regs.pr_fpu.fpu_stack[2], 10);
124 memcpy (&registers[REGISTER_BYTE (ST3_REGNUM)], regs.pr_fpu.fpu_stack[3], 10);
125 memcpy (&registers[REGISTER_BYTE (ST4_REGNUM)], regs.pr_fpu.fpu_stack[4], 10);
126 memcpy (&registers[REGISTER_BYTE (ST5_REGNUM)], regs.pr_fpu.fpu_stack[5], 10);
127 memcpy (&registers[REGISTER_BYTE (ST6_REGNUM)], regs.pr_fpu.fpu_stack[6], 10);
128 memcpy (&registers[REGISTER_BYTE (ST7_REGNUM)], regs.pr_fpu.fpu_stack[7], 10);
129 }
130 \f
131 /* FIXME: This should be merged with i387-tdep.c as well. */
132 static
133 print_fpu_status (struct pt_regset ep)
134 {
135 int i;
136 int bothstatus;
137 int top;
138 int fpreg;
139 unsigned char *p;
140
141 printf_unfiltered ("80387:");
142 if (ep.pr_fpu.fpu_ip == 0)
143 {
144 printf_unfiltered (" not in use.\n");
145 return;
146 }
147 else
148 {
149 printf_unfiltered ("\n");
150 }
151 if (ep.pr_fpu.fpu_status != 0)
152 {
153 print_387_status_word (ep.pr_fpu.fpu_status);
154 }
155 print_387_control_word (ep.pr_fpu.fpu_control);
156 printf_unfiltered ("last exception: ");
157 printf_unfiltered ("opcode 0x%x; ", ep.pr_fpu.fpu_rsvd4);
158 printf_unfiltered ("pc 0x%x:0x%x; ", ep.pr_fpu.fpu_cs, ep.pr_fpu.fpu_ip);
159 printf_unfiltered ("operand 0x%x:0x%x\n", ep.pr_fpu.fpu_data_offset, ep.pr_fpu.fpu_op_sel);
160
161 top = (ep.pr_fpu.fpu_status >> 11) & 7;
162
163 printf_unfiltered ("regno tag msb lsb value\n");
164 for (fpreg = 7; fpreg >= 0; fpreg--)
165 {
166 double val;
167
168 printf_unfiltered ("%s %d: ", fpreg == top ? "=>" : " ", fpreg);
169
170 switch ((ep.pr_fpu.fpu_tag >> (fpreg * 2)) & 3)
171 {
172 case 0:
173 printf_unfiltered ("valid ");
174 break;
175 case 1:
176 printf_unfiltered ("zero ");
177 break;
178 case 2:
179 printf_unfiltered ("trap ");
180 break;
181 case 3:
182 printf_unfiltered ("empty ");
183 break;
184 }
185 for (i = 9; i >= 0; i--)
186 printf_unfiltered ("%02x", ep.pr_fpu.fpu_stack[fpreg][i]);
187
188 i387_to_double ((char *) ep.pr_fpu.fpu_stack[fpreg], (char *) &val);
189 printf_unfiltered (" %g\n", val);
190 }
191 if (ep.pr_fpu.fpu_rsvd1)
192 warning ("rsvd1 is 0x%x\n", ep.pr_fpu.fpu_rsvd1);
193 if (ep.pr_fpu.fpu_rsvd2)
194 warning ("rsvd2 is 0x%x\n", ep.pr_fpu.fpu_rsvd2);
195 if (ep.pr_fpu.fpu_rsvd3)
196 warning ("rsvd3 is 0x%x\n", ep.pr_fpu.fpu_rsvd3);
197 if (ep.pr_fpu.fpu_rsvd5)
198 warning ("rsvd5 is 0x%x\n", ep.pr_fpu.fpu_rsvd5);
199 }
200
201
202 print_1167_control_word (unsigned int pcr)
203 {
204 int pcr_tmp;
205
206 pcr_tmp = pcr & FPA_PCR_MODE;
207 printf_unfiltered ("\tMODE= %#x; RND= %#x ", pcr_tmp, pcr_tmp & 12);
208 switch (pcr_tmp & 12)
209 {
210 case 0:
211 printf_unfiltered ("RN (Nearest Value)");
212 break;
213 case 1:
214 printf_unfiltered ("RZ (Zero)");
215 break;
216 case 2:
217 printf_unfiltered ("RP (Positive Infinity)");
218 break;
219 case 3:
220 printf_unfiltered ("RM (Negative Infinity)");
221 break;
222 }
223 printf_unfiltered ("; IRND= %d ", pcr_tmp & 2);
224 if (0 == pcr_tmp & 2)
225 {
226 printf_unfiltered ("(same as RND)\n");
227 }
228 else
229 {
230 printf_unfiltered ("(toward zero)\n");
231 }
232 pcr_tmp = pcr & FPA_PCR_EM;
233 printf_unfiltered ("\tEM= %#x", pcr_tmp);
234 if (pcr_tmp & FPA_PCR_EM_DM)
235 printf_unfiltered (" DM");
236 if (pcr_tmp & FPA_PCR_EM_UOM)
237 printf_unfiltered (" UOM");
238 if (pcr_tmp & FPA_PCR_EM_PM)
239 printf_unfiltered (" PM");
240 if (pcr_tmp & FPA_PCR_EM_UM)
241 printf_unfiltered (" UM");
242 if (pcr_tmp & FPA_PCR_EM_OM)
243 printf_unfiltered (" OM");
244 if (pcr_tmp & FPA_PCR_EM_ZM)
245 printf_unfiltered (" ZM");
246 if (pcr_tmp & FPA_PCR_EM_IM)
247 printf_unfiltered (" IM");
248 printf_unfiltered ("\n");
249 pcr_tmp = FPA_PCR_CC;
250 printf_unfiltered ("\tCC= %#x", pcr_tmp);
251 if (pcr_tmp & FPA_PCR_20MHZ)
252 printf_unfiltered (" 20MHZ");
253 if (pcr_tmp & FPA_PCR_CC_Z)
254 printf_unfiltered (" Z");
255 if (pcr_tmp & FPA_PCR_CC_C2)
256 printf_unfiltered (" C2");
257
258 /* Dynix defines FPA_PCR_CC_C0 to 0x100 and ptx defines
259 FPA_PCR_CC_C1 to 0x100. Use whichever is defined and assume
260 the OS knows what it is doing. */
261 #ifdef FPA_PCR_CC_C1
262 if (pcr_tmp & FPA_PCR_CC_C1)
263 printf_unfiltered (" C1");
264 #else
265 if (pcr_tmp & FPA_PCR_CC_C0)
266 printf_unfiltered (" C0");
267 #endif
268
269 switch (pcr_tmp)
270 {
271 case FPA_PCR_CC_Z:
272 printf_unfiltered (" (Equal)");
273 break;
274 #ifdef FPA_PCR_CC_C1
275 case FPA_PCR_CC_C1:
276 #else
277 case FPA_PCR_CC_C0:
278 #endif
279 printf_unfiltered (" (Less than)");
280 break;
281 case 0:
282 printf_unfiltered (" (Greater than)");
283 break;
284 case FPA_PCR_CC_Z |
285 #ifdef FPA_PCR_CC_C1
286 FPA_PCR_CC_C1
287 #else
288 FPA_PCR_CC_C0
289 #endif
290 | FPA_PCR_CC_C2:
291 printf_unfiltered (" (Unordered)");
292 break;
293 default:
294 printf_unfiltered (" (Undefined)");
295 break;
296 }
297 printf_unfiltered ("\n");
298 pcr_tmp = pcr & FPA_PCR_AE;
299 printf_unfiltered ("\tAE= %#x", pcr_tmp);
300 if (pcr_tmp & FPA_PCR_AE_DE)
301 printf_unfiltered (" DE");
302 if (pcr_tmp & FPA_PCR_AE_UOE)
303 printf_unfiltered (" UOE");
304 if (pcr_tmp & FPA_PCR_AE_PE)
305 printf_unfiltered (" PE");
306 if (pcr_tmp & FPA_PCR_AE_UE)
307 printf_unfiltered (" UE");
308 if (pcr_tmp & FPA_PCR_AE_OE)
309 printf_unfiltered (" OE");
310 if (pcr_tmp & FPA_PCR_AE_ZE)
311 printf_unfiltered (" ZE");
312 if (pcr_tmp & FPA_PCR_AE_EE)
313 printf_unfiltered (" EE");
314 if (pcr_tmp & FPA_PCR_AE_IE)
315 printf_unfiltered (" IE");
316 printf_unfiltered ("\n");
317 }
318
319 print_1167_regs (long regs[FPA_NREGS])
320 {
321 int i;
322
323 union
324 {
325 double d;
326 long l[2];
327 }
328 xd;
329 union
330 {
331 float f;
332 long l;
333 }
334 xf;
335
336
337 for (i = 0; i < FPA_NREGS; i++)
338 {
339 xf.l = regs[i];
340 printf_unfiltered ("%%fp%d: raw= %#x, single= %f", i + 1, regs[i], xf.f);
341 if (!(i & 1))
342 {
343 printf_unfiltered ("\n");
344 }
345 else
346 {
347 xd.l[1] = regs[i];
348 xd.l[0] = regs[i + 1];
349 printf_unfiltered (", double= %f\n", xd.d);
350 }
351 }
352 }
353
354 print_fpa_status (struct pt_regset ep)
355 {
356
357 printf_unfiltered ("WTL 1167:");
358 if (ep.pr_fpa.fpa_pcr != 0)
359 {
360 printf_unfiltered ("\n");
361 print_1167_control_word (ep.pr_fpa.fpa_pcr);
362 print_1167_regs (ep.pr_fpa.fpa_regs);
363 }
364 else
365 {
366 printf_unfiltered (" not in use.\n");
367 }
368 }
369
370 #if 0 /* disabled because it doesn't go through the target vector. */
371 i386_float_info (void)
372 {
373 char ubuf[UPAGES * NBPG];
374 struct pt_regset regset;
375
376 if (have_inferior_p ())
377 {
378 PTRACE_READ_REGS (inferior_pid, (PTRACE_ARG3_TYPE) & regset);
379 }
380 else
381 {
382 int corechan = bfd_cache_lookup (core_bfd);
383 if (lseek (corechan, 0, 0) < 0)
384 {
385 perror ("seek on core file");
386 }
387 if (myread (corechan, ubuf, UPAGES * NBPG) < 0)
388 {
389 perror ("read on core file");
390 }
391 /* only interested in the floating point registers */
392 regset.pr_fpu = ((struct user *) ubuf)->u_fpusave;
393 regset.pr_fpa = ((struct user *) ubuf)->u_fpasave;
394 }
395 print_fpu_status (regset);
396 print_fpa_status (regset);
397 }
398 #endif
399
400 static volatile int got_sigchld;
401
402 /*ARGSUSED */
403 /* This will eventually be more interesting. */
404 void
405 sigchld_handler (int signo)
406 {
407 got_sigchld++;
408 }
409
410 /*
411 * Signals for which the default action does not cause the process
412 * to die. See <sys/signal.h> for where this came from (alas, we
413 * can't use those macros directly)
414 */
415 #ifndef sigmask
416 #define sigmask(s) (1 << ((s) - 1))
417 #endif
418 #define SIGNALS_DFL_SAFE sigmask(SIGSTOP) | sigmask(SIGTSTP) | \
419 sigmask(SIGTTIN) | sigmask(SIGTTOU) | sigmask(SIGCHLD) | \
420 sigmask(SIGCONT) | sigmask(SIGWINCH) | sigmask(SIGPWR) | \
421 sigmask(SIGURG) | sigmask(SIGPOLL)
422
423 #ifdef ATTACH_DETACH
424 /*
425 * Thanks to XPT_MPDEBUGGER, we have to mange child_wait().
426 */
427 int
428 child_wait (int pid, struct target_waitstatus *status)
429 {
430 int save_errno, rv, xvaloff, saoff, sa_hand;
431 struct pt_stop pt;
432 struct user u;
433 sigset_t set;
434 /* Host signal number for a signal which the inferior terminates with, or
435 0 if it hasn't terminated due to a signal. */
436 static int death_by_signal = 0;
437 #ifdef SVR4_SHARED_LIBS /* use this to distinguish ptx 2 vs ptx 4 */
438 prstatus_t pstatus;
439 #endif
440
441 do
442 {
443 set_sigint_trap (); /* Causes SIGINT to be passed on to the
444 attached process. */
445 save_errno = errno;
446
447 got_sigchld = 0;
448
449 sigemptyset (&set);
450
451 while (got_sigchld == 0)
452 {
453 sigsuspend (&set);
454 }
455
456 clear_sigint_trap ();
457
458 rv = mptrace (XPT_STOPSTAT, 0, (char *) &pt, 0);
459 if (-1 == rv)
460 {
461 printf ("XPT_STOPSTAT: errno %d\n", errno); /* DEBUG */
462 continue;
463 }
464
465 pid = pt.ps_pid;
466
467 if (pid != inferior_pid)
468 {
469 /* NOTE: the mystery fork in csh/tcsh needs to be ignored.
470 * We should not return new children for the initial run
471 * of a process until it has done the exec.
472 */
473 /* inferior probably forked; send it on its way */
474 rv = mptrace (XPT_UNDEBUG, pid, 0, 0);
475 if (-1 == rv)
476 {
477 printf ("child_wait: XPT_UNDEBUG: pid %d: %s\n", pid,
478 safe_strerror (errno));
479 }
480 continue;
481 }
482 /* FIXME: Do we deal with fork notification correctly? */
483 switch (pt.ps_reason)
484 {
485 case PTS_FORK:
486 /* multi proc: treat like PTS_EXEC */
487 /*
488 * Pretend this didn't happen, since gdb isn't set up
489 * to deal with stops on fork.
490 */
491 rv = ptrace (PT_CONTSIG, pid, 1, 0);
492 if (-1 == rv)
493 {
494 printf ("PTS_FORK: PT_CONTSIG: error %d\n", errno);
495 }
496 continue;
497 case PTS_EXEC:
498 /*
499 * Pretend this is a SIGTRAP.
500 */
501 status->kind = TARGET_WAITKIND_STOPPED;
502 status->value.sig = TARGET_SIGNAL_TRAP;
503 break;
504 case PTS_EXIT:
505 /*
506 * Note: we stop before the exit actually occurs. Extract
507 * the exit code from the uarea. If we're stopped in the
508 * exit() system call, the exit code will be in
509 * u.u_ap[0]. An exit due to an uncaught signal will have
510 * something else in here, see the comment in the default:
511 * case, below. Finally,let the process exit.
512 */
513 if (death_by_signal)
514 {
515 status->kind = TARGET_WAITKIND_SIGNALED;
516 status->value.sig = target_signal_from_host (death_by_signal);
517 death_by_signal = 0;
518 break;
519 }
520 xvaloff = (unsigned long) &u.u_ap[0] - (unsigned long) &u;
521 errno = 0;
522 rv = ptrace (PT_RUSER, pid, (char *) xvaloff, 0);
523 status->kind = TARGET_WAITKIND_EXITED;
524 status->value.integer = rv;
525 /*
526 * addr & data to mptrace() don't matter here, since
527 * the process is already dead.
528 */
529 rv = mptrace (XPT_UNDEBUG, pid, 0, 0);
530 if (-1 == rv)
531 {
532 printf ("child_wait: PTS_EXIT: XPT_UNDEBUG: pid %d error %d\n", pid,
533 errno);
534 }
535 break;
536 case PTS_WATCHPT_HIT:
537 internal_error (__FILE__, __LINE__,
538 "PTS_WATCHPT_HIT\n");
539 break;
540 default:
541 /* stopped by signal */
542 status->kind = TARGET_WAITKIND_STOPPED;
543 status->value.sig = target_signal_from_host (pt.ps_reason);
544 death_by_signal = 0;
545
546 if (0 == (SIGNALS_DFL_SAFE & sigmask (pt.ps_reason)))
547 {
548 break;
549 }
550 /* else default action of signal is to die */
551 #ifdef SVR4_SHARED_LIBS
552 rv = ptrace (PT_GET_PRSTATUS, pid, (char *) &pstatus, 0);
553 if (-1 == rv)
554 error ("child_wait: signal %d PT_GET_PRSTATUS: %s\n",
555 pt.ps_reason, safe_strerror (errno));
556 if (pstatus.pr_cursig != pt.ps_reason)
557 {
558 printf ("pstatus signal %d, pt signal %d\n",
559 pstatus.pr_cursig, pt.ps_reason);
560 }
561 sa_hand = (int) pstatus.pr_action.sa_handler;
562 #else
563 saoff = (unsigned long) &u.u_sa[0] - (unsigned long) &u;
564 saoff += sizeof (struct sigaction) * (pt.ps_reason - 1);
565 errno = 0;
566 sa_hand = ptrace (PT_RUSER, pid, (char *) saoff, 0);
567 if (errno)
568 error ("child_wait: signal %d: RUSER: %s\n",
569 pt.ps_reason, safe_strerror (errno));
570 #endif
571 if ((int) SIG_DFL == sa_hand)
572 {
573 /* we will be dying */
574 death_by_signal = pt.ps_reason;
575 }
576 break;
577 }
578
579 }
580 while (pid != inferior_pid); /* Some other child died or stopped */
581
582 return pid;
583 }
584 #else /* !ATTACH_DETACH */
585 /*
586 * Simple child_wait() based on inftarg.c child_wait() for use until
587 * the MPDEBUGGER child_wait() works properly. This will go away when
588 * that is fixed.
589 */
590 child_wait (int pid, struct target_waitstatus *ourstatus)
591 {
592 int save_errno;
593 int status;
594
595 do
596 {
597 pid = wait (&status);
598 save_errno = errno;
599
600 if (pid == -1)
601 {
602 if (save_errno == EINTR)
603 continue;
604 fprintf (stderr, "Child process unexpectedly missing: %s.\n",
605 safe_strerror (save_errno));
606 ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
607 ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
608 return -1;
609 }
610 }
611 while (pid != inferior_pid); /* Some other child died or stopped */
612 store_waitstatus (ourstatus, status);
613 return pid;
614 }
615 #endif /* ATTACH_DETACH */
616 \f
617
618
619 /* This function simply calls ptrace with the given arguments.
620 It exists so that all calls to ptrace are isolated in this
621 machine-dependent file. */
622 int
623 call_ptrace (int request, int pid, PTRACE_ARG3_TYPE addr, int data)
624 {
625 return ptrace (request, pid, addr, data);
626 }
627
628 int
629 call_mptrace (int request, int pid, PTRACE_ARG3_TYPE addr, int data)
630 {
631 return mptrace (request, pid, addr, data);
632 }
633
634 #if defined (DEBUG_PTRACE)
635 /* For the rest of the file, use an extra level of indirection */
636 /* This lets us breakpoint usefully on call_ptrace. */
637 #define ptrace call_ptrace
638 #define mptrace call_mptrace
639 #endif
640
641 void
642 kill_inferior (void)
643 {
644 if (inferior_pid == 0)
645 return;
646
647 /* For MPDEBUGGER, don't use PT_KILL, since the child will stop
648 again with a PTS_EXIT. Just hit him with SIGKILL (so he stops)
649 and detach. */
650
651 kill (inferior_pid, SIGKILL);
652 #ifdef ATTACH_DETACH
653 detach (SIGKILL);
654 #else /* ATTACH_DETACH */
655 ptrace (PT_KILL, inferior_pid, 0, 0);
656 wait ((int *) NULL);
657 #endif /* ATTACH_DETACH */
658 target_mourn_inferior ();
659 }
660
661 /* Resume execution of the inferior process.
662 If STEP is nonzero, single-step it.
663 If SIGNAL is nonzero, give it that signal. */
664
665 void
666 child_resume (int pid, int step, enum target_signal signal)
667 {
668 errno = 0;
669
670 if (pid == -1)
671 pid = inferior_pid;
672
673 /* An address of (PTRACE_ARG3_TYPE)1 tells ptrace to continue from where
674 it was. (If GDB wanted it to start some other way, we have already
675 written a new PC value to the child.)
676
677 If this system does not support PT_SSTEP, a higher level function will
678 have called single_step() to transmute the step request into a
679 continue request (by setting breakpoints on all possible successor
680 instructions), so we don't have to worry about that here. */
681
682 if (step)
683 ptrace (PT_SSTEP, pid, (PTRACE_ARG3_TYPE) 1, signal);
684 else
685 ptrace (PT_CONTSIG, pid, (PTRACE_ARG3_TYPE) 1, signal);
686
687 if (errno)
688 perror_with_name ("ptrace");
689 }
690 \f
691 #ifdef ATTACH_DETACH
692 /* Start debugging the process whose number is PID. */
693 int
694 attach (int pid)
695 {
696 sigset_t set;
697 int rv;
698
699 rv = mptrace (XPT_DEBUG, pid, 0, 0);
700 if (-1 == rv)
701 {
702 error ("mptrace(XPT_DEBUG): %s", safe_strerror (errno));
703 }
704 rv = mptrace (XPT_SIGNAL, pid, 0, SIGSTOP);
705 if (-1 == rv)
706 {
707 error ("mptrace(XPT_SIGNAL): %s", safe_strerror (errno));
708 }
709 attach_flag = 1;
710 return pid;
711 }
712
713 void
714 detach (int signo)
715 {
716 int rv;
717
718 rv = mptrace (XPT_UNDEBUG, inferior_pid, 1, signo);
719 if (-1 == rv)
720 {
721 error ("mptrace(XPT_UNDEBUG): %s", safe_strerror (errno));
722 }
723 attach_flag = 0;
724 }
725
726 #endif /* ATTACH_DETACH */
727 \f
728 /* Default the type of the ptrace transfer to int. */
729 #ifndef PTRACE_XFER_TYPE
730 #define PTRACE_XFER_TYPE int
731 #endif
732 \f
733
734 /* NOTE! I tried using PTRACE_READDATA, etc., to read and write memory
735 in the NEW_SUN_PTRACE case.
736 It ought to be straightforward. But it appears that writing did
737 not write the data that I specified. I cannot understand where
738 it got the data that it actually did write. */
739
740 /* Copy LEN bytes to or from inferior's memory starting at MEMADDR
741 to debugger memory starting at MYADDR. Copy to inferior if
742 WRITE is nonzero. TARGET is ignored.
743
744 Returns the length copied, which is either the LEN argument or zero.
745 This xfer function does not do partial moves, since child_ops
746 doesn't allow memory operations to cross below us in the target stack
747 anyway. */
748
749 int
750 child_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
751 struct mem_attrib *attrib,
752 struct target_ops *target)
753 {
754 register int i;
755 /* Round starting address down to longword boundary. */
756 register CORE_ADDR addr = memaddr & -sizeof (PTRACE_XFER_TYPE);
757 /* Round ending address up; get number of longwords that makes. */
758 register int count
759 = (((memaddr + len) - addr) + sizeof (PTRACE_XFER_TYPE) - 1)
760 / sizeof (PTRACE_XFER_TYPE);
761 /* Allocate buffer of that many longwords. */
762 register PTRACE_XFER_TYPE *buffer
763 = (PTRACE_XFER_TYPE *) alloca (count * sizeof (PTRACE_XFER_TYPE));
764
765 if (write)
766 {
767 /* Fill start and end extra bytes of buffer with existing memory data. */
768
769 if (addr != memaddr || len < (int) sizeof (PTRACE_XFER_TYPE))
770 {
771 /* Need part of initial word -- fetch it. */
772 buffer[0] = ptrace (PT_RTEXT, inferior_pid, (PTRACE_ARG3_TYPE) addr,
773 0);
774 }
775
776 if (count > 1) /* FIXME, avoid if even boundary */
777 {
778 buffer[count - 1]
779 = ptrace (PT_RTEXT, inferior_pid,
780 ((PTRACE_ARG3_TYPE)
781 (addr + (count - 1) * sizeof (PTRACE_XFER_TYPE))),
782 0);
783 }
784
785 /* Copy data to be written over corresponding part of buffer */
786
787 memcpy ((char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)),
788 myaddr,
789 len);
790
791 /* Write the entire buffer. */
792
793 for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE))
794 {
795 errno = 0;
796 ptrace (PT_WDATA, inferior_pid, (PTRACE_ARG3_TYPE) addr,
797 buffer[i]);
798 if (errno)
799 {
800 /* Using the appropriate one (I or D) is necessary for
801 Gould NP1, at least. */
802 errno = 0;
803 ptrace (PT_WTEXT, inferior_pid, (PTRACE_ARG3_TYPE) addr,
804 buffer[i]);
805 }
806 if (errno)
807 return 0;
808 }
809 }
810 else
811 {
812 /* Read all the longwords */
813 for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE))
814 {
815 errno = 0;
816 buffer[i] = ptrace (PT_RTEXT, inferior_pid,
817 (PTRACE_ARG3_TYPE) addr, 0);
818 if (errno)
819 return 0;
820 QUIT;
821 }
822
823 /* Copy appropriate bytes out of the buffer. */
824 memcpy (myaddr,
825 (char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)),
826 len);
827 }
828 return len;
829 }
830
831
832 void
833 _initialize_symm_nat (void)
834 {
835 #ifdef ATTACH_DETACH
836 /*
837 * the MPDEBUGGER is necessary for process tree debugging and attach
838 * to work, but it alters the behavior of debugged processes, so other
839 * things (at least child_wait()) will have to change to accomodate
840 * that.
841 *
842 * Note that attach is not implemented in dynix 3, and not in ptx
843 * until version 2.1 of the OS.
844 */
845 int rv;
846 sigset_t set;
847 struct sigaction sact;
848
849 rv = mptrace (XPT_MPDEBUGGER, 0, 0, 0);
850 if (-1 == rv)
851 {
852 internal_error (__FILE__, __LINE__,
853 "_initialize_symm_nat(): mptrace(XPT_MPDEBUGGER): %s",
854 safe_strerror (errno));
855 }
856
857 /*
858 * Under MPDEBUGGER, we get SIGCLHD when a traced process does
859 * anything of interest.
860 */
861
862 /*
863 * Block SIGCHLD. We leave it blocked all the time, and then
864 * call sigsuspend() in child_wait() to wait for the child
865 * to do something. None of these ought to fail, but check anyway.
866 */
867 sigemptyset (&set);
868 rv = sigaddset (&set, SIGCHLD);
869 if (-1 == rv)
870 {
871 internal_error (__FILE__, __LINE__,
872 "_initialize_symm_nat(): sigaddset(SIGCHLD): %s",
873 safe_strerror (errno));
874 }
875 rv = sigprocmask (SIG_BLOCK, &set, (sigset_t *) NULL);
876 if (-1 == rv)
877 {
878 internal_error (__FILE__, __LINE__,
879 "_initialize_symm_nat(): sigprocmask(SIG_BLOCK): %s",
880 safe_strerror (errno));
881 }
882
883 sact.sa_handler = sigchld_handler;
884 sigemptyset (&sact.sa_mask);
885 sact.sa_flags = SA_NOCLDWAIT; /* keep the zombies away */
886 rv = sigaction (SIGCHLD, &sact, (struct sigaction *) NULL);
887 if (-1 == rv)
888 {
889 internal_error (__FILE__, __LINE__,
890 "_initialize_symm_nat(): sigaction(SIGCHLD): %s",
891 safe_strerror (errno));
892 }
893 #endif
894 }
This page took 0.047904 seconds and 4 git commands to generate.