1 /* Sequent Symmetry host interface, for GDB when running under Unix.
2 Copyright 1986, 1987, 1989, 1991, 1992, 1994, 2001
3 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
22 /* FIXME, some 387-specific items of use taken from i387-tdep.c -- ought to be
31 /* FIXME: What is the _INKERNEL define for? */
36 #include <sys/param.h>
40 #include <sys/ioctl.h>
43 #include <sys/ptrace.h>
45 /* Dynix has only machine/ptrace.h, which is already included by sys/user.h */
46 /* Dynix has no mptrace call */
47 #define mptrace ptrace
52 #define TERMINAL struct sgttyb
57 store_inferior_registers (int regno
)
59 struct pt_regset regs
;
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
) & regs
, 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
) & regs
, 0);
96 fetch_inferior_registers (int regno
)
99 struct pt_regset regs
;
101 registers_fetched ();
103 mptrace (XPT_RREGS
, inferior_pid
, (PTRACE_ARG3_TYPE
) & regs
, 0);
104 *(int *) ®isters
[REGISTER_BYTE (EAX_REGNUM
)] = regs
.pr_eax
;
105 *(int *) ®isters
[REGISTER_BYTE (EBX_REGNUM
)] = regs
.pr_ebx
;
106 *(int *) ®isters
[REGISTER_BYTE (ECX_REGNUM
)] = regs
.pr_ecx
;
107 *(int *) ®isters
[REGISTER_BYTE (EDX_REGNUM
)] = regs
.pr_edx
;
108 *(int *) ®isters
[REGISTER_BYTE (ESI_REGNUM
)] = regs
.pr_esi
;
109 *(int *) ®isters
[REGISTER_BYTE (EDI_REGNUM
)] = regs
.pr_edi
;
110 *(int *) ®isters
[REGISTER_BYTE (EBP_REGNUM
)] = regs
.pr_ebp
;
111 *(int *) ®isters
[REGISTER_BYTE (ESP_REGNUM
)] = regs
.pr_esp
;
112 *(int *) ®isters
[REGISTER_BYTE (EIP_REGNUM
)] = regs
.pr_eip
;
113 *(int *) ®isters
[REGISTER_BYTE (EFLAGS_REGNUM
)] = regs
.pr_flags
;
114 for (i
= 0; i
< FPA_NREGS
; i
++)
116 *(int *) ®isters
[REGISTER_BYTE (FP1_REGNUM
+ i
)] =
117 regs
.pr_fpa
.fpa_regs
[i
];
119 memcpy (®isters
[REGISTER_BYTE (ST0_REGNUM
)], regs
.pr_fpu
.fpu_stack
[0], 10);
120 memcpy (®isters
[REGISTER_BYTE (ST1_REGNUM
)], regs
.pr_fpu
.fpu_stack
[1], 10);
121 memcpy (®isters
[REGISTER_BYTE (ST2_REGNUM
)], regs
.pr_fpu
.fpu_stack
[2], 10);
122 memcpy (®isters
[REGISTER_BYTE (ST3_REGNUM
)], regs
.pr_fpu
.fpu_stack
[3], 10);
123 memcpy (®isters
[REGISTER_BYTE (ST4_REGNUM
)], regs
.pr_fpu
.fpu_stack
[4], 10);
124 memcpy (®isters
[REGISTER_BYTE (ST5_REGNUM
)], regs
.pr_fpu
.fpu_stack
[5], 10);
125 memcpy (®isters
[REGISTER_BYTE (ST6_REGNUM
)], regs
.pr_fpu
.fpu_stack
[6], 10);
126 memcpy (®isters
[REGISTER_BYTE (ST7_REGNUM
)], regs
.pr_fpu
.fpu_stack
[7], 10);
129 /* FIXME: This should be merged with i387-tdep.c as well. */
131 print_fpu_status (struct pt_regset ep
)
139 printf_unfiltered ("80387:");
140 if (ep
.pr_fpu
.fpu_ip
== 0)
142 printf_unfiltered (" not in use.\n");
147 printf_unfiltered ("\n");
149 if (ep
.pr_fpu
.fpu_status
!= 0)
151 print_387_status_word (ep
.pr_fpu
.fpu_status
);
153 print_387_control_word (ep
.pr_fpu
.fpu_control
);
154 printf_unfiltered ("last exception: ");
155 printf_unfiltered ("opcode 0x%x; ", ep
.pr_fpu
.fpu_rsvd4
);
156 printf_unfiltered ("pc 0x%x:0x%x; ", ep
.pr_fpu
.fpu_cs
, ep
.pr_fpu
.fpu_ip
);
157 printf_unfiltered ("operand 0x%x:0x%x\n", ep
.pr_fpu
.fpu_data_offset
, ep
.pr_fpu
.fpu_op_sel
);
159 top
= (ep
.pr_fpu
.fpu_status
>> 11) & 7;
161 printf_unfiltered ("regno tag msb lsb value\n");
162 for (fpreg
= 7; fpreg
>= 0; fpreg
--)
166 printf_unfiltered ("%s %d: ", fpreg
== top
? "=>" : " ", fpreg
);
168 switch ((ep
.pr_fpu
.fpu_tag
>> (fpreg
* 2)) & 3)
171 printf_unfiltered ("valid ");
174 printf_unfiltered ("zero ");
177 printf_unfiltered ("trap ");
180 printf_unfiltered ("empty ");
183 for (i
= 9; i
>= 0; i
--)
184 printf_unfiltered ("%02x", ep
.pr_fpu
.fpu_stack
[fpreg
][i
]);
186 i387_to_double ((char *) ep
.pr_fpu
.fpu_stack
[fpreg
], (char *) &val
);
187 printf_unfiltered (" %g\n", val
);
189 if (ep
.pr_fpu
.fpu_rsvd1
)
190 warning ("rsvd1 is 0x%x\n", ep
.pr_fpu
.fpu_rsvd1
);
191 if (ep
.pr_fpu
.fpu_rsvd2
)
192 warning ("rsvd2 is 0x%x\n", ep
.pr_fpu
.fpu_rsvd2
);
193 if (ep
.pr_fpu
.fpu_rsvd3
)
194 warning ("rsvd3 is 0x%x\n", ep
.pr_fpu
.fpu_rsvd3
);
195 if (ep
.pr_fpu
.fpu_rsvd5
)
196 warning ("rsvd5 is 0x%x\n", ep
.pr_fpu
.fpu_rsvd5
);
200 print_1167_control_word (unsigned int pcr
)
204 pcr_tmp
= pcr
& FPA_PCR_MODE
;
205 printf_unfiltered ("\tMODE= %#x; RND= %#x ", pcr_tmp
, pcr_tmp
& 12);
206 switch (pcr_tmp
& 12)
209 printf_unfiltered ("RN (Nearest Value)");
212 printf_unfiltered ("RZ (Zero)");
215 printf_unfiltered ("RP (Positive Infinity)");
218 printf_unfiltered ("RM (Negative Infinity)");
221 printf_unfiltered ("; IRND= %d ", pcr_tmp
& 2);
222 if (0 == pcr_tmp
& 2)
224 printf_unfiltered ("(same as RND)\n");
228 printf_unfiltered ("(toward zero)\n");
230 pcr_tmp
= pcr
& FPA_PCR_EM
;
231 printf_unfiltered ("\tEM= %#x", pcr_tmp
);
232 if (pcr_tmp
& FPA_PCR_EM_DM
)
233 printf_unfiltered (" DM");
234 if (pcr_tmp
& FPA_PCR_EM_UOM
)
235 printf_unfiltered (" UOM");
236 if (pcr_tmp
& FPA_PCR_EM_PM
)
237 printf_unfiltered (" PM");
238 if (pcr_tmp
& FPA_PCR_EM_UM
)
239 printf_unfiltered (" UM");
240 if (pcr_tmp
& FPA_PCR_EM_OM
)
241 printf_unfiltered (" OM");
242 if (pcr_tmp
& FPA_PCR_EM_ZM
)
243 printf_unfiltered (" ZM");
244 if (pcr_tmp
& FPA_PCR_EM_IM
)
245 printf_unfiltered (" IM");
246 printf_unfiltered ("\n");
247 pcr_tmp
= FPA_PCR_CC
;
248 printf_unfiltered ("\tCC= %#x", pcr_tmp
);
249 if (pcr_tmp
& FPA_PCR_20MHZ
)
250 printf_unfiltered (" 20MHZ");
251 if (pcr_tmp
& FPA_PCR_CC_Z
)
252 printf_unfiltered (" Z");
253 if (pcr_tmp
& FPA_PCR_CC_C2
)
254 printf_unfiltered (" C2");
256 /* Dynix defines FPA_PCR_CC_C0 to 0x100 and ptx defines
257 FPA_PCR_CC_C1 to 0x100. Use whichever is defined and assume
258 the OS knows what it is doing. */
260 if (pcr_tmp
& FPA_PCR_CC_C1
)
261 printf_unfiltered (" C1");
263 if (pcr_tmp
& FPA_PCR_CC_C0
)
264 printf_unfiltered (" C0");
270 printf_unfiltered (" (Equal)");
277 printf_unfiltered (" (Less than)");
280 printf_unfiltered (" (Greater than)");
289 printf_unfiltered (" (Unordered)");
292 printf_unfiltered (" (Undefined)");
295 printf_unfiltered ("\n");
296 pcr_tmp
= pcr
& FPA_PCR_AE
;
297 printf_unfiltered ("\tAE= %#x", pcr_tmp
);
298 if (pcr_tmp
& FPA_PCR_AE_DE
)
299 printf_unfiltered (" DE");
300 if (pcr_tmp
& FPA_PCR_AE_UOE
)
301 printf_unfiltered (" UOE");
302 if (pcr_tmp
& FPA_PCR_AE_PE
)
303 printf_unfiltered (" PE");
304 if (pcr_tmp
& FPA_PCR_AE_UE
)
305 printf_unfiltered (" UE");
306 if (pcr_tmp
& FPA_PCR_AE_OE
)
307 printf_unfiltered (" OE");
308 if (pcr_tmp
& FPA_PCR_AE_ZE
)
309 printf_unfiltered (" ZE");
310 if (pcr_tmp
& FPA_PCR_AE_EE
)
311 printf_unfiltered (" EE");
312 if (pcr_tmp
& FPA_PCR_AE_IE
)
313 printf_unfiltered (" IE");
314 printf_unfiltered ("\n");
317 print_1167_regs (long regs
[FPA_NREGS
])
335 for (i
= 0; i
< FPA_NREGS
; i
++)
338 printf_unfiltered ("%%fp%d: raw= %#x, single= %f", i
+ 1, regs
[i
], xf
.f
);
341 printf_unfiltered ("\n");
346 xd
.l
[0] = regs
[i
+ 1];
347 printf_unfiltered (", double= %f\n", xd
.d
);
352 print_fpa_status (struct pt_regset ep
)
355 printf_unfiltered ("WTL 1167:");
356 if (ep
.pr_fpa
.fpa_pcr
!= 0)
358 printf_unfiltered ("\n");
359 print_1167_control_word (ep
.pr_fpa
.fpa_pcr
);
360 print_1167_regs (ep
.pr_fpa
.fpa_regs
);
364 printf_unfiltered (" not in use.\n");
368 #if 0 /* disabled because it doesn't go through the target vector. */
369 i386_float_info (void)
371 char ubuf
[UPAGES
* NBPG
];
372 struct pt_regset regset
;
374 if (have_inferior_p ())
376 PTRACE_READ_REGS (inferior_pid
, (PTRACE_ARG3_TYPE
) & regset
);
380 int corechan
= bfd_cache_lookup (core_bfd
);
381 if (lseek (corechan
, 0, 0) < 0)
383 perror ("seek on core file");
385 if (myread (corechan
, ubuf
, UPAGES
* NBPG
) < 0)
387 perror ("read on core file");
389 /* only interested in the floating point registers */
390 regset
.pr_fpu
= ((struct user
*) ubuf
)->u_fpusave
;
391 regset
.pr_fpa
= ((struct user
*) ubuf
)->u_fpasave
;
393 print_fpu_status (regset
);
394 print_fpa_status (regset
);
398 static volatile int got_sigchld
;
401 /* This will eventually be more interesting. */
403 sigchld_handler (int signo
)
409 * Signals for which the default action does not cause the process
410 * to die. See <sys/signal.h> for where this came from (alas, we
411 * can't use those macros directly)
414 #define sigmask(s) (1 << ((s) - 1))
416 #define SIGNALS_DFL_SAFE sigmask(SIGSTOP) | sigmask(SIGTSTP) | \
417 sigmask(SIGTTIN) | sigmask(SIGTTOU) | sigmask(SIGCHLD) | \
418 sigmask(SIGCONT) | sigmask(SIGWINCH) | sigmask(SIGPWR) | \
419 sigmask(SIGURG) | sigmask(SIGPOLL)
423 * Thanks to XPT_MPDEBUGGER, we have to mange child_wait().
426 child_wait (int pid
, struct target_waitstatus
*status
)
428 int save_errno
, rv
, xvaloff
, saoff
, sa_hand
;
432 /* Host signal number for a signal which the inferior terminates with, or
433 0 if it hasn't terminated due to a signal. */
434 static int death_by_signal
= 0;
435 #ifdef SVR4_SHARED_LIBS /* use this to distinguish ptx 2 vs ptx 4 */
441 set_sigint_trap (); /* Causes SIGINT to be passed on to the
449 while (got_sigchld
== 0)
454 clear_sigint_trap ();
456 rv
= mptrace (XPT_STOPSTAT
, 0, (char *) &pt
, 0);
459 printf ("XPT_STOPSTAT: errno %d\n", errno
); /* DEBUG */
465 if (pid
!= inferior_pid
)
467 /* NOTE: the mystery fork in csh/tcsh needs to be ignored.
468 * We should not return new children for the initial run
469 * of a process until it has done the exec.
471 /* inferior probably forked; send it on its way */
472 rv
= mptrace (XPT_UNDEBUG
, pid
, 0, 0);
475 printf ("child_wait: XPT_UNDEBUG: pid %d: %s\n", pid
,
476 safe_strerror (errno
));
480 /* FIXME: Do we deal with fork notification correctly? */
481 switch (pt
.ps_reason
)
484 /* multi proc: treat like PTS_EXEC */
486 * Pretend this didn't happen, since gdb isn't set up
487 * to deal with stops on fork.
489 rv
= ptrace (PT_CONTSIG
, pid
, 1, 0);
492 printf ("PTS_FORK: PT_CONTSIG: error %d\n", errno
);
497 * Pretend this is a SIGTRAP.
499 status
->kind
= TARGET_WAITKIND_STOPPED
;
500 status
->value
.sig
= TARGET_SIGNAL_TRAP
;
504 * Note: we stop before the exit actually occurs. Extract
505 * the exit code from the uarea. If we're stopped in the
506 * exit() system call, the exit code will be in
507 * u.u_ap[0]. An exit due to an uncaught signal will have
508 * something else in here, see the comment in the default:
509 * case, below. Finally,let the process exit.
513 status
->kind
= TARGET_WAITKIND_SIGNALED
;
514 status
->value
.sig
= target_signal_from_host (death_by_signal
);
518 xvaloff
= (unsigned long) &u
.u_ap
[0] - (unsigned long) &u
;
520 rv
= ptrace (PT_RUSER
, pid
, (char *) xvaloff
, 0);
521 status
->kind
= TARGET_WAITKIND_EXITED
;
522 status
->value
.integer
= rv
;
524 * addr & data to mptrace() don't matter here, since
525 * the process is already dead.
527 rv
= mptrace (XPT_UNDEBUG
, pid
, 0, 0);
530 printf ("child_wait: PTS_EXIT: XPT_UNDEBUG: pid %d error %d\n", pid
,
534 case PTS_WATCHPT_HIT
:
535 internal_error (__FILE__
, __LINE__
,
536 "PTS_WATCHPT_HIT\n");
539 /* stopped by signal */
540 status
->kind
= TARGET_WAITKIND_STOPPED
;
541 status
->value
.sig
= target_signal_from_host (pt
.ps_reason
);
544 if (0 == (SIGNALS_DFL_SAFE
& sigmask (pt
.ps_reason
)))
548 /* else default action of signal is to die */
549 #ifdef SVR4_SHARED_LIBS
550 rv
= ptrace (PT_GET_PRSTATUS
, pid
, (char *) &pstatus
, 0);
552 error ("child_wait: signal %d PT_GET_PRSTATUS: %s\n",
553 pt
.ps_reason
, safe_strerror (errno
));
554 if (pstatus
.pr_cursig
!= pt
.ps_reason
)
556 printf ("pstatus signal %d, pt signal %d\n",
557 pstatus
.pr_cursig
, pt
.ps_reason
);
559 sa_hand
= (int) pstatus
.pr_action
.sa_handler
;
561 saoff
= (unsigned long) &u
.u_sa
[0] - (unsigned long) &u
;
562 saoff
+= sizeof (struct sigaction
) * (pt
.ps_reason
- 1);
564 sa_hand
= ptrace (PT_RUSER
, pid
, (char *) saoff
, 0);
566 error ("child_wait: signal %d: RUSER: %s\n",
567 pt
.ps_reason
, safe_strerror (errno
));
569 if ((int) SIG_DFL
== sa_hand
)
571 /* we will be dying */
572 death_by_signal
= pt
.ps_reason
;
578 while (pid
!= inferior_pid
); /* Some other child died or stopped */
582 #else /* !ATTACH_DETACH */
584 * Simple child_wait() based on inftarg.c child_wait() for use until
585 * the MPDEBUGGER child_wait() works properly. This will go away when
588 child_wait (int pid
, struct target_waitstatus
*ourstatus
)
595 pid
= wait (&status
);
600 if (save_errno
== EINTR
)
602 fprintf (stderr
, "Child process unexpectedly missing: %s.\n",
603 safe_strerror (save_errno
));
604 ourstatus
->kind
= TARGET_WAITKIND_SIGNALLED
;
605 ourstatus
->value
.sig
= TARGET_SIGNAL_UNKNOWN
;
609 while (pid
!= inferior_pid
); /* Some other child died or stopped */
610 store_waitstatus (ourstatus
, status
);
613 #endif /* ATTACH_DETACH */
617 /* This function simply calls ptrace with the given arguments.
618 It exists so that all calls to ptrace are isolated in this
619 machine-dependent file. */
621 call_ptrace (int request
, int pid
, PTRACE_ARG3_TYPE addr
, int data
)
623 return ptrace (request
, pid
, addr
, data
);
627 call_mptrace (int request
, int pid
, PTRACE_ARG3_TYPE addr
, int data
)
629 return mptrace (request
, pid
, addr
, data
);
632 #if defined (DEBUG_PTRACE)
633 /* For the rest of the file, use an extra level of indirection */
634 /* This lets us breakpoint usefully on call_ptrace. */
635 #define ptrace call_ptrace
636 #define mptrace call_mptrace
642 if (inferior_pid
== 0)
645 /* For MPDEBUGGER, don't use PT_KILL, since the child will stop
646 again with a PTS_EXIT. Just hit him with SIGKILL (so he stops)
649 kill (inferior_pid
, SIGKILL
);
652 #else /* ATTACH_DETACH */
653 ptrace (PT_KILL
, inferior_pid
, 0, 0);
655 #endif /* ATTACH_DETACH */
656 target_mourn_inferior ();
659 /* Resume execution of the inferior process.
660 If STEP is nonzero, single-step it.
661 If SIGNAL is nonzero, give it that signal. */
664 child_resume (int pid
, int step
, enum target_signal signal
)
671 /* An address of (PTRACE_ARG3_TYPE)1 tells ptrace to continue from where
672 it was. (If GDB wanted it to start some other way, we have already
673 written a new PC value to the child.)
675 If this system does not support PT_SSTEP, a higher level function will
676 have called single_step() to transmute the step request into a
677 continue request (by setting breakpoints on all possible successor
678 instructions), so we don't have to worry about that here. */
681 ptrace (PT_SSTEP
, pid
, (PTRACE_ARG3_TYPE
) 1, signal
);
683 ptrace (PT_CONTSIG
, pid
, (PTRACE_ARG3_TYPE
) 1, signal
);
686 perror_with_name ("ptrace");
690 /* Start debugging the process whose number is PID. */
697 rv
= mptrace (XPT_DEBUG
, pid
, 0, 0);
700 error ("mptrace(XPT_DEBUG): %s", safe_strerror (errno
));
702 rv
= mptrace (XPT_SIGNAL
, pid
, 0, SIGSTOP
);
705 error ("mptrace(XPT_SIGNAL): %s", safe_strerror (errno
));
716 rv
= mptrace (XPT_UNDEBUG
, inferior_pid
, 1, signo
);
719 error ("mptrace(XPT_UNDEBUG): %s", safe_strerror (errno
));
724 #endif /* ATTACH_DETACH */
726 /* Default the type of the ptrace transfer to int. */
727 #ifndef PTRACE_XFER_TYPE
728 #define PTRACE_XFER_TYPE int
732 /* NOTE! I tried using PTRACE_READDATA, etc., to read and write memory
733 in the NEW_SUN_PTRACE case.
734 It ought to be straightforward. But it appears that writing did
735 not write the data that I specified. I cannot understand where
736 it got the data that it actually did write. */
738 /* Copy LEN bytes to or from inferior's memory starting at MEMADDR
739 to debugger memory starting at MYADDR. Copy to inferior if
740 WRITE is nonzero. TARGET is ignored.
742 Returns the length copied, which is either the LEN argument or zero.
743 This xfer function does not do partial moves, since child_ops
744 doesn't allow memory operations to cross below us in the target stack
748 child_xfer_memory (CORE_ADDR memaddr
, char *myaddr
, int len
, int write
,
749 struct target_ops
*target
)
752 /* Round starting address down to longword boundary. */
753 register CORE_ADDR addr
= memaddr
& -sizeof (PTRACE_XFER_TYPE
);
754 /* Round ending address up; get number of longwords that makes. */
756 = (((memaddr
+ len
) - addr
) + sizeof (PTRACE_XFER_TYPE
) - 1)
757 / sizeof (PTRACE_XFER_TYPE
);
758 /* Allocate buffer of that many longwords. */
759 register PTRACE_XFER_TYPE
*buffer
760 = (PTRACE_XFER_TYPE
*) alloca (count
* sizeof (PTRACE_XFER_TYPE
));
764 /* Fill start and end extra bytes of buffer with existing memory data. */
766 if (addr
!= memaddr
|| len
< (int) sizeof (PTRACE_XFER_TYPE
))
768 /* Need part of initial word -- fetch it. */
769 buffer
[0] = ptrace (PT_RTEXT
, inferior_pid
, (PTRACE_ARG3_TYPE
) addr
,
773 if (count
> 1) /* FIXME, avoid if even boundary */
776 = ptrace (PT_RTEXT
, inferior_pid
,
778 (addr
+ (count
- 1) * sizeof (PTRACE_XFER_TYPE
))),
782 /* Copy data to be written over corresponding part of buffer */
784 memcpy ((char *) buffer
+ (memaddr
& (sizeof (PTRACE_XFER_TYPE
) - 1)),
788 /* Write the entire buffer. */
790 for (i
= 0; i
< count
; i
++, addr
+= sizeof (PTRACE_XFER_TYPE
))
793 ptrace (PT_WDATA
, inferior_pid
, (PTRACE_ARG3_TYPE
) addr
,
797 /* Using the appropriate one (I or D) is necessary for
798 Gould NP1, at least. */
800 ptrace (PT_WTEXT
, inferior_pid
, (PTRACE_ARG3_TYPE
) addr
,
809 /* Read all the longwords */
810 for (i
= 0; i
< count
; i
++, addr
+= sizeof (PTRACE_XFER_TYPE
))
813 buffer
[i
] = ptrace (PT_RTEXT
, inferior_pid
,
814 (PTRACE_ARG3_TYPE
) addr
, 0);
820 /* Copy appropriate bytes out of the buffer. */
822 (char *) buffer
+ (memaddr
& (sizeof (PTRACE_XFER_TYPE
) - 1)),
830 _initialize_symm_nat (void)
834 * the MPDEBUGGER is necessary for process tree debugging and attach
835 * to work, but it alters the behavior of debugged processes, so other
836 * things (at least child_wait()) will have to change to accomodate
839 * Note that attach is not implemented in dynix 3, and not in ptx
840 * until version 2.1 of the OS.
844 struct sigaction sact
;
846 rv
= mptrace (XPT_MPDEBUGGER
, 0, 0, 0);
849 internal_error (__FILE__
, __LINE__
,
850 "_initialize_symm_nat(): mptrace(XPT_MPDEBUGGER): %s",
851 safe_strerror (errno
));
855 * Under MPDEBUGGER, we get SIGCLHD when a traced process does
856 * anything of interest.
860 * Block SIGCHLD. We leave it blocked all the time, and then
861 * call sigsuspend() in child_wait() to wait for the child
862 * to do something. None of these ought to fail, but check anyway.
865 rv
= sigaddset (&set
, SIGCHLD
);
868 internal_error (__FILE__
, __LINE__
,
869 "_initialize_symm_nat(): sigaddset(SIGCHLD): %s",
870 safe_strerror (errno
));
872 rv
= sigprocmask (SIG_BLOCK
, &set
, (sigset_t
*) NULL
);
875 internal_error (__FILE__
, __LINE__
,
876 "_initialize_symm_nat(): sigprocmask(SIG_BLOCK): %s",
877 safe_strerror (errno
));
880 sact
.sa_handler
= sigchld_handler
;
881 sigemptyset (&sact
.sa_mask
);
882 sact
.sa_flags
= SA_NOCLDWAIT
; /* keep the zombies away */
883 rv
= sigaction (SIGCHLD
, &sact
, (struct sigaction
*) NULL
);
886 internal_error (__FILE__
, __LINE__
,
887 "_initialize_symm_nat(): sigaction(SIGCHLD): %s",
888 safe_strerror (errno
));