OSDN Git Service

Initial revision
[pf3gnuchains/pf3gnuchains3x.git] / gdb / symm-nat.c
1 /* Sequent Symmetry host interface, for GDB when running under Unix.
2    Copyright 1986, 1987, 1989, 1991, 1992, 1994 Free Software Foundation, Inc.
3
4 This file is part of GDB.
5
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.
10
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.
15
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
19
20 /* FIXME, some 387-specific items of use taken from i387-tdep.c -- ought to be
21    merged back in. */
22
23 #include "defs.h"
24 #include "frame.h"
25 #include "inferior.h"
26 #include "symtab.h"
27 #include "target.h"
28
29 /* FIXME: What is the _INKERNEL define for?  */
30 #define _INKERNEL
31 #include <signal.h>
32 #undef _INKERNEL
33 #include <sys/wait.h>
34 #include <sys/param.h>
35 #include <sys/user.h>
36 #include <sys/proc.h>
37 #include <sys/dir.h>
38 #include <sys/ioctl.h>
39 #include "gdb_stat.h"
40 #ifdef _SEQUENT_
41 #include <sys/ptrace.h>
42 #else
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
46 #endif
47 #include "gdbcore.h"
48 #include <fcntl.h>
49 #include <sgtty.h>
50 #define TERMINAL struct sgttyb
51
52 #include "gdbcore.h"
53
54 void
55 store_inferior_registers(regno)
56 int regno;
57 {
58   struct pt_regset regs;
59   int i;
60   extern char registers[];
61
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);
68
69   regs.pr_eax = *(int *)&registers[REGISTER_BYTE(0)];
70   regs.pr_ebx = *(int *)&registers[REGISTER_BYTE(5)];
71   regs.pr_ecx = *(int *)&registers[REGISTER_BYTE(2)];
72   regs.pr_edx = *(int *)&registers[REGISTER_BYTE(1)];
73   regs.pr_esi = *(int *)&registers[REGISTER_BYTE(6)];
74   regs.pr_edi = *(int *)&registers[REGISTER_BYTE(7)];
75   regs.pr_esp = *(int *)&registers[REGISTER_BYTE(14)];
76   regs.pr_ebp = *(int *)&registers[REGISTER_BYTE(15)];
77   regs.pr_eip = *(int *)&registers[REGISTER_BYTE(16)];
78   regs.pr_flags = *(int *)&registers[REGISTER_BYTE(17)];
79   for (i = 0; i < 31; i++)
80     {
81       regs.pr_fpa.fpa_regs[i] =
82         *(int *)&registers[REGISTER_BYTE(FP1_REGNUM+i)];
83     }
84   memcpy (regs.pr_fpu.fpu_stack[0], &registers[REGISTER_BYTE(ST0_REGNUM)], 10);
85   memcpy (regs.pr_fpu.fpu_stack[1], &registers[REGISTER_BYTE(ST1_REGNUM)], 10);
86   memcpy (regs.pr_fpu.fpu_stack[2], &registers[REGISTER_BYTE(ST2_REGNUM)], 10);
87   memcpy (regs.pr_fpu.fpu_stack[3], &registers[REGISTER_BYTE(ST3_REGNUM)], 10);
88   memcpy (regs.pr_fpu.fpu_stack[4], &registers[REGISTER_BYTE(ST4_REGNUM)], 10);
89   memcpy (regs.pr_fpu.fpu_stack[5], &registers[REGISTER_BYTE(ST5_REGNUM)], 10);
90   memcpy (regs.pr_fpu.fpu_stack[6], &registers[REGISTER_BYTE(ST6_REGNUM)], 10);
91   memcpy (regs.pr_fpu.fpu_stack[7], &registers[REGISTER_BYTE(ST7_REGNUM)], 10);
92   mptrace (XPT_WREGS, inferior_pid, (PTRACE_ARG3_TYPE) &regs, 0);
93 }
94
95 void
96 fetch_inferior_registers (regno)
97      int regno;
98 {
99   int i;
100   struct pt_regset regs;
101   extern char registers[];
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(ep)
134 struct pt_regset ep;
135 {
136     int i;
137     int bothstatus;
138     int top;
139     int fpreg;
140     unsigned char *p;
141     
142     printf_unfiltered("80387:");
143     if (ep.pr_fpu.fpu_ip == 0) {
144         printf_unfiltered(" not in use.\n");
145         return;
146     } else {
147         printf_unfiltered("\n");
148     }
149     if (ep.pr_fpu.fpu_status != 0) {
150         print_387_status_word (ep.pr_fpu.fpu_status);
151     }
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);
157     
158     top = (ep.pr_fpu.fpu_status >> 11) & 7;
159     
160     printf_unfiltered ("regno  tag  msb              lsb  value\n");
161     for (fpreg = 7; fpreg >= 0; fpreg--) 
162         {
163             double val;
164             
165             printf_unfiltered ("%s %d: ", fpreg == top ? "=>" : "  ", fpreg);
166             
167             switch ((ep.pr_fpu.fpu_tag >> (fpreg * 2)) & 3) 
168                 {
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;
173                 }
174             for (i = 9; i >= 0; i--)
175                 printf_unfiltered ("%02x", ep.pr_fpu.fpu_stack[fpreg][i]);
176             
177             i387_to_double ((char *)ep.pr_fpu.fpu_stack[fpreg], (char *)&val);
178             printf_unfiltered ("  %g\n", val);
179         }
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);
188 }
189
190
191 print_1167_control_word(pcr)
192 unsigned int pcr;
193
194 {
195     int pcr_tmp;
196
197     pcr_tmp = pcr & FPA_PCR_MODE;
198     printf_unfiltered("\tMODE= %#x; RND= %#x ", pcr_tmp, pcr_tmp & 12);
199     switch (pcr_tmp & 12) {
200     case 0:
201         printf_unfiltered("RN (Nearest Value)");
202         break;
203     case 1:
204         printf_unfiltered("RZ (Zero)");
205         break;
206     case 2:
207         printf_unfiltered("RP (Positive Infinity)");
208         break;
209     case 3:
210         printf_unfiltered("RM (Negative Infinity)");
211         break;
212     }
213     printf_unfiltered("; IRND= %d ", pcr_tmp & 2);
214     if (0 == pcr_tmp & 2) {
215         printf_unfiltered("(same as RND)\n");
216     } else {
217         printf_unfiltered("(toward zero)\n");
218     }
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");
234
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.  */
238 #ifdef FPA_PCR_CC_C1
239     if (pcr_tmp & FPA_PCR_CC_C1) printf_unfiltered(" C1");
240 #else
241     if (pcr_tmp & FPA_PCR_CC_C0) printf_unfiltered(" C0");
242 #endif
243
244     switch (pcr_tmp)
245       {
246       case FPA_PCR_CC_Z:
247         printf_unfiltered(" (Equal)");
248         break;
249 #ifdef FPA_PCR_CC_C1
250       case FPA_PCR_CC_C1:
251 #else
252       case FPA_PCR_CC_C0:
253 #endif
254         printf_unfiltered(" (Less than)");
255         break;
256       case 0:
257         printf_unfiltered(" (Greater than)");
258         break;
259       case FPA_PCR_CC_Z | 
260 #ifdef FPA_PCR_CC_C1
261         FPA_PCR_CC_C1
262 #else
263         FPA_PCR_CC_C0
264 #endif
265           | FPA_PCR_CC_C2:
266         printf_unfiltered(" (Unordered)");
267         break;
268       default:
269         printf_unfiltered(" (Undefined)");
270         break;
271       }
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");
284 }
285
286 print_1167_regs(regs)
287 long regs[FPA_NREGS];
288
289 {
290     int i;
291
292     union {
293         double  d;
294         long    l[2];
295     } xd;
296     union {
297         float   f;
298         long    l;
299     } xf;
300
301
302     for (i = 0; i < FPA_NREGS; i++) {
303         xf.l = regs[i];
304         printf_unfiltered("%%fp%d: raw= %#x, single= %f", i+1, regs[i], xf.f);
305         if (!(i & 1)) {
306             printf_unfiltered("\n");
307         } else {
308             xd.l[1] = regs[i];
309             xd.l[0] = regs[i+1];
310             printf_unfiltered(", double= %f\n", xd.d);
311         }
312     }
313 }
314
315 print_fpa_status(ep)
316 struct pt_regset ep;
317
318 {
319
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);
325     } else {
326         printf_unfiltered(" not in use.\n");
327     }
328 }
329
330 #if 0 /* disabled because it doesn't go through the target vector.  */
331 i386_float_info ()
332 {
333   char ubuf[UPAGES*NBPG];
334   struct pt_regset regset;
335
336   if (have_inferior_p())
337     {
338       PTRACE_READ_REGS (inferior_pid, (PTRACE_ARG3_TYPE) &regset);
339     }
340   else
341     {
342       int corechan = bfd_cache_lookup (core_bfd);
343       if (lseek (corechan, 0, 0) < 0)
344         {
345           perror ("seek on core file");
346         }
347       if (myread (corechan, ubuf, UPAGES*NBPG) < 0)
348         {
349           perror ("read on core file");
350         }
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;
354     }
355   print_fpu_status(regset);
356   print_fpa_status(regset);
357 }
358 #endif
359
360 static volatile int got_sigchld;
361
362 /*ARGSUSED*/
363 /* This will eventually be more interesting. */
364 void
365 sigchld_handler(signo)
366         int signo;
367 {
368         got_sigchld++;
369 }
370
371 /*
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)
375  */
376 #ifndef sigmask
377 #define sigmask(s) (1 << ((s) - 1))
378 #endif
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)
383
384 #ifdef ATTACH_DETACH
385 /*
386  * Thanks to XPT_MPDEBUGGER, we have to mange child_wait().
387  */
388 int
389 child_wait(pid, status)
390      int pid;
391      struct target_waitstatus *status;
392 {
393   int save_errno, rv, xvaloff, saoff, sa_hand;
394   struct pt_stop pt;
395   struct user u;
396   sigset_t set;
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 */
401   prstatus_t pstatus;
402 #endif
403
404   do {
405     set_sigint_trap();  /* Causes SIGINT to be passed on to the
406                            attached process. */
407     save_errno = errno;
408
409     got_sigchld = 0;
410
411     sigemptyset(&set);
412
413     while (got_sigchld == 0) {
414             sigsuspend(&set);
415     }
416     
417     clear_sigint_trap();
418
419     rv = mptrace(XPT_STOPSTAT, 0, (char *)&pt, 0);
420     if (-1 == rv) {
421             printf("XPT_STOPSTAT: errno %d\n", errno); /* DEBUG */
422             continue;
423     }
424
425     pid = pt.ps_pid;
426
427     if (pid != inferior_pid) {
428             /* NOTE: the mystery fork in csh/tcsh needs to be ignored.
429              * We should not return new children for the initial run
430              * of a process until it has done the exec.
431              */
432             /* inferior probably forked; send it on its way */
433             rv = mptrace(XPT_UNDEBUG, pid, 0, 0);
434             if (-1 == rv) {
435                     printf("child_wait: XPT_UNDEBUG: pid %d: %s\n", pid,
436                            safe_strerror(errno));
437             }
438             continue;
439     }
440     /* FIXME: Do we deal with fork notification correctly?  */
441     switch (pt.ps_reason) {
442     case PTS_FORK:
443         /* multi proc: treat like PTS_EXEC */
444             /*
445              * Pretend this didn't happen, since gdb isn't set up
446              * to deal with stops on fork.
447              */
448             rv = ptrace(PT_CONTSIG, pid, 1, 0);
449             if (-1 == rv) {
450                     printf("PTS_FORK: PT_CONTSIG: error %d\n", errno);
451             }
452             continue;
453     case PTS_EXEC:
454             /*
455              * Pretend this is a SIGTRAP.
456              */
457             status->kind = TARGET_WAITKIND_STOPPED;
458             status->value.sig = TARGET_SIGNAL_TRAP;
459             break;
460     case PTS_EXIT:
461             /*
462              * Note: we stop before the exit actually occurs.  Extract
463              * the exit code from the uarea.  If we're stopped in the
464              * exit() system call, the exit code will be in
465              * u.u_ap[0].  An exit due to an uncaught signal will have
466              * something else in here, see the comment in the default:
467              * case, below.  Finally,let the process exit.
468              */
469             if (death_by_signal)
470               {
471                 status->kind = TARGET_WAITKIND_SIGNALED;
472                 status->value.sig = target_signal_from_host (death_by_signal);
473                 death_by_signal = 0;
474                 break;
475               }
476             xvaloff = (unsigned long)&u.u_ap[0] - (unsigned long)&u;
477             errno = 0;
478             rv = ptrace(PT_RUSER, pid, (char *)xvaloff, 0);
479             status->kind = TARGET_WAITKIND_EXITED;
480             status->value.integer = rv;
481             /*
482              * addr & data to mptrace() don't matter here, since
483              * the process is already dead.
484              */
485             rv = mptrace(XPT_UNDEBUG, pid, 0, 0);
486             if (-1 == rv) {
487                     printf("child_wait: PTS_EXIT: XPT_UNDEBUG: pid %d error %d\n", pid,
488                            errno);
489             }
490             break;
491     case PTS_WATCHPT_HIT:
492             fatal("PTS_WATCHPT_HIT\n");
493             break;
494     default:
495             /* stopped by signal */
496             status->kind = TARGET_WAITKIND_STOPPED;
497             status->value.sig = target_signal_from_host (pt.ps_reason);
498             death_by_signal = 0;
499
500             if (0 == (SIGNALS_DFL_SAFE & sigmask(pt.ps_reason))) {
501                     break;
502             }
503             /* else default action of signal is to die */
504 #ifdef SVR4_SHARED_LIBS
505             rv = ptrace(PT_GET_PRSTATUS, pid, (char *)&pstatus, 0);
506             if (-1 == rv)
507                 error("child_wait: signal %d PT_GET_PRSTATUS: %s\n",
508                         pt.ps_reason, safe_strerror(errno));
509             if (pstatus.pr_cursig != pt.ps_reason) {
510                 printf("pstatus signal %d, pt signal %d\n",
511                         pstatus.pr_cursig, pt.ps_reason);
512             }
513             sa_hand = (int)pstatus.pr_action.sa_handler;
514 #else
515             saoff = (unsigned long)&u.u_sa[0] - (unsigned long)&u;
516             saoff += sizeof(struct sigaction) * (pt.ps_reason - 1);
517             errno = 0;
518             sa_hand = ptrace(PT_RUSER, pid, (char *)saoff, 0);
519             if (errno)
520                     error("child_wait: signal %d: RUSER: %s\n",
521                            pt.ps_reason, safe_strerror(errno));
522 #endif
523             if ((int)SIG_DFL == sa_hand) {
524                     /* we will be dying */
525                     death_by_signal = pt.ps_reason;
526             }
527             break;
528     }
529
530   } while (pid != inferior_pid); /* Some other child died or stopped */
531
532   return pid;
533 }
534 #else /* !ATTACH_DETACH */
535 /*
536  * Simple child_wait() based on inftarg.c child_wait() for use until
537  * the MPDEBUGGER child_wait() works properly.  This will go away when
538  * that is fixed.
539  */
540 child_wait (pid, ourstatus)
541      int pid;
542      struct target_waitstatus *ourstatus;
543 {
544   int save_errno;
545   int status;
546
547   do {
548     pid = wait (&status);
549     save_errno = errno;
550
551     if (pid == -1)
552       {
553         if (save_errno == EINTR)
554           continue;
555         fprintf (stderr, "Child process unexpectedly missing: %s.\n",
556                  safe_strerror (save_errno));
557         ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
558         ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
559         return -1;
560       }
561   } while (pid != inferior_pid); /* Some other child died or stopped */
562   store_waitstatus (ourstatus, status);
563   return pid;
564 }
565 #endif /* ATTACH_DETACH */
566
567
568 \f
569 /* This function simply calls ptrace with the given arguments.  
570    It exists so that all calls to ptrace are isolated in this 
571    machine-dependent file. */
572 int
573 call_ptrace (request, pid, addr, data)
574      int request, pid;
575      PTRACE_ARG3_TYPE addr;
576      int data;
577 {
578   return ptrace (request, pid, addr, data);
579 }
580
581 int
582 call_mptrace(request, pid, addr, data)
583         int request, pid;
584         PTRACE_ARG3_TYPE addr;
585         int data;
586 {
587         return mptrace(request, pid, addr, data);
588 }
589
590 #if defined (DEBUG_PTRACE)
591 /* For the rest of the file, use an extra level of indirection */
592 /* This lets us breakpoint usefully on call_ptrace. */
593 #define ptrace call_ptrace
594 #define mptrace call_mptrace
595 #endif
596
597 void
598 kill_inferior ()
599 {
600   if (inferior_pid == 0)
601     return;
602
603   /* For MPDEBUGGER, don't use PT_KILL, since the child will stop
604      again with a PTS_EXIT.  Just hit him with SIGKILL (so he stops)
605      and detach. */
606
607   kill (inferior_pid, SIGKILL);
608 #ifdef ATTACH_DETACH
609   detach(SIGKILL);
610 #else /* ATTACH_DETACH */
611   ptrace(PT_KILL, inferior_pid, 0, 0);
612   wait((int *)NULL);
613 #endif /* ATTACH_DETACH */
614   target_mourn_inferior ();
615 }
616
617 /* Resume execution of the inferior process.
618    If STEP is nonzero, single-step it.
619    If SIGNAL is nonzero, give it that signal.  */
620
621 void
622 child_resume (pid, step, signal)
623      int pid;
624      int step;
625      enum target_signal signal;
626 {
627   errno = 0;
628
629   if (pid == -1)
630     pid = inferior_pid;
631
632   /* An address of (PTRACE_ARG3_TYPE)1 tells ptrace to continue from where
633      it was.  (If GDB wanted it to start some other way, we have already
634      written a new PC value to the child.)
635
636      If this system does not support PT_SSTEP, a higher level function will
637      have called single_step() to transmute the step request into a
638      continue request (by setting breakpoints on all possible successor
639      instructions), so we don't have to worry about that here.  */
640
641   if (step)
642     ptrace (PT_SSTEP,     pid, (PTRACE_ARG3_TYPE) 1, signal);
643   else
644     ptrace (PT_CONTSIG, pid, (PTRACE_ARG3_TYPE) 1, signal);
645
646   if (errno)
647     perror_with_name ("ptrace");
648 }
649 \f
650 #ifdef ATTACH_DETACH
651 /* Start debugging the process whose number is PID.  */
652 int
653 attach (pid)
654      int pid;
655 {
656         sigset_t set;
657         int rv;
658
659         rv = mptrace(XPT_DEBUG, pid, 0, 0);
660         if (-1 == rv) {
661                 error("mptrace(XPT_DEBUG): %s", safe_strerror(errno));
662         }
663         rv = mptrace(XPT_SIGNAL, pid, 0, SIGSTOP);
664         if (-1 == rv) {
665                 error("mptrace(XPT_SIGNAL): %s", safe_strerror(errno));
666         }
667         attach_flag = 1;
668         return pid;
669 }
670
671 void
672 detach (signo)
673      int signo;
674 {
675         int rv;
676
677         rv = mptrace(XPT_UNDEBUG, inferior_pid, 1, signo);
678         if (-1 == rv) {
679                 error("mptrace(XPT_UNDEBUG): %s", safe_strerror(errno));
680         }
681         attach_flag = 0;
682 }
683
684 #endif /* ATTACH_DETACH */
685 \f
686 /* Default the type of the ptrace transfer to int.  */
687 #ifndef PTRACE_XFER_TYPE
688 #define PTRACE_XFER_TYPE int
689 #endif
690
691 \f
692 /* NOTE! I tried using PTRACE_READDATA, etc., to read and write memory
693    in the NEW_SUN_PTRACE case.
694    It ought to be straightforward.  But it appears that writing did
695    not write the data that I specified.  I cannot understand where
696    it got the data that it actually did write.  */
697
698 /* Copy LEN bytes to or from inferior's memory starting at MEMADDR
699    to debugger memory starting at MYADDR.   Copy to inferior if
700    WRITE is nonzero.
701   
702    Returns the length copied, which is either the LEN argument or zero.
703    This xfer function does not do partial moves, since child_ops
704    doesn't allow memory operations to cross below us in the target stack
705    anyway.  */
706
707 int
708 child_xfer_memory (memaddr, myaddr, len, write, target)
709      CORE_ADDR memaddr;
710      char *myaddr;
711      int len;
712      int write;
713      struct target_ops *target;         /* ignored */
714 {
715   register int i;
716   /* Round starting address down to longword boundary.  */
717   register CORE_ADDR addr = memaddr & - sizeof (PTRACE_XFER_TYPE);
718   /* Round ending address up; get number of longwords that makes.  */
719   register int count
720     = (((memaddr + len) - addr) + sizeof (PTRACE_XFER_TYPE) - 1)
721       / sizeof (PTRACE_XFER_TYPE);
722   /* Allocate buffer of that many longwords.  */
723   register PTRACE_XFER_TYPE *buffer
724     = (PTRACE_XFER_TYPE *) alloca (count * sizeof (PTRACE_XFER_TYPE));
725
726   if (write)
727     {
728       /* Fill start and end extra bytes of buffer with existing memory data.  */
729
730       if (addr != memaddr || len < (int) sizeof (PTRACE_XFER_TYPE)) {
731         /* Need part of initial word -- fetch it.  */
732         buffer[0] = ptrace (PT_RTEXT, inferior_pid, (PTRACE_ARG3_TYPE) addr,
733                             0);
734       }
735
736       if (count > 1)            /* FIXME, avoid if even boundary */
737         {
738           buffer[count - 1]
739             = ptrace (PT_RTEXT, inferior_pid,
740                       ((PTRACE_ARG3_TYPE)
741                        (addr + (count - 1) * sizeof (PTRACE_XFER_TYPE))),
742                       0);
743         }
744
745       /* Copy data to be written over corresponding part of buffer */
746
747       memcpy ((char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)),
748               myaddr,
749               len);
750
751       /* Write the entire buffer.  */
752
753       for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE))
754         {
755           errno = 0;
756           ptrace (PT_WDATA, inferior_pid, (PTRACE_ARG3_TYPE) addr,
757                   buffer[i]);
758           if (errno)
759             {
760               /* Using the appropriate one (I or D) is necessary for
761                  Gould NP1, at least.  */
762               errno = 0;
763               ptrace (PT_WTEXT, inferior_pid, (PTRACE_ARG3_TYPE) addr,
764                       buffer[i]);
765             }
766           if (errno)
767             return 0;
768         }
769     }
770   else
771     {
772       /* Read all the longwords */
773       for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE))
774         {
775           errno = 0;
776           buffer[i] = ptrace (PT_RTEXT, inferior_pid,
777                               (PTRACE_ARG3_TYPE) addr, 0);
778           if (errno)
779             return 0;
780           QUIT;
781         }
782
783       /* Copy appropriate bytes out of the buffer.  */
784       memcpy (myaddr,
785               (char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)),
786               len);
787     }
788   return len;
789 }
790
791
792 void
793 _initialize_symm_nat ()
794 {
795 #ifdef ATTACH_DETACH
796 /*
797  * the MPDEBUGGER is necessary for process tree debugging and attach
798  * to work, but it alters the behavior of debugged processes, so other
799  * things (at least child_wait()) will have to change to accomodate
800  * that.
801  *
802  * Note that attach is not implemented in dynix 3, and not in ptx
803  * until version 2.1 of the OS.
804  */
805         int rv;
806         sigset_t set;
807         struct sigaction sact;
808
809         rv = mptrace(XPT_MPDEBUGGER, 0, 0, 0);
810         if (-1 == rv) {
811                 fatal("_initialize_symm_nat(): mptrace(XPT_MPDEBUGGER): %s",
812                       safe_strerror(errno));
813         }
814
815         /*
816          * Under MPDEBUGGER, we get SIGCLHD when a traced process does
817          * anything of interest.
818          */
819
820         /*
821          * Block SIGCHLD.  We leave it blocked all the time, and then
822          * call sigsuspend() in child_wait() to wait for the child
823          * to do something.  None of these ought to fail, but check anyway.
824          */
825         sigemptyset(&set);
826         rv = sigaddset(&set, SIGCHLD);
827         if (-1 == rv) {
828                 fatal("_initialize_symm_nat(): sigaddset(SIGCHLD): %s",
829                       safe_strerror(errno));
830         }
831         rv = sigprocmask(SIG_BLOCK, &set, (sigset_t *)NULL);
832         if (-1 == rv) {
833                 fatal("_initialize_symm_nat(): sigprocmask(SIG_BLOCK): %s",
834                       safe_strerror(errno));
835         }
836
837         sact.sa_handler = sigchld_handler;
838         sigemptyset(&sact.sa_mask);
839         sact.sa_flags = SA_NOCLDWAIT; /* keep the zombies away */
840         rv = sigaction(SIGCHLD, &sact, (struct sigaction *)NULL);
841         if (-1 == rv) {
842                 fatal("_initialize_symm_nat(): sigaction(SIGCHLD): %s",
843                       safe_strerror(errno));
844         }
845 #endif
846 }