X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fproc-api.c;h=6904d1586ad1e2659f3ec41b6e61838a8aa0c10b;hb=65743aba62ae276dfb203e8771201e912545b0b5;hp=d881edc302d7ca271f9261a1d25232f4027986c9;hpb=37de36c6ed76ef0b5f31cff8fd5089dab7c3d136;p=deliverable%2Fbinutils-gdb.git
diff --git a/gdb/proc-api.c b/gdb/proc-api.c
index d881edc302..6904d1586a 100644
--- a/gdb/proc-api.c
+++ b/gdb/proc-api.c
@@ -1,23 +1,25 @@
/* Machine independent support for SVR4 /proc (process file system) for GDB.
- Copyright 1999, 2000, 2001 Free Software Foundation, Inc.
+
+ Copyright (C) 1999, 2000, 2001, 2003, 2005, 2007, 2008, 2009, 2010, 2011
+ Free Software Foundation, Inc.
+
Written by Michael Snyder at Cygnus Solutions.
Based on work by Fred Fish, Stu Grossman, Geoff Noer, and others.
-This file is part of GDB.
+ This file is part of GDB.
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software Foundation,
-Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see . */
/*
* Pretty-print trace of api calls to the /proc api
@@ -27,6 +29,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "defs.h"
#include "gdbcmd.h"
+#include "completer.h"
#if defined (NEW_PROC_API)
#define _STRUCTURED_PROC 1
@@ -35,19 +38,21 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include
#include
#include
+#ifdef HAVE_SYS_PROC_H
#include /* for struct proc */
+#endif
#ifdef HAVE_SYS_USER_H
#include /* for struct user */
#endif
-#include /* for O_RDWR etc. */
-#include
+#include /* for O_RDWR etc. */
+#include "gdb_wait.h"
#include "proc-utils.h"
/* Much of the information used in the /proc interface, particularly for
printing status information, is kept as tables of structures of the
following form. These tables can be used to map numeric values to
- their symbolic names and to a string that describes their specific use. */
+ their symbolic names and to a string that describes their specific use. */
struct trans {
long value; /* The numeric value */
@@ -219,7 +224,9 @@ static struct trans ioctl_table[] = {
int
ioctl_with_trace (int fd, long opcode, void *ptr, char *file, int line)
{
- int i, ret, arg1;
+ int i = 0;
+ int ret;
+ int arg1;
prepare_to_trace ();
@@ -392,9 +399,13 @@ static struct trans rw_table[] = {
#ifdef PCCSIG /* solaris */
{ PCCSIG, "PCCSIG", "clear current signal" },
#endif
+#ifdef PCDSTOP /* solaris */
{ PCDSTOP, "PCDSTOP", "post stop request" },
+#endif
{ PCKILL, "PCKILL", "post a signal" },
+#ifdef PCNICE /* solaris */
{ PCNICE, "PCNICE", "set nice priority" },
+#endif
#ifdef PCREAD /* solaris */
{ PCREAD, "PCREAD", "read from the address space" },
{ PCWRITE, "PCWRITE", "write to the address space" },
@@ -414,7 +425,9 @@ static struct trans rw_table[] = {
{ PCSEXIT, "PCSEXIT", "set traced syscall exit set" },
{ PCSFAULT, "PCSFAULT", "set traced fault set" },
{ PCSFPREG, "PCSFPREG", "set floating point registers" },
+#ifdef PCSHOLD /* solaris */
{ PCSHOLD, "PCSHOLD", "set signal mask" },
+#endif
{ PCSREG, "PCSREG", "set general registers" },
{ PCSSIG, "PCSSIG", "set current signal" },
{ PCSTOP, "PCSTOP", "post stop request and wait" },
@@ -428,7 +441,9 @@ static struct trans rw_table[] = {
#ifdef PCTWSTOP /* solaris */
{ PCTWSTOP, "PCTWSTOP", "wait for stop, with timeout arg" },
#endif
+#ifdef PCUNKILL /* solaris */
{ PCUNKILL, "PCUNKILL", "delete a pending signal" },
+#endif
#ifdef PCUNSET /* solaris */
{ PCUNSET, "PCUNSET", "unset modes" },
#endif
@@ -444,7 +459,7 @@ static off_t lseek_offset;
int
write_with_trace (int fd, void *varg, size_t len, char *file, int line)
{
- int i;
+ int i = ARRAY_SIZE (rw_table) - 1;
int ret;
procfs_ctl_t *arg = (procfs_ctl_t *) varg;
@@ -513,12 +528,14 @@ write_with_trace (int fd, void *varg, size_t len, char *file, int line)
proc_prettyfprint_syscalls (procfs_file ? procfs_file : stdout,
(sysset_t *) &arg[1], 0);
break;
+#ifdef PCSHOLD
case PCSHOLD:
fprintf (procfs_file ? procfs_file : stdout,
"write (PCSHOLD) ");
proc_prettyfprint_signalset (procfs_file ? procfs_file : stdout,
(sigset_t *) &arg[1], 0);
break;
+#endif
case PCSSIG:
fprintf (procfs_file ? procfs_file : stdout,
"write (PCSSIG) ");
@@ -537,10 +554,14 @@ write_with_trace (int fd, void *varg, size_t len, char *file, int line)
fprintf (procfs_file ? procfs_file : stdout, "clearFlt ");
if (arg[1] & PRSTEP)
fprintf (procfs_file ? procfs_file : stdout, "step ");
+#ifdef PRSABORT
if (arg[1] & PRSABORT)
fprintf (procfs_file ? procfs_file : stdout, "syscallAbort ");
+#endif
+#ifdef PRSTOP
if (arg[1] & PRSTOP)
fprintf (procfs_file ? procfs_file : stdout, "stopReq ");
+#endif
fprintf (procfs_file ? procfs_file : stdout, "\n");
break;
@@ -553,16 +574,6 @@ write_with_trace (int fd, void *varg, size_t len, char *file, int line)
break;
default:
{
-#ifdef BREAKPOINT
- static unsigned char break_insn[] = BREAKPOINT;
-
- if (len == sizeof (break_insn) &&
- memcmp (arg, &break_insn, len) == 0)
- fprintf (procfs_file ? procfs_file : stdout,
- "write () \n",
- (unsigned long) lseek_offset);
- else
-#endif
if (rw_table[i].name)
fprintf (procfs_file ? procfs_file : stdout,
"write (%s) %s\n",
@@ -736,7 +747,7 @@ procfs_note (char *msg, char *file, int line)
if (info_verbose)
fprintf (procfs_file ? procfs_file : stdout,
"%s:%d -- ", file, line);
- fprintf (procfs_file ? procfs_file : stdout, msg);
+ fprintf (procfs_file ? procfs_file : stdout, "%s", msg);
if (procfs_file)
fflush (procfs_file);
}
@@ -769,18 +780,17 @@ _initialize_proc_api (void)
{
struct cmd_list_element *c;
- c = add_set_cmd ("procfs-trace", no_class,
- var_boolean, (char *) &procfs_trace,
- "Set tracing for /proc api calls.\n", &setlist);
-
- add_show_from_set (c, &showlist);
- c->function.sfunc = set_procfs_trace_cmd;
- c->completer = filename_completer;
-
- c = add_set_cmd ("procfs-file", no_class, var_filename,
- (char *) &procfs_filename,
- "Set filename for /proc tracefile.\n", &setlist);
-
- add_show_from_set (c, &showlist);
- c->function.sfunc = set_procfs_file_cmd;
+ add_setshow_boolean_cmd ("procfs-trace", no_class, &procfs_trace, _("\
+Set tracing for /proc api calls."), _("\
+Show tracing for /proc api calls."), NULL,
+ set_procfs_trace_cmd,
+ NULL, /* FIXME: i18n: */
+ &setlist, &showlist);
+
+ add_setshow_filename_cmd ("procfs-file", no_class, &procfs_filename, _("\
+Set filename for /proc tracefile."), _("\
+Show filename for /proc tracefile."), NULL,
+ set_procfs_file_cmd,
+ NULL, /* FIXME: i18n: */
+ &setlist, &showlist);
}