1 /* Sequent Symmetry host interface, for GDB when running under Unix.
2 Copyright 1986, 1987, 1989, 1991, 1992, 1994 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. */
20 /* FIXME, some 387-specific items of use taken from i387-tdep.c -- ought to be
29 /* FIXME: What is the _INKERNEL define for? */
34 #include <sys/param.h>
38 #include <sys/ioctl.h>
41 #include <sys/ptrace.h>
43 /* Dynix has only machine/ptrace.h, which is already included by sys/user.h */
44 /* Dynix has no mptrace call */
45 #define mptrace ptrace
50 #define TERMINAL struct sgttyb
55 store_inferior_registers(regno
)
58 struct pt_regset regs
;
60 extern char registers
[];
62 /* FIXME: Fetching the registers is a kludge to initialize all elements
63 in the fpu and fpa status. This works for normal debugging, but
64 might cause problems when calling functions in the inferior.
65 At least fpu_control and fpa_pcr (probably more) should be added
66 to the registers array to solve this properly. */
67 mptrace (XPT_RREGS
, inferior_pid
, (PTRACE_ARG3_TYPE
) ®s
, 0);
69 regs
.pr_eax
= *(int *)®isters
[REGISTER_BYTE(0)];
70 regs
.pr_ebx
= *(int *)®isters
[REGISTER_BYTE(5)];
71 regs
.pr_ecx
= *(int *)®isters
[REGISTER_BYTE(2)];
72 regs
.pr_edx
= *(int *)®isters
[REGISTER_BYTE(1)];
73 regs
.pr_esi
= *(int *)®isters
[REGISTER_BYTE(6)];
74 regs
.pr_edi
= *(int *)®isters
[REGISTER_BYTE(7)];
75 regs
.pr_esp
= *(int *)®isters
[REGISTER_BYTE(14)];
76 regs
.pr_ebp
= *(int *)®isters
[REGISTER_BYTE(15)];
77 regs
.pr_eip
= *(int *)®isters
[REGISTER_BYTE(16)];
78 regs
.pr_flags
= *(int *)®isters
[REGISTER_BYTE(17)];
79 for (i
= 0; i
< 31; i
++)
81 regs
.pr_fpa
.fpa_regs
[i
] =
82 *(int *)®isters
[REGISTER_BYTE(FP1_REGNUM
+i
)];
84 memcpy (regs
.pr_fpu
.fpu_stack
[0], ®isters
[REGISTER_BYTE(ST0_REGNUM
)], 10);
85 memcpy (regs
.pr_fpu
.fpu_stack
[1], ®isters
[REGISTER_BYTE(ST1_REGNUM
)], 10);
86 memcpy (regs
.pr_fpu
.fpu_stack
[2], ®isters
[REGISTER_BYTE(ST2_REGNUM
)], 10);
87 memcpy (regs
.pr_fpu
.fpu_stack
[3], ®isters
[REGISTER_BYTE(ST3_REGNUM
)], 10);
88 memcpy (regs
.pr_fpu
.fpu_stack
[4], ®isters
[REGISTER_BYTE(ST4_REGNUM
)], 10);
89 memcpy (regs
.pr_fpu
.fpu_stack
[5], ®isters
[REGISTER_BYTE(ST5_REGNUM
)], 10);
90 memcpy (regs
.pr_fpu
.fpu_stack
[6], ®isters
[REGISTER_BYTE(ST6_REGNUM
)], 10);
91 memcpy (regs
.pr_fpu
.fpu_stack
[7], ®isters
[REGISTER_BYTE(ST7_REGNUM
)], 10);
92 mptrace (XPT_WREGS
, inferior_pid
, (PTRACE_ARG3_TYPE
) ®s
, 0);
96 fetch_inferior_registers (regno
)
100 struct pt_regset regs
;
101 extern char registers
[];
103 registers_fetched ();
105 mptrace (XPT_RREGS
, inferior_pid
, (PTRACE_ARG3_TYPE
) ®s
, 0);
106 *(int *)®isters
[REGISTER_BYTE(EAX_REGNUM
)] = regs
.pr_eax
;
107 *(int *)®isters
[REGISTER_BYTE(EBX_REGNUM
)] = regs
.pr_ebx
;
108 *(int *)®isters
[REGISTER_BYTE(ECX_REGNUM
)] = regs
.pr_ecx
;
109 *(int *)®isters
[REGISTER_BYTE(EDX_REGNUM
)] = regs
.pr_edx
;
110 *(int *)®isters
[REGISTER_BYTE(ESI_REGNUM
)] = regs
.pr_esi
;
111 *(int *)®isters
[REGISTER_BYTE(EDI_REGNUM
)] = regs
.pr_edi
;
112 *(int *)®isters
[REGISTER_BYTE(EBP_REGNUM
)] = regs
.pr_ebp
;
113 *(int *)®isters
[REGISTER_BYTE(ESP_REGNUM
)] = regs
.pr_esp
;
114 *(int *)®isters
[REGISTER_BYTE(EIP_REGNUM
)] = regs
.pr_eip
;
115 *(int *)®isters
[REGISTER_BYTE(EFLAGS_REGNUM
)] = regs
.pr_flags
;
116 for (i
= 0; i
< FPA_NREGS
; i
++)
118 *(int *)®isters
[REGISTER_BYTE(FP1_REGNUM
+i
)] =
119 regs
.pr_fpa
.fpa_regs
[i
];
121 memcpy (®isters
[REGISTER_BYTE(ST0_REGNUM
)], regs
.pr_fpu
.fpu_stack
[0], 10);
122 memcpy (®isters
[REGISTER_BYTE(ST1_REGNUM
)], regs
.pr_fpu
.fpu_stack
[1], 10);
123 memcpy (®isters
[REGISTER_BYTE(ST2_REGNUM
)], regs
.pr_fpu
.fpu_stack
[2], 10);
124 memcpy (®isters
[REGISTER_BYTE(ST3_REGNUM
)], regs
.pr_fpu
.fpu_stack
[3], 10);
125 memcpy (®isters
[REGISTER_BYTE(ST4_REGNUM
)], regs
.pr_fpu
.fpu_stack
[4], 10);
126 memcpy (®isters
[REGISTER_BYTE(ST5_REGNUM
)], regs
.pr_fpu
.fpu_stack
[5], 10);
127 memcpy (®isters
[REGISTER_BYTE(ST6_REGNUM
)], regs
.pr_fpu
.fpu_stack
[6], 10);
128 memcpy (®isters
[REGISTER_BYTE(ST7_REGNUM
)], regs
.pr_fpu
.fpu_stack
[7], 10);
131 /* FIXME: This should be merged with i387-tdep.c as well. */
142 printf_unfiltered("80387:");
143 if (ep
.pr_fpu
.fpu_ip
== 0) {
144 printf_unfiltered(" not in use.\n");
147 printf_unfiltered("\n");
149 if (ep
.pr_fpu
.fpu_status
!= 0) {
150 print_387_status_word (ep
.pr_fpu
.fpu_status
);
152 print_387_control_word (ep
.pr_fpu
.fpu_control
);
153 printf_unfiltered ("last exception: ");
154 printf_unfiltered ("opcode 0x%x; ", ep
.pr_fpu
.fpu_rsvd4
);
155 printf_unfiltered ("pc 0x%x:0x%x; ", ep
.pr_fpu
.fpu_cs
, ep
.pr_fpu
.fpu_ip
);
156 printf_unfiltered ("operand 0x%x:0x%x\n", ep
.pr_fpu
.fpu_data_offset
, ep
.pr_fpu
.fpu_op_sel
);
158 top
= (ep
.pr_fpu
.fpu_status
>> 11) & 7;
160 printf_unfiltered ("regno tag msb lsb value\n");
161 for (fpreg
= 7; fpreg
>= 0; fpreg
--)
165 printf_unfiltered ("%s %d: ", fpreg
== top
? "=>" : " ", fpreg
);
167 switch ((ep
.pr_fpu
.fpu_tag
>> (fpreg
* 2)) & 3)
169 case 0: printf_unfiltered ("valid "); break;
170 case 1: printf_unfiltered ("zero "); break;
171 case 2: printf_unfiltered ("trap "); break;
172 case 3: printf_unfiltered ("empty "); break;
174 for (i
= 9; i
>= 0; i
--)
175 printf_unfiltered ("%02x", ep
.pr_fpu
.fpu_stack
[fpreg
][i
]);
177 i387_to_double ((char *)ep
.pr_fpu
.fpu_stack
[fpreg
], (char *)&val
);
178 printf_unfiltered (" %g\n", val
);
180 if (ep
.pr_fpu
.fpu_rsvd1
)
181 warning ("rsvd1 is 0x%x\n", ep
.pr_fpu
.fpu_rsvd1
);
182 if (ep
.pr_fpu
.fpu_rsvd2
)
183 warning ("rsvd2 is 0x%x\n", ep
.pr_fpu
.fpu_rsvd2
);
184 if (ep
.pr_fpu
.fpu_rsvd3
)
185 warning ("rsvd3 is 0x%x\n", ep
.pr_fpu
.fpu_rsvd3
);
186 if (ep
.pr_fpu
.fpu_rsvd5
)
187 warning ("rsvd5 is 0x%x\n", ep
.pr_fpu
.fpu_rsvd5
);
191 print_1167_control_word(pcr
)
197 pcr_tmp
= pcr
& FPA_PCR_MODE
;
198 printf_unfiltered("\tMODE= %#x; RND= %#x ", pcr_tmp
, pcr_tmp
& 12);
199 switch (pcr_tmp
& 12) {
201 printf_unfiltered("RN (Nearest Value)");
204 printf_unfiltered("RZ (Zero)");
207 printf_unfiltered("RP (Positive Infinity)");
210 printf_unfiltered("RM (Negative Infinity)");
213 printf_unfiltered("; IRND= %d ", pcr_tmp
& 2);
214 if (0 == pcr_tmp
& 2) {
215 printf_unfiltered("(same as RND)\n");
217 printf_unfiltered("(toward zero)\n");
219 pcr_tmp
= pcr
& FPA_PCR_EM
;
220 printf_unfiltered("\tEM= %#x", pcr_tmp
);
221 if (pcr_tmp
& FPA_PCR_EM_DM
) printf_unfiltered(" DM");
222 if (pcr_tmp
& FPA_PCR_EM_UOM
) printf_unfiltered(" UOM");
223 if (pcr_tmp
& FPA_PCR_EM_PM
) printf_unfiltered(" PM");
224 if (pcr_tmp
& FPA_PCR_EM_UM
) printf_unfiltered(" UM");
225 if (pcr_tmp
& FPA_PCR_EM_OM
) printf_unfiltered(" OM");
226 if (pcr_tmp
& FPA_PCR_EM_ZM
) printf_unfiltered(" ZM");
227 if (pcr_tmp
& FPA_PCR_EM_IM
) printf_unfiltered(" IM");
228 printf_unfiltered("\n");
229 pcr_tmp
= FPA_PCR_CC
;
230 printf_unfiltered("\tCC= %#x", pcr_tmp
);
231 if (pcr_tmp
& FPA_PCR_20MHZ
) printf_unfiltered(" 20MHZ");
232 if (pcr_tmp
& FPA_PCR_CC_Z
) printf_unfiltered(" Z");
233 if (pcr_tmp
& FPA_PCR_CC_C2
) printf_unfiltered(" C2");
235 /* Dynix defines FPA_PCR_CC_C0 to 0x100 and ptx defines
236 FPA_PCR_CC_C1 to 0x100. Use whichever is defined and assume
237 the OS knows what it is doing. */
239 if (pcr_tmp
& FPA_PCR_CC_C1
) printf_unfiltered(" C1");
241 if (pcr_tmp
& FPA_PCR_CC_C0
) printf_unfiltered(" C0");
247 printf_unfiltered(" (Equal)");
254 printf_unfiltered(" (Less than)");
257 printf_unfiltered(" (Greater than)");
266 printf_unfiltered(" (Unordered)");
269 printf_unfiltered(" (Undefined)");
272 printf_unfiltered("\n");
273 pcr_tmp
= pcr
& FPA_PCR_AE
;
274 printf_unfiltered("\tAE= %#x", pcr_tmp
);
275 if (pcr_tmp
& FPA_PCR_AE_DE
) printf_unfiltered(" DE");
276 if (pcr_tmp
& FPA_PCR_AE_UOE
) printf_unfiltered(" UOE");
277 if (pcr_tmp
& FPA_PCR_AE_PE
) printf_unfiltered(" PE");
278 if (pcr_tmp
& FPA_PCR_AE_UE
) printf_unfiltered(" UE");
279 if (pcr_tmp
& FPA_PCR_AE_OE
) printf_unfiltered(" OE");
280 if (pcr_tmp
& FPA_PCR_AE_ZE
) printf_unfiltered(" ZE");
281 if (pcr_tmp
& FPA_PCR_AE_EE
) printf_unfiltered(" EE");
282 if (pcr_tmp
& FPA_PCR_AE_IE
) printf_unfiltered(" IE");
283 printf_unfiltered("\n");
286 print_1167_regs(regs
)
287 long regs
[FPA_NREGS
];
302 for (i
= 0; i
< FPA_NREGS
; i
++) {
304 printf_unfiltered("%%fp%d: raw= %#x, single= %f", i
+1, regs
[i
], xf
.f
);
306 printf_unfiltered("\n");
310 printf_unfiltered(", double= %f\n", xd
.d
);
320 printf_unfiltered("WTL 1167:");
321 if (ep
.pr_fpa
.fpa_pcr
!=0) {
322 printf_unfiltered("\n");
323 print_1167_control_word(ep
.pr_fpa
.fpa_pcr
);
324 print_1167_regs(ep
.pr_fpa
.fpa_regs
);
326 printf_unfiltered(" not in use.\n");
330 #if 0 /* disabled because it doesn't go through the target vector. */
333 char ubuf
[UPAGES
*NBPG
];
334 struct pt_regset regset
;
336 if (have_inferior_p())
338 PTRACE_READ_REGS (inferior_pid
, (PTRACE_ARG3_TYPE
) ®set
);
342 int corechan
= bfd_cache_lookup (core_bfd
);
343 if (lseek (corechan
, 0, 0) < 0)
345 perror ("seek on core file");
347 if (myread (corechan
, ubuf
, UPAGES
*NBPG
) < 0)
349 perror ("read on core file");
351 /* only interested in the floating point registers */
352 regset
.pr_fpu
= ((struct user
*) ubuf
)->u_fpusave
;
353 regset
.pr_fpa
= ((struct user
*) ubuf
)->u_fpasave
;
355 print_fpu_status(regset
);
356 print_fpa_status(regset
);
360 static volatile int got_sigchld
;
363 /* This will eventually be more interesting. */
365 sigchld_handler(signo
)
372 * Signals for which the default action does not cause the process
373 * to die. See <sys/signal.h> for where this came from (alas, we
374 * can't use those macros directly)
377 #define sigmask(s) (1 << ((s) - 1))
379 #define SIGNALS_DFL_SAFE sigmask(SIGSTOP) | sigmask(SIGTSTP) | \
380 sigmask(SIGTTIN) | sigmask(SIGTTOU) | sigmask(SIGCHLD) | \
381 sigmask(SIGCONT) | sigmask(SIGWINCH) | sigmask(SIGPWR) | \
382 sigmask(SIGURG) | sigmask(SIGPOLL)
386 * Thanks to XPT_MPDEBUGGER, we have to mange child_wait().
389 child_wait(pid
, status
)
391 struct target_waitstatus
*status
;
393 int save_errno
, rv
, xvaloff
, saoff
, sa_hand
;
397 /* Host signal number for a signal which the inferior terminates with, or
398 0 if it hasn't terminated due to a signal. */
399 static int death_by_signal
= 0;
400 #ifdef SVR4_SHARED_LIBS /* use this to distinguish ptx 2 vs ptx 4 */
406 set_sigint_trap(); /* Causes SIGINT to be passed on to the
414 while (got_sigchld
== 0) {
421 rv
= mptrace(XPT_STOPSTAT
, 0, (char *)&pt
, 0);
423 printf("XPT_STOPSTAT: errno %d\n", errno
); /* DEBUG */
429 if (pid
!= inferior_pid
) {
430 /* NOTE: the mystery fork in csh/tcsh needs to be ignored.
431 * We should not return new children for the initial run
432 * of a process until it has done the exec.
434 /* inferior probably forked; send it on its way */
435 rv
= mptrace(XPT_UNDEBUG
, pid
, 0, 0);
437 printf("child_wait: XPT_UNDEBUG: pid %d: %s\n", pid
,
438 safe_strerror(errno
));
442 /* FIXME: Do we deal with fork notification correctly? */
443 switch (pt
.ps_reason
) {
445 /* multi proc: treat like PTS_EXEC */
447 * Pretend this didn't happen, since gdb isn't set up
448 * to deal with stops on fork.
450 rv
= ptrace(PT_CONTSIG
, pid
, 1, 0);
452 printf("PTS_FORK: PT_CONTSIG: error %d\n", errno
);
457 * Pretend this is a SIGTRAP.
459 status
->kind
= TARGET_WAITKIND_STOPPED
;
460 status
->value
.sig
= TARGET_SIGNAL_TRAP
;
464 * Note: we stop before the exit actually occurs. Extract
465 * the exit code from the uarea. If we're stopped in the
466 * exit() system call, the exit code will be in
467 * u.u_ap[0]. An exit due to an uncaught signal will have
468 * something else in here, see the comment in the default:
469 * case, below. Finally,let the process exit.
473 status
->kind
= TARGET_WAITKIND_SIGNALED
;
474 status
->value
.sig
= target_signal_from_host (death_by_signal
);
478 xvaloff
= (unsigned long)&u
.u_ap
[0] - (unsigned long)&u
;
480 rv
= ptrace(PT_RUSER
, pid
, (char *)xvaloff
, 0);
481 status
->kind
= TARGET_WAITKIND_EXITED
;
482 status
->value
.integer
= rv
;
484 * addr & data to mptrace() don't matter here, since
485 * the process is already dead.
487 rv
= mptrace(XPT_UNDEBUG
, pid
, 0, 0);
489 printf("child_wait: PTS_EXIT: XPT_UNDEBUG: pid %d error %d\n", pid
,
493 case PTS_WATCHPT_HIT
:
494 fatal("PTS_WATCHPT_HIT\n");
497 /* stopped by signal */
498 status
->kind
= TARGET_WAITKIND_STOPPED
;
499 status
->value
.sig
= target_signal_from_host (pt
.ps_reason
);
502 if (0 == (SIGNALS_DFL_SAFE
& sigmask(pt
.ps_reason
))) {
505 /* else default action of signal is to die */
506 #ifdef SVR4_SHARED_LIBS
507 rv
= ptrace(PT_GET_PRSTATUS
, pid
, (char *)&pstatus
, 0);
509 error("child_wait: signal %d PT_GET_PRSTATUS: %s\n",
510 pt
.ps_reason
, safe_strerror(errno
));
511 if (pstatus
.pr_cursig
!= pt
.ps_reason
) {
512 printf("pstatus signal %d, pt signal %d\n",
513 pstatus
.pr_cursig
, pt
.ps_reason
);
515 sa_hand
= (int)pstatus
.pr_action
.sa_handler
;
517 saoff
= (unsigned long)&u
.u_sa
[0] - (unsigned long)&u
;
518 saoff
+= sizeof(struct sigaction
) * (pt
.ps_reason
- 1);
520 sa_hand
= ptrace(PT_RUSER
, pid
, (char *)saoff
, 0);
522 error("child_wait: signal %d: RUSER: %s\n",
523 pt
.ps_reason
, safe_strerror(errno
));
525 if ((int)SIG_DFL
== sa_hand
) {
526 /* we will be dying */
527 death_by_signal
= pt
.ps_reason
;
532 } while (pid
!= inferior_pid
); /* Some other child died or stopped */
536 #else /* !ATTACH_DETACH */
538 * Simple child_wait() based on inftarg.c child_wait() for use until
539 * the MPDEBUGGER child_wait() works properly. This will go away when
542 child_wait (pid
, ourstatus
)
544 struct target_waitstatus
*ourstatus
;
550 pid
= wait (&status
);
555 if (save_errno
== EINTR
)
557 fprintf (stderr
, "Child process unexpectedly missing: %s.\n",
558 safe_strerror (save_errno
));
559 ourstatus
->kind
= TARGET_WAITKIND_SIGNALLED
;
560 ourstatus
->value
.sig
= TARGET_SIGNAL_UNKNOWN
;
563 } while (pid
!= inferior_pid
); /* Some other child died or stopped */
564 store_waitstatus (ourstatus
, status
);
567 #endif /* ATTACH_DETACH */
571 /* This function simply calls ptrace with the given arguments.
572 It exists so that all calls to ptrace are isolated in this
573 machine-dependent file. */
575 call_ptrace (request
, pid
, addr
, data
)
577 PTRACE_ARG3_TYPE addr
;
580 return ptrace (request
, pid
, addr
, data
);
584 call_mptrace(request
, pid
, addr
, data
)
586 PTRACE_ARG3_TYPE addr
;
589 return mptrace(request
, pid
, addr
, data
);
592 #if defined (DEBUG_PTRACE)
593 /* For the rest of the file, use an extra level of indirection */
594 /* This lets us breakpoint usefully on call_ptrace. */
595 #define ptrace call_ptrace
596 #define mptrace call_mptrace
602 if (inferior_pid
== 0)
605 /* For MPDEBUGGER, don't use PT_KILL, since the child will stop
606 again with a PTS_EXIT. Just hit him with SIGKILL (so he stops)
609 kill (inferior_pid
, SIGKILL
);
612 #else /* ATTACH_DETACH */
613 ptrace(PT_KILL
, inferior_pid
, 0, 0);
615 #endif /* ATTACH_DETACH */
616 target_mourn_inferior ();
619 /* Resume execution of the inferior process.
620 If STEP is nonzero, single-step it.
621 If SIGNAL is nonzero, give it that signal. */
624 child_resume (pid
, step
, signal
)
627 enum target_signal signal
;
634 /* An address of (PTRACE_ARG3_TYPE)1 tells ptrace to continue from where
635 it was. (If GDB wanted it to start some other way, we have already
636 written a new PC value to the child.)
638 If this system does not support PT_SSTEP, a higher level function will
639 have called single_step() to transmute the step request into a
640 continue request (by setting breakpoints on all possible successor
641 instructions), so we don't have to worry about that here. */
644 ptrace (PT_SSTEP
, pid
, (PTRACE_ARG3_TYPE
) 1, signal
);
646 ptrace (PT_CONTSIG
, pid
, (PTRACE_ARG3_TYPE
) 1, signal
);
649 perror_with_name ("ptrace");
653 /* Start debugging the process whose number is PID. */
661 rv
= mptrace(XPT_DEBUG
, pid
, 0, 0);
663 error("mptrace(XPT_DEBUG): %s", safe_strerror(errno
));
665 rv
= mptrace(XPT_SIGNAL
, pid
, 0, SIGSTOP
);
667 error("mptrace(XPT_SIGNAL): %s", safe_strerror(errno
));
679 rv
= mptrace(XPT_UNDEBUG
, inferior_pid
, 1, signo
);
681 error("mptrace(XPT_UNDEBUG): %s", safe_strerror(errno
));
686 #endif /* ATTACH_DETACH */
688 /* Default the type of the ptrace transfer to int. */
689 #ifndef PTRACE_XFER_TYPE
690 #define PTRACE_XFER_TYPE int
694 /* NOTE! I tried using PTRACE_READDATA, etc., to read and write memory
695 in the NEW_SUN_PTRACE case.
696 It ought to be straightforward. But it appears that writing did
697 not write the data that I specified. I cannot understand where
698 it got the data that it actually did write. */
700 /* Copy LEN bytes to or from inferior's memory starting at MEMADDR
701 to debugger memory starting at MYADDR. Copy to inferior if
704 Returns the length copied, which is either the LEN argument or zero.
705 This xfer function does not do partial moves, since child_ops
706 doesn't allow memory operations to cross below us in the target stack
710 child_xfer_memory (memaddr
, myaddr
, len
, write
, target
)
715 struct target_ops
*target
; /* ignored */
718 /* Round starting address down to longword boundary. */
719 register CORE_ADDR addr
= memaddr
& - sizeof (PTRACE_XFER_TYPE
);
720 /* Round ending address up; get number of longwords that makes. */
722 = (((memaddr
+ len
) - addr
) + sizeof (PTRACE_XFER_TYPE
) - 1)
723 / sizeof (PTRACE_XFER_TYPE
);
724 /* Allocate buffer of that many longwords. */
725 register PTRACE_XFER_TYPE
*buffer
726 = (PTRACE_XFER_TYPE
*) alloca (count
* sizeof (PTRACE_XFER_TYPE
));
730 /* Fill start and end extra bytes of buffer with existing memory data. */
732 if (addr
!= memaddr
|| len
< (int) sizeof (PTRACE_XFER_TYPE
)) {
733 /* Need part of initial word -- fetch it. */
734 buffer
[0] = ptrace (PT_RTEXT
, inferior_pid
, (PTRACE_ARG3_TYPE
) addr
,
738 if (count
> 1) /* FIXME, avoid if even boundary */
741 = ptrace (PT_RTEXT
, inferior_pid
,
743 (addr
+ (count
- 1) * sizeof (PTRACE_XFER_TYPE
))),
747 /* Copy data to be written over corresponding part of buffer */
749 memcpy ((char *) buffer
+ (memaddr
& (sizeof (PTRACE_XFER_TYPE
) - 1)),
753 /* Write the entire buffer. */
755 for (i
= 0; i
< count
; i
++, addr
+= sizeof (PTRACE_XFER_TYPE
))
758 ptrace (PT_WDATA
, inferior_pid
, (PTRACE_ARG3_TYPE
) addr
,
762 /* Using the appropriate one (I or D) is necessary for
763 Gould NP1, at least. */
765 ptrace (PT_WTEXT
, inferior_pid
, (PTRACE_ARG3_TYPE
) addr
,
774 /* Read all the longwords */
775 for (i
= 0; i
< count
; i
++, addr
+= sizeof (PTRACE_XFER_TYPE
))
778 buffer
[i
] = ptrace (PT_RTEXT
, inferior_pid
,
779 (PTRACE_ARG3_TYPE
) addr
, 0);
785 /* Copy appropriate bytes out of the buffer. */
787 (char *) buffer
+ (memaddr
& (sizeof (PTRACE_XFER_TYPE
) - 1)),
795 _initialize_symm_nat ()
799 * the MPDEBUGGER is necessary for process tree debugging and attach
800 * to work, but it alters the behavior of debugged processes, so other
801 * things (at least child_wait()) will have to change to accomodate
804 * Note that attach is not implemented in dynix 3, and not in ptx
805 * until version 2.1 of the OS.
809 struct sigaction sact
;
811 rv
= mptrace(XPT_MPDEBUGGER
, 0, 0, 0);
813 fatal("_initialize_symm_nat(): mptrace(XPT_MPDEBUGGER): %s",
814 safe_strerror(errno
));
818 * Under MPDEBUGGER, we get SIGCLHD when a traced process does
819 * anything of interest.
823 * Block SIGCHLD. We leave it blocked all the time, and then
824 * call sigsuspend() in child_wait() to wait for the child
825 * to do something. None of these ought to fail, but check anyway.
828 rv
= sigaddset(&set
, SIGCHLD
);
830 fatal("_initialize_symm_nat(): sigaddset(SIGCHLD): %s",
831 safe_strerror(errno
));
833 rv
= sigprocmask(SIG_BLOCK
, &set
, (sigset_t
*)NULL
);
835 fatal("_initialize_symm_nat(): sigprocmask(SIG_BLOCK): %s",
836 safe_strerror(errno
));
839 sact
.sa_handler
= sigchld_handler
;
840 sigemptyset(&sact
.sa_mask
);
841 sact
.sa_flags
= SA_NOCLDWAIT
; /* keep the zombies away */
842 rv
= sigaction(SIGCHLD
, &sact
, (struct sigaction
*)NULL
);
844 fatal("_initialize_symm_nat(): sigaction(SIGCHLD): %s",
845 safe_strerror(errno
));