* README: Add note about SPARCworks cc release 3.0 and higher.
authorPeter Schauer <Peter.Schauer@mytum.de>
Thu, 12 Jan 1995 18:12:04 +0000 (18:12 +0000)
committerPeter Schauer <Peter.Schauer@mytum.de>
Thu, 12 Jan 1995 18:12:04 +0000 (18:12 +0000)
Add procfs support for Alpha OSF/1-2.x.
* config/alpha/nm-osf.h:  Renamed from nm-alpha.h, generic
OSF/1 native support.
* config/alpha/alpha-osf1.mh (NAT_FILE):  Changed accordingly.
(MUNCH_DEFINE):  Removed.
* config/alpha/alpha-osf2.mh, config/alpha/nm-osf2.h:  New files
for procfs support.
* configure.in (alpha-dec-osf*):  Use alpha-osf2.mh for OSF/1
release 2.x and higher, else alpha-osf1.mh, as the procfs support
in release 1.x is incomplete.
* Makefile.in (ALLCONFIG):  Add config/alpha/alpha-osf2.mh.
* alpha-nat.c (supply_gregset, fill_gregset, supply_fpgregset,
fill_fpgregset):  New routines for procfs support.
* inftarg.c (_initialize_inftarg):  Don't add ptrace support
if we have an optional procfs and /proc is accessible.
* procfs.c:  Include sys/fault.h and sys/syscall.h before
including sys/procfs.h.
(unconditionally_kill_inferior):  If PROCFS_NEED_PIOCSSIG_FOR_KILL
is defined, additionally perform a PIOCSSIG to really terminate
the inferior.
(create_procinfo):  Always return a result.
(create_procinfo, do_attach):  Don't trace T_IFAULT faults if
PROCFS_DONT_TRACE_IFAULT is defined.
(procfs_init_inferior):  Use START_INFERIOR_TRAPS_EXPECTED as
argument to startup_inferior if it is defined.
(proc_set_exec_trap):  If PIOCSSPCACT is defined, use it instead
of tracing exits from exec system calls. Needed for the user level
loader under Alpha OSF/1.
(do_detach):  Clear any pending signal if we want to detach from
a process without a signal.
(set_proc_siginfo):  If PROCFS_DONT_PIOCSSIG_CURSIG is defined,
don't issue a PIOCSSIG if pr_cursig already contains the signal we
intend to set.
(info_proc_signals):  If PROCFS_SIGPEND_OFFSET is defined, the
pending signals are numbered from 1 instead of 0.
(info_proc_mappings):  Increase size of output format for addresses
if BFD_HOST_64_BIT is defined.
(procfs_stop):  Renamed from child_stop.
(_initialize_procfs):  Don't add procfs support if we have an
optional procfs and /proc is not accessible.

gdb/ChangeLog
gdb/Makefile.in
gdb/NEWS
gdb/alpha-nat.c
gdb/configure.in
gdb/procfs.c

index 902f34cf208416b0ee418cfab76e2964ce863f17..fd0ff2ac2f324c1d5740b71351fd7ebdab34bd4e 100644 (file)
@@ -1,3 +1,48 @@
+Thu Jan 12 09:33:24 1995  Peter Schauer  (pes@regent.e-technik.tu-muenchen.de)
+
+       * README:  Add note about SPARCworks cc release 3.0 and higher.
+
+       Add procfs support for Alpha OSF/1-2.x.
+       * config/alpha/nm-osf.h:  Renamed from nm-alpha.h, generic
+       OSF/1 native support.
+       * config/alpha/alpha-osf1.mh (NAT_FILE):  Changed accordingly.
+       (MUNCH_DEFINE):  Removed.
+       * config/alpha/alpha-osf2.mh, config/alpha/nm-osf2.h:  New files
+       for procfs support.
+       * configure.in (alpha-dec-osf*):  Use alpha-osf2.mh for OSF/1
+       release 2.x and higher, else alpha-osf1.mh, as the procfs support
+       in release 1.x is incomplete.
+       * Makefile.in (ALLCONFIG):  Add config/alpha/alpha-osf2.mh.
+       * alpha-nat.c (supply_gregset, fill_gregset, supply_fpgregset,
+       fill_fpgregset):  New routines for procfs support.
+       * inftarg.c (_initialize_inftarg):  Don't add ptrace support
+       if we have an optional procfs and /proc is accessible.
+       * procfs.c:  Include sys/fault.h and sys/syscall.h before
+       including sys/procfs.h.
+       (unconditionally_kill_inferior):  If PROCFS_NEED_PIOCSSIG_FOR_KILL
+       is defined, additionally perform a PIOCSSIG to really terminate
+       the inferior.
+       (create_procinfo):  Always return a result.
+       (create_procinfo, do_attach):  Don't trace T_IFAULT faults if
+       PROCFS_DONT_TRACE_IFAULT is defined.
+       (procfs_init_inferior):  Use START_INFERIOR_TRAPS_EXPECTED as
+       argument to startup_inferior if it is defined.
+       (proc_set_exec_trap):  If PIOCSSPCACT is defined, use it instead
+       of tracing exits from exec system calls. Needed for the user level
+       loader under Alpha OSF/1.
+       (do_detach):  Clear any pending signal if we want to detach from
+       a process without a signal.
+       (set_proc_siginfo):  If PROCFS_DONT_PIOCSSIG_CURSIG is defined,
+       don't issue a PIOCSSIG if pr_cursig already contains the signal we
+       intend to set.
+       (info_proc_signals):  If PROCFS_SIGPEND_OFFSET is defined, the
+       pending signals are numbered from 1 instead of 0.
+       (info_proc_mappings):  Increase size of output format for addresses
+       if BFD_HOST_64_BIT is defined.
+       (procfs_stop):  Renamed from child_stop.
+       (_initialize_procfs):  Don't add procfs support if we have an
+       optional procfs and /proc is not accessible.
+
 Wed Jan 11 17:06:55 1995  Stu Grossman  (grossman@cygnus.com)
 
        * gdbtk.tcl:  Add button to control mixed source disassembly.
index 4b7d8eb78f554a86aef8ea63606f6fb6889caf8f..4650493eee4b2a23547b199d1c1d84c4008077ab 100644 (file)
@@ -1,4 +1,5 @@
-# Copyright 1989, 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
+# Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1995
+# Free Software Foundation, Inc.
 
 # This file is part of GDB.
 
@@ -906,8 +907,8 @@ ALLDEPFILES = 29k-share/udi/udip2soc.c 29k-share/udi/udr.c \
 
 ALLCONFIG = config/a29k/a29k-kern.mt config/a29k/a29k-udi.mt \
        config/a29k/a29k.mt config/a29k/ultra3.mh config/a29k/ultra3.mt \
-       config/alpha/alpha-osf1.mh config/alpha/alpha-osf1.mt \
-       config/alpha/alpha-nw.mt \
+       config/alpha/alpha-osf1.mh config/alpha/alpha-osf2.mh \
+       config/alpha/alpha-osf1.mt config/alpha/alpha-nw.mt \
        config/arm/arm.mh config/arm/arm.mt config/convex/convex.mh \
        config/convex/convex.mt config/gould/np1.mh config/gould/np1.mt \
        config/gould/pn.mh config/gould/pn.mt config/h8300/h8300hms.mt \
index 0af1c67cfcf8c033e6f3ba7e8337fe460964868d..effa051ee4037f31ed9daddfb3fcc23b4af6b8dd 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -1,6 +1,14 @@
                What has changed since GDB-3.5?
                (Organized release by release)
 
+* Alpha OSF/1 support for procfs
+
+GDB now supports procfs under OSF/1-2.x and higher, which makes it
+possible to attach to running processes.  As the mounting of the /proc
+filesystem is optional on the Alpha, GDB automatically determines
+the availability of /proc during startup.  This can lead to problems
+if /proc is unmounted after GDB has been started.
+
 * User commands may accept up to 10 arguments separated by whitespace.
 Arguments are accessed within the user command via $arg0..$arg0.
 A trivial example:
index a0c53991f4d9dec42be9febdd0a7282e43c781e3..4d91fe8d3d3f0d1230487df53e5d50b985d4c461 100644 (file)
@@ -1,5 +1,5 @@
 /* Low level Alpha interface, for GDB when running native.
-   Copyright 1993 Free Software Foundation, Inc.
+   Copyright 1993, 1995 Free Software Foundation, Inc.
 
 This file is part of GDB.
 
@@ -142,3 +142,74 @@ register_addr (regno, blockend)
 {
   return REGISTER_PTRACE_ADDR (regno);
 }
+
+#ifdef USE_PROC_FS
+#include <sys/procfs.h>
+
+/*
+ * See the comment in m68k-tdep.c regarding the utility of these functions.
+ */
+
+void 
+supply_gregset (gregsetp)
+     gregset_t *gregsetp;
+{
+  register int regi;
+  register long *regp = gregsetp->regs;
+
+  for (regi = 0; regi < 31; regi++)
+    supply_register (regi, (char *)(regp + regi));
+
+  supply_register (PC_REGNUM, (char *)(regp + 31));
+}
+
+void
+fill_gregset (gregsetp, regno)
+     gregset_t *gregsetp;
+     int regno;
+{
+  int regi;
+  register long *regp = gregsetp->regs;
+
+  for (regi = 0; regi < 31; regi++)
+    if ((regno == -1) || (regno == regi))
+      *(regp + regi) = *(long *) &registers[REGISTER_BYTE (regi)];
+
+  if ((regno == -1) || (regno == PC_REGNUM))
+    *(regp + 31) = *(long *) &registers[REGISTER_BYTE (PC_REGNUM)];
+}
+
+/*
+ * Now we do the same thing for floating-point registers.
+ * Again, see the comments in m68k-tdep.c.
+ */
+
+void
+supply_fpregset (fpregsetp)
+     fpregset_t *fpregsetp;
+{
+  register int regi;
+  register long *regp = fpregsetp->regs;
+
+  for (regi = 0; regi < 32; regi++)
+    supply_register (regi + FP0_REGNUM, (char *)(regp + regi));
+}
+
+void
+fill_fpregset (fpregsetp, regno)
+     fpregset_t *fpregsetp;
+     int regno;
+{
+  int regi;
+  register long *regp = fpregsetp->regs;
+
+  for (regi = FP0_REGNUM; regi < FP0_REGNUM + 32; regi++)
+    {
+      if ((regno == -1) || (regno == regi))
+       {
+         *(regp + regi - FP0_REGNUM) =
+           *(long *) &registers[REGISTER_BYTE (regi)];
+       }
+    }
+}
+#endif
index 0fed66c0a67c9acdbd10d05bf4cf76c1b77c530d..c9e08191aa4080d2afac4f55b058e4af4e8017a4 100644 (file)
@@ -32,7 +32,8 @@ case "${host}" in
 
 a29k-*-*)              gdb_host=ultra3 ;;
 
-alpha-*-osf*)          gdb_host=alpha-osf1 ;;
+alpha-*-osf1*)         gdb_host=alpha-osf1 ;;
+alpha-*-osf[23456789]*)        gdb_host=alpha-osf2 ;;
 
 arm-*-*)               gdb_host=arm ;;
 
index 0f75191bb71e1a493dc54de583e01949a6512cfd..bcae876592ed18572138f957459b21c4822aaa24 100644 (file)
@@ -1,5 +1,5 @@
 /* Machine independent support for SVR4 /proc (process file system) for GDB.
-   Copyright 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
+   Copyright 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
    Written by Fred Fish at Cygnus Support.
 
 This file is part of GDB.
@@ -36,6 +36,8 @@ regardless of whether or not the actual target has floating point hardware.
 
 #include <sys/types.h>
 #include <time.h>
+#include <sys/fault.h>
+#include <sys/syscall.h>
 #include <sys/procfs.h>
 #include <fcntl.h>
 #include <errno.h>
@@ -1278,6 +1280,26 @@ unconditionally_kill_inferior (pi)
 
   signo = SIGKILL;
   ioctl (pi->fd, PIOCKILL, &signo);
+
+#ifdef PROCFS_NEED_PIOCSSIG_FOR_KILL
+  /* Alpha OSF/1 procfs needs an additional PIOCSSIG call with
+     a SIGKILL signal to kill the inferior, otherwise it might remain
+     stopped with a pending SIGKILL.
+     We do not check the result of the PIOCSSIG, the inferior might have
+     died already.  */
+  {
+    struct siginfo newsiginfo;
+
+    memset ((char *) &newsiginfo, 0, sizeof (newsiginfo));
+    newsiginfo.si_signo = signo;
+    newsiginfo.si_code = 0;
+    newsiginfo.si_errno = 0;
+    newsiginfo.si_pid = getpid ();
+    newsiginfo.si_uid = getuid ();
+    ioctl (pi->fd, PIOCSSIG, &newsiginfo);
+  }
+#endif
+
   close_proc_file (pi);
 
 /* Only wait() for our direct children.  Our grandchildren zombies are killed
@@ -1444,8 +1466,9 @@ create_procinfo (pid)
 {
   struct procinfo *pi;
 
-  if (find_procinfo (pid, 1))
-    return;                    /* All done!  It already exists */
+  pi = find_procinfo (pid, 1);
+  if (pi != NULL)
+    return pi;                 /* All done!  It already exists */
 
   pi = (struct procinfo *) xmalloc (sizeof (struct procinfo));
 
@@ -1465,6 +1488,14 @@ create_procinfo (pid)
   prfillset (&pi->prrun.pr_fault);
   prdelset (&pi->prrun.pr_fault, FLTPAGE);
 
+#ifdef PROCFS_DONT_TRACE_IFAULT
+  /* Tracing T_IFAULT under Alpha OSF/1 causes a `floating point enable'
+     fault from which we cannot continue (except by disabling the
+     tracing). We rely on the delivery of a SIGTRAP signal (which is traced)
+     for the other T_IFAULT faults if tracing them is disabled.  */
+  prdelset (&pi->prrun.pr_fault, T_IFAULT);
+#endif
+
   if (ioctl (pi->fd, PIOCWSTOP, &pi->prstatus) < 0)
     proc_init_failed (pi, "PIOCWSTOP failed");
 
@@ -1509,8 +1540,12 @@ procfs_init_inferior (pid)
   create_procinfo (pid);
   add_thread (pid);            /* Setup initial thread */
 
+#ifdef START_INFERIOR_TRAPS_EXPECTED
+  startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
+#else
   /* One trap to exec the shell, one to exec the program being debugged.  */
   startup_inferior (2);
+#endif
 }
 
 /*
@@ -1615,6 +1650,27 @@ proc_set_exec_trap ()
   premptyset (&exitset);
   premptyset (&entryset);
 
+#ifdef PIOCSSPCACT
+  /* Under Alpha OSF/1 we have to use a PIOCSSPCACT ioctl to trace
+     exits from exec system calls because of the user level loader.  */
+  {
+    int prfs_flags;
+
+    if (ioctl (fd, PIOCGSPCACT, &prfs_flags) < 0)
+      {
+       perror (procname);
+       gdb_flush (gdb_stderr);
+       _exit (127);
+      }
+    prfs_flags |= PRFS_STOPEXEC;
+    if (ioctl (fd, PIOCSSPCACT, &prfs_flags) < 0)
+      {
+       perror (procname);
+       gdb_flush (gdb_stderr);
+       _exit (127);
+      }
+  }
+#else
   /* GW: Rationale...
      Not all systems with /proc have all the exec* syscalls with the same
      names.  On the SGI, for example, there is no SYS_exec, but there
@@ -1636,6 +1692,7 @@ proc_set_exec_trap ()
       gdb_flush (gdb_stderr);
       _exit (127);
     }
+#endif
 
   praddset (&entryset, SYS_exit);
 
@@ -2037,6 +2094,15 @@ do_attach (pid)
   procfs_notice_signals (pid);
   prfillset (&pi->prrun.pr_fault);
   prdelset (&pi->prrun.pr_fault, FLTPAGE);
+
+#ifdef PROCFS_DONT_TRACE_IFAULT
+  /* Tracing T_IFAULT under Alpha OSF/1 causes a `floating point enable'
+     fault from which we cannot continue (except by disabling the
+     tracing). We rely on the delivery of a SIGTRAP signal (which is traced)
+     for the other T_IFAULT faults if tracing them is disabled.  */
+  prdelset (&pi->prrun.pr_fault, T_IFAULT);
+#endif
+
   if (ioctl (pi->fd, PIOCSFAULT, &pi->prrun.pr_fault))
     {
       print_sys_errmsg ("PIOCSFAULT failed", errno);
@@ -2128,6 +2194,11 @@ do_detach (signal)
          if (signal || !pi->was_stopped ||
              query ("Was stopped when attached, make it runnable again? "))
            {
+             /* Clear any pending signal if we want to detach without
+                a signal.  */
+             if (signal == 0)
+               set_proc_siginfo (pi, signal);
+
              /* Clear any fault that might have stopped it.  */
              if (ioctl (pi->fd, PIOCCFAULT, 0))
                {
@@ -2475,6 +2546,14 @@ set_proc_siginfo (pip, signo)
   struct siginfo newsiginfo;
   struct siginfo *sip;
 
+#ifdef PROCFS_DONT_PIOCSSIG_CURSIG
+  /* With Alpha OSF/1 procfs, the kernel gets really confused if it
+     receives a PIOCSSSIG with a signal identical to the current signal,
+     it messes up the current signal. Work around the kernel bug.  */
+  if (signo == pip -> prstatus.pr_cursig)
+    return;
+#endif
+
   if (signo == pip -> prstatus.pr_info.si_signo)
     {
       sip = &pip -> prstatus.pr_info;
@@ -3142,9 +3221,19 @@ info_proc_signals (pip, summary)
          printf_filtered ("%-8s ",
                           prismember (&pip -> prstatus.pr_sighold, signo)
                           ? "on" : "off");
+
+#ifdef PROCFS_SIGPEND_OFFSET
+         /* Alpha OSF/1 numbers the pending signals from 1.  */
+         printf_filtered ("%-8s ",
+                          (signo ? prismember (&pip -> prstatus.pr_sigpend,
+                                               signo - 1)
+                                 : 0)
+                          ? "yes" : "no");
+#else
          printf_filtered ("%-8s ",
                           prismember (&pip -> prstatus.pr_sigpend, signo)
                           ? "yes" : "no");
+#endif
          printf_filtered (" %s\n", safe_strsignal (signo));
        }
       printf_filtered ("\n");
@@ -3193,7 +3282,11 @@ info_proc_mappings (pip, summary)
   if (!summary)
     {
       printf_filtered ("Mapped address spaces:\n\n");
+#ifdef BFD_HOST_64_BIT
+      printf_filtered ("  %18s %18s %10s %10s %7s\n",
+#else
       printf_filtered ("\t%10s %10s %10s %10s %7s\n",
+#endif
                       "Start Addr",
                       "  End Addr",
                       "      Size",
@@ -3206,9 +3299,14 @@ info_proc_mappings (pip, summary)
            {
              for (prmap = prmaps; prmap -> pr_size; ++prmap)
                {
-                 printf_filtered ("\t%#10x %#10x %#10x %#10x %7s\n",
-                                  prmap -> pr_vaddr,
-                                  prmap -> pr_vaddr + prmap -> pr_size - 1,
+#ifdef BFD_HOST_64_BIT
+                 printf_filtered ("  %#18lx %#18lx %#10x %#10x %7s\n",
+#else
+                 printf_filtered ("\t%#10lx %#10lx %#10x %#10x %7s\n",
+#endif
+                                  (unsigned long)prmap -> pr_vaddr,
+                                  (unsigned long)prmap -> pr_vaddr
+                                    + prmap -> pr_size - 1,
                                   prmap -> pr_size,
                                   prmap -> pr_off,
                                   mappingflags (prmap -> pr_mflags));
@@ -3663,7 +3761,7 @@ procfs_stopped_by_watchpoint(pid)
    killpg() instead of kill (-pgrp). */
 
 void
-child_stop ()
+procfs_stop ()
 {
   extern pid_t inferior_process_group;
 
@@ -3700,7 +3798,7 @@ struct target_ops procfs_ops = {
   procfs_mourn_inferior,       /* to_mourn_inferior */
   procfs_can_run,              /* to_can_run */
   procfs_notice_signals,       /* to_notice_signals */
-  child_stop,                  /* to_stop */
+  procfs_stop,                 /* to_stop */
   process_stratum,             /* to_stratum */
   0,                           /* to_next */
   1,                           /* to_has_all_memory */
@@ -3716,6 +3814,19 @@ struct target_ops procfs_ops = {
 void
 _initialize_procfs ()
 {
+#ifdef HAVE_OPTIONAL_PROC_FS
+  char procname[32];
+  int fd;
+
+  /* If we have an optional /proc filesystem (e.g. under OSF/1),
+     don't add procfs support if we cannot access the running
+     GDB via /proc.  */
+  sprintf (procname, PROC_NAME_FMT, getpid ());
+  if ((fd = open (procname, O_RDONLY)) < 0)
+    return;
+  close (fd);
+#endif
+
   add_target (&procfs_ops);
 
   add_info ("proc", info_proc,