mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-15 04:31:49 +08:00
44122162ae
This is the previously mentioned patch to get rid of unstructured/ioctl-based procfs support in procfs.c. Given that support for structured procfs was introduced in Solaris 2.6 back in 1997 and we're just removing support for Solaris < 10, there's no point in carrying that baggage (and tons of support for IRIX and OSF/1 as well) around any longer. Most of the patch should be straightforward (removing support for !NEW_PROC_API, non-Solaris OSes and pre-Solaris 10 quirks). Only a few points need explanations: * <sys/syscall.h> was already included unconditionally in most places, so there's no need to have guards in a few remaining ones. * configure.host already obsoletes i?86-*-sysv4.2, i?86-*-sysv5, so NEW_PROC_API detection for those in configure.ac can go. * I'm still including <sys/procfs.h> with #define _STRUCTURED_PROC 1. Theoretically, it would be better to include <procfs.h> on Solaris (which includes that define), but that breaks the build over <procfs.h> vs. gdb's "procfs.h", and doesn't exist on Linux. * I've regenerated syscall_table[] in proc-events.c with a small script from Solaris 10, 11.3, 11.4 <sys/syscall.h>, so there should be no traces of older Solaris versions and other OSes left. * prsysent_t and DYNAMIC_SYSCALLS was only used for AIX 5, but AIX doesn't use procfs.c any longer, so all related code can go. The patch was generated with diff -w so one can easier see changes without being distracted by simple reindentations. So far, it has only been compiled and smoke-tested on amd64-pc-solaris2.1[01], sparcv9-sun-solaris2.1[01], and x86_64-pc-linux-gnu. Certainly needs more testing (Solaris 11.3 vs. 11.4, 32-bit gdb, testsuite once I've figured out what's wrong on Solaris 10 etc.), but it's enough to get a first impression how much cleanup is possible here. * configure.ac Don't check for sys/fault.h, sys/syscall.h, sys/proc.h. (NEW_PROC_API): Remove. (prsysent_t, pr_sigset_t, pr_sigaction64_t, pr_siginfo64_t): Likewise. * common/common.m4 (GDB_AC_COMMON): Don't check for sys/syscall.h. * configure: Regenerate. * config.in: Regenerate. * gdbserver/configure: Regenerate. * gdbserver/config.in: Regenerate. * i386-sol2-nat.c (_initialize_amd64_sol2_nat): Remove NEW_PROC_API test. * sparc-sol2-nat.c (_initialize_sparc_sol2_nat): Likewise. * linux-btrace.c: Remove HAVE_SYS_SYSCALL_H test. * proc-api.c: Remove !NEW_PROC_API support. Remove HAVE_SYS_PROC_H and HAVE_SYS_USER_H tests. Remove tests for macros always defined on Solaris. * proc-events.c: Remove !NEW_PROC_API support. Remove Remove HAVE_SYS_SYSCALL_H, HAVE_SYS_PROC_H and HAVE_SYS_USER_H tests. (init_syscall_table): Remove non-Solaris syscalls. Remove tests for syscalls present on all Solaris versions. Add missing Solaris 10+ syscalls. (signal_table): Remove non-Solaris signals. Remove tests for signals present on all Solaris versions. (fault_table): Remove non-Solaris faults. Remove tests for faults present on all Solaris versions. * proc-flags.c: Remove !NEW_PROC_API support. (pr_flag_table): Remove non-Solaris and pre-Solaris 7 comments. Remove non-Solaris flags. * proc-why.c: Remove !NEW_PROC_API support. (pr_why_table): Remove meaningless comments. Remove tests for reasons present on all Solaris versions. Remove OSF/1 cases. (proc_prettyfprint_why): Likewise. * procfs.c: Remove !NEW_PROC_API and DYNAMIC_SYSCALLS support. Remove HAVE_SYS_FAULT_H and HAVE_SYS_SYSCALL_H tests. Remove WA_READ test, IRIX watchpoint support. (gdb_sigset_t, gdb_sigaction_t, gdb_siginfo_t): Replace by base types. Change users. (gdb_praddset, gdb_prdelset, gdb_premptysysset, gdb_praddsysset) (gdb_prdelset, gdb_pr_issyssetmember): Replace by base macros. Change callers. Remove CTL_PROC_NAME_FMT tests. (gdb_prstatus_t, gdb_lwpstatus_t): Replace by base types. Change users. (sysset_t_size): Remove. Use sizeof (sysset_t) in callers. Remove PROCFS_DONT_PIOCSSIG_CURSIG support. (proc_modify_flag): Replace GDBRESET by PCUNSET. Remove PR_ASYNC, PR_KLC tests. (proc_unset_inherit_on_fork): Remove PR_ASYNC test. (proc_parent_pid): Remove PCWATCH etc. tests. (proc_set_watchpoint): Remove !PCWATCH && !PIOCSWATCH support. Remove PCAGENT test. (proc_get_nthreads) [PIOCNTHR && PIOCTLIST]: Remove. Remove SYS_lwpcreate || SYS_lwp_create test. (proc_get_current_thread): Likewise. [PIOCNTHR && PIOCTLIST]: Remove. [PIOCLSTATUS]: Remove. (procfs_debug_inferior): Remove non-Solaris cases, conditionals. [PRFS_STOPEXEC]: Remove. (syscall_is_lwp_exit): Remove non-Solaris cases, conditionals. (syscall_is_exit): Likewise. (syscall_is_exec): Likewise. (syscall_is_lwp_create): Likewise. Remove SYS_syssgi support. (procfs_wait): Remove PR_ASYNC, !PIOCSSPCACT tests. [SYS_syssgi]: Remove. Remove non-Solaris cases, conditionals. (unconditionally_kill_inferior) [PROCFS_NEED_PIOCSSIG_FOR_KILL]: Remove. (procfs_init_inferior) [SYS_syssgi]: Remove. (procfs_set_exec_trap) [PRFS_STOPEXEC]: Remove. (procfs_inferior_created) [SYS_syssgi]: Remove. (procfs_set_watchpoint): Remove !AIX5 test. (procfs_stopped_by_watchpoint): Remove FLTWATCH test, FLTKWATCH case. (mappingflags) [MA_PHYS]: Remove. (info_mappings_callback): Remove PCAGENT test. Remove PIOCOPENLWP || PCAGENT test.
768 lines
23 KiB
C
768 lines
23 KiB
C
/* Machine-independent support for Solaris /proc (process file system)
|
||
|
||
Copyright (C) 1999-2017 Free Software Foundation, Inc.
|
||
|
||
Written by Michael Snyder at Cygnus Solutions.
|
||
Based on work by Fred Fish, Stu Grossman, Geoff Noer, and others.
|
||
|
||
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.
|
||
|
||
You should have received a copy of the GNU General Public License
|
||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||
|
||
/* Pretty-print "events of interest".
|
||
|
||
This module includes pretty-print routines for:
|
||
* faults (hardware exceptions)
|
||
* signals (software interrupts)
|
||
* syscalls
|
||
|
||
FIXME: At present, the syscall translation table must be
|
||
initialized, which is not true of the other translation tables. */
|
||
|
||
#include "defs.h"
|
||
|
||
#define _STRUCTURED_PROC 1
|
||
|
||
#include <sys/types.h>
|
||
#include <sys/procfs.h>
|
||
#include <sys/syscall.h>
|
||
#include <sys/fault.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. */
|
||
|
||
struct trans
|
||
{
|
||
int value; /* The numeric value. */
|
||
const char *name; /* The equivalent symbolic value. */
|
||
const char *desc; /* Short description of value. */
|
||
};
|
||
|
||
|
||
/* Pretty print syscalls. */
|
||
|
||
/* Syscall translation table. */
|
||
|
||
#define MAX_SYSCALLS 262 /* Pretty arbitrary. */
|
||
static const char *syscall_table[MAX_SYSCALLS];
|
||
|
||
static void
|
||
init_syscall_table (void)
|
||
{
|
||
syscall_table[SYS_accept] = "accept";
|
||
#ifdef SYS_access
|
||
syscall_table[SYS_access] = "access";
|
||
#endif
|
||
syscall_table[SYS_acct] = "acct";
|
||
syscall_table[SYS_acctctl] = "acctctl";
|
||
syscall_table[SYS_acl] = "acl";
|
||
#ifdef SYS_adi
|
||
syscall_table[SYS_adi] = "adi";
|
||
#endif
|
||
syscall_table[SYS_adjtime] = "adjtime";
|
||
syscall_table[SYS_alarm] = "alarm";
|
||
syscall_table[SYS_auditsys] = "auditsys";
|
||
syscall_table[SYS_autofssys] = "autofssys";
|
||
syscall_table[SYS_bind] = "bind";
|
||
syscall_table[SYS_brand] = "brand";
|
||
syscall_table[SYS_brk] = "brk";
|
||
syscall_table[SYS_chdir] = "chdir";
|
||
#ifdef SYS_chmod
|
||
syscall_table[SYS_chmod] = "chmod";
|
||
#endif
|
||
#ifdef SYS_chown
|
||
syscall_table[SYS_chown] = "chown";
|
||
#endif
|
||
syscall_table[SYS_chroot] = "chroot";
|
||
syscall_table[SYS_cladm] = "cladm";
|
||
syscall_table[SYS_clock_getres] = "clock_getres";
|
||
syscall_table[SYS_clock_gettime] = "clock_gettime";
|
||
syscall_table[SYS_clock_settime] = "clock_settime";
|
||
syscall_table[SYS_close] = "close";
|
||
syscall_table[SYS_connect] = "connect";
|
||
syscall_table[SYS_context] = "context";
|
||
syscall_table[SYS_corectl] = "corectl";
|
||
syscall_table[SYS_cpc] = "cpc";
|
||
#ifdef SYS_creat
|
||
syscall_table[SYS_creat] = "creat";
|
||
#endif
|
||
#ifdef SYS_creat64
|
||
syscall_table[SYS_creat64] = "creat64";
|
||
#endif
|
||
syscall_table[SYS_door] = "door";
|
||
#ifdef SYS_dup
|
||
syscall_table[SYS_dup] = "dup";
|
||
#endif
|
||
#ifdef SYS_evsys
|
||
syscall_table[SYS_evsys] = "evsys";
|
||
#endif
|
||
#ifdef SYS_evtrapret
|
||
syscall_table[SYS_evtrapret] = "evtrapret";
|
||
#endif
|
||
syscall_table[SYS_exacctsys] = "exacctsys";
|
||
#ifdef SYS_exec
|
||
syscall_table[SYS_exec] = "exec";
|
||
#endif
|
||
syscall_table[SYS_execve] = "execve";
|
||
syscall_table[SYS_exit] = "exit";
|
||
#ifdef SYS_faccessat
|
||
syscall_table[SYS_faccessat] = "faccessat";
|
||
#endif
|
||
syscall_table[SYS_facl] = "facl";
|
||
syscall_table[SYS_fchdir] = "fchdir";
|
||
#ifdef SYS_fchmod
|
||
syscall_table[SYS_fchmod] = "fchmod";
|
||
#endif
|
||
#ifdef SYS_fchmodat
|
||
syscall_table[SYS_fchmodat] = "fchmodat";
|
||
#endif
|
||
#ifdef SYS_fchown
|
||
syscall_table[SYS_fchown] = "fchown";
|
||
#endif
|
||
#ifdef SYS_fchownat
|
||
syscall_table[SYS_fchownat] = "fchownat";
|
||
#endif
|
||
syscall_table[SYS_fchroot] = "fchroot";
|
||
syscall_table[SYS_fcntl] = "fcntl";
|
||
syscall_table[SYS_fdsync] = "fdsync";
|
||
#ifdef SYS_fork1
|
||
syscall_table[SYS_fork1] = "fork1";
|
||
#endif
|
||
#ifdef SYS_forkall
|
||
syscall_table[SYS_forkall] = "forkall";
|
||
#endif
|
||
#ifdef SYS_forksys
|
||
syscall_table[SYS_forksys] = "forksys";
|
||
#endif
|
||
syscall_table[SYS_fpathconf] = "fpathconf";
|
||
#ifdef SYS_frealpathat
|
||
syscall_table[SYS_frealpathat] = "frealpathat";
|
||
#endif
|
||
#ifdef SYS_fsat
|
||
syscall_table[SYS_fsat] = "fsat";
|
||
#endif
|
||
#ifdef SYS_fstat
|
||
syscall_table[SYS_fstat] = "fstat";
|
||
#endif
|
||
#ifdef SYS_fstat64
|
||
syscall_table[SYS_fstat64] = "fstat64";
|
||
#endif
|
||
#ifdef SYS_fstatat
|
||
syscall_table[SYS_fstatat] = "fstatat";
|
||
#endif
|
||
#ifdef SYS_fstatat64
|
||
syscall_table[SYS_fstatat64] = "fstatat64";
|
||
#endif
|
||
syscall_table[SYS_fstatfs] = "fstatfs";
|
||
syscall_table[SYS_fstatvfs] = "fstatvfs";
|
||
syscall_table[SYS_fstatvfs64] = "fstatvfs64";
|
||
#ifdef SYS_fxstat
|
||
syscall_table[SYS_fxstat] = "fxstat";
|
||
#endif
|
||
syscall_table[SYS_getcwd] = "getcwd";
|
||
syscall_table[SYS_getdents] = "getdents";
|
||
syscall_table[SYS_getdents64] = "getdents64";
|
||
syscall_table[SYS_getgid] = "getgid";
|
||
syscall_table[SYS_getgroups] = "getgroups";
|
||
syscall_table[SYS_getitimer] = "getitimer";
|
||
syscall_table[SYS_getloadavg] = "getloadavg";
|
||
syscall_table[SYS_getmsg] = "getmsg";
|
||
syscall_table[SYS_getpagesizes] = "getpagesizes";
|
||
syscall_table[SYS_getpeername] = "getpeername";
|
||
syscall_table[SYS_getpid] = "getpid";
|
||
syscall_table[SYS_getpmsg] = "getpmsg";
|
||
#ifdef SYS_getrandom
|
||
syscall_table[SYS_getrandom] = "getrandom";
|
||
#endif
|
||
syscall_table[SYS_getrlimit] = "getrlimit";
|
||
syscall_table[SYS_getrlimit64] = "getrlimit64";
|
||
syscall_table[SYS_getsockname] = "getsockname";
|
||
syscall_table[SYS_getsockopt] = "getsockopt";
|
||
syscall_table[SYS_gettimeofday] = "gettimeofday";
|
||
syscall_table[SYS_getuid] = "getuid";
|
||
syscall_table[SYS_gtty] = "gtty";
|
||
syscall_table[SYS_hrtsys] = "hrtsys";
|
||
syscall_table[SYS_inst_sync] = "inst_sync";
|
||
syscall_table[SYS_install_utrap] = "install_utrap";
|
||
syscall_table[SYS_ioctl] = "ioctl";
|
||
#ifdef SYS_issetugid
|
||
syscall_table[SYS_issetugid] = "issetugid";
|
||
#endif
|
||
syscall_table[SYS_kaio] = "kaio";
|
||
syscall_table[SYS_kill] = "kill";
|
||
syscall_table[SYS_labelsys] = "labelsys";
|
||
#ifdef SYS_lchown
|
||
syscall_table[SYS_lchown] = "lchown";
|
||
#endif
|
||
syscall_table[SYS_lgrpsys] = "lgrpsys";
|
||
#ifdef SYS_link
|
||
syscall_table[SYS_link] = "link";
|
||
#endif
|
||
#ifdef SYS_linkat
|
||
syscall_table[SYS_linkat] = "linkat";
|
||
#endif
|
||
syscall_table[SYS_listen] = "listen";
|
||
syscall_table[SYS_llseek] = "llseek";
|
||
syscall_table[SYS_lseek] = "lseek";
|
||
#ifdef SYS_lstat
|
||
syscall_table[SYS_lstat] = "lstat";
|
||
#endif
|
||
#ifdef SYS_lstat64
|
||
syscall_table[SYS_lstat64] = "lstat64";
|
||
#endif
|
||
syscall_table[SYS_lwp_cond_broadcast] = "lwp_cond_broadcast";
|
||
syscall_table[SYS_lwp_cond_signal] = "lwp_cond_signal";
|
||
syscall_table[SYS_lwp_cond_wait] = "lwp_cond_wait";
|
||
syscall_table[SYS_lwp_continue] = "lwp_continue";
|
||
syscall_table[SYS_lwp_create] = "lwp_create";
|
||
syscall_table[SYS_lwp_detach] = "lwp_detach";
|
||
syscall_table[SYS_lwp_exit] = "lwp_exit";
|
||
syscall_table[SYS_lwp_info] = "lwp_info";
|
||
#ifdef SYS_lwp_kill
|
||
syscall_table[SYS_lwp_kill] = "lwp_kill";
|
||
#endif
|
||
#ifdef SYS_lwp_mutex_lock
|
||
syscall_table[SYS_lwp_mutex_lock] = "lwp_mutex_lock";
|
||
#endif
|
||
syscall_table[SYS_lwp_mutex_register] = "lwp_mutex_register";
|
||
syscall_table[SYS_lwp_mutex_timedlock] = "lwp_mutex_timedlock";
|
||
syscall_table[SYS_lwp_mutex_trylock] = "lwp_mutex_trylock";
|
||
syscall_table[SYS_lwp_mutex_unlock] = "lwp_mutex_unlock";
|
||
syscall_table[SYS_lwp_mutex_wakeup] = "lwp_mutex_wakeup";
|
||
#ifdef SYS_lwp_name
|
||
syscall_table[SYS_lwp_name] = "lwp_name";
|
||
#endif
|
||
syscall_table[SYS_lwp_park] = "lwp_park";
|
||
syscall_table[SYS_lwp_private] = "lwp_private";
|
||
syscall_table[SYS_lwp_rwlock_sys] = "lwp_rwlock_sys";
|
||
syscall_table[SYS_lwp_self] = "lwp_self";
|
||
syscall_table[SYS_lwp_sema_post] = "lwp_sema_post";
|
||
syscall_table[SYS_lwp_sema_timedwait] = "lwp_sema_timedwait";
|
||
syscall_table[SYS_lwp_sema_trywait] = "lwp_sema_trywait";
|
||
#ifdef SYS_lwp_sema_wait
|
||
syscall_table[SYS_lwp_sema_wait] = "lwp_sema_wait";
|
||
#endif
|
||
syscall_table[SYS_lwp_sigmask] = "lwp_sigmask";
|
||
#ifdef SYS_lwp_sigqueue
|
||
syscall_table[SYS_lwp_sigqueue] = "lwp_sigqueue";
|
||
#endif
|
||
syscall_table[SYS_lwp_suspend] = "lwp_suspend";
|
||
syscall_table[SYS_lwp_wait] = "lwp_wait";
|
||
#ifdef SYS_lxstat
|
||
syscall_table[SYS_lxstat] = "lxstat";
|
||
#endif
|
||
syscall_table[SYS_memcntl] = "memcntl";
|
||
#ifdef SYS_memsys
|
||
syscall_table[SYS_memsys] = "memsys";
|
||
#endif
|
||
syscall_table[SYS_mincore] = "mincore";
|
||
#ifdef SYS_mkdir
|
||
syscall_table[SYS_mkdir] = "mkdir";
|
||
#endif
|
||
#ifdef SYS_mkdirat
|
||
syscall_table[SYS_mkdirat] = "mkdirat";
|
||
#endif
|
||
#ifdef SYS_mknod
|
||
syscall_table[SYS_mknod] = "mknod";
|
||
#endif
|
||
#ifdef SYS_mknodat
|
||
syscall_table[SYS_mknodat] = "mknodat";
|
||
#endif
|
||
syscall_table[SYS_mmap] = "mmap";
|
||
syscall_table[SYS_mmap64] = "mmap64";
|
||
#ifdef SYS_mmapobj
|
||
syscall_table[SYS_mmapobj] = "mmapobj";
|
||
#endif
|
||
syscall_table[SYS_modctl] = "modctl";
|
||
syscall_table[SYS_mount] = "mount";
|
||
syscall_table[SYS_mprotect] = "mprotect";
|
||
syscall_table[SYS_msgsys] = "msgsys";
|
||
syscall_table[SYS_munmap] = "munmap";
|
||
syscall_table[SYS_nanosleep] = "nanosleep";
|
||
syscall_table[SYS_nfssys] = "nfssys";
|
||
syscall_table[SYS_nice] = "nice";
|
||
syscall_table[SYS_ntp_adjtime] = "ntp_adjtime";
|
||
syscall_table[SYS_ntp_gettime] = "ntp_gettime";
|
||
#ifdef SYS_open
|
||
syscall_table[SYS_open] = "open";
|
||
#endif
|
||
#ifdef SYS_open64
|
||
syscall_table[SYS_open64] = "open64";
|
||
#endif
|
||
#ifdef SYS_openat
|
||
syscall_table[SYS_openat] = "openat";
|
||
#endif
|
||
#ifdef SYS_openat64
|
||
syscall_table[SYS_openat64] = "openat64";
|
||
#endif
|
||
syscall_table[SYS_p_online] = "p_online";
|
||
syscall_table[SYS_pathconf] = "pathconf";
|
||
syscall_table[SYS_pause] = "pause";
|
||
syscall_table[SYS_pcsample] = "pcsample";
|
||
syscall_table[SYS_pgrpsys] = "pgrpsys";
|
||
syscall_table[SYS_pipe] = "pipe";
|
||
#ifdef SYS_plock
|
||
syscall_table[SYS_plock] = "plock";
|
||
#endif
|
||
#ifdef SYS_poll
|
||
syscall_table[SYS_poll] = "poll";
|
||
#endif
|
||
syscall_table[SYS_pollsys] = "pollsys";
|
||
syscall_table[SYS_port] = "port";
|
||
syscall_table[SYS_pread] = "pread";
|
||
syscall_table[SYS_pread64] = "pread64";
|
||
syscall_table[SYS_priocntlsys] = "priocntlsys";
|
||
syscall_table[SYS_privsys] = "privsys";
|
||
#ifdef SYS_processor_bind
|
||
syscall_table[SYS_processor_bind] = "processor_bind";
|
||
#endif
|
||
#ifdef SYS_processor_info
|
||
syscall_table[SYS_processor_info] = "processor_info";
|
||
#endif
|
||
#ifdef SYS_processor_sys
|
||
syscall_table[SYS_processor_sys] = "processor_sys";
|
||
#endif
|
||
syscall_table[SYS_profil] = "profil";
|
||
syscall_table[SYS_pset] = "pset";
|
||
syscall_table[SYS_putmsg] = "putmsg";
|
||
syscall_table[SYS_putpmsg] = "putpmsg";
|
||
syscall_table[SYS_pwrite] = "pwrite";
|
||
syscall_table[SYS_pwrite64] = "pwrite64";
|
||
syscall_table[SYS_rctlsys] = "rctlsys";
|
||
syscall_table[SYS_read] = "read";
|
||
#ifdef SYS_readlink
|
||
syscall_table[SYS_readlink] = "readlink";
|
||
#endif
|
||
#ifdef SYS_readlinkat
|
||
syscall_table[SYS_readlinkat] = "readlinkat";
|
||
#endif
|
||
syscall_table[SYS_readv] = "readv";
|
||
syscall_table[SYS_recv] = "recv";
|
||
syscall_table[SYS_recvfrom] = "recvfrom";
|
||
#ifdef SYS_recvmmsg
|
||
syscall_table[SYS_recvmmsg] = "recvmmsg";
|
||
#endif
|
||
syscall_table[SYS_recvmsg] = "recvmsg";
|
||
#ifdef SYS_reflinkat
|
||
syscall_table[SYS_reflinkat] = "reflinkat";
|
||
#endif
|
||
#ifdef SYS_rename
|
||
syscall_table[SYS_rename] = "rename";
|
||
#endif
|
||
#ifdef SYS_renameat
|
||
syscall_table[SYS_renameat] = "renameat";
|
||
#endif
|
||
syscall_table[SYS_resolvepath] = "resolvepath";
|
||
#ifdef SYS_rmdir
|
||
syscall_table[SYS_rmdir] = "rmdir";
|
||
#endif
|
||
syscall_table[SYS_rpcsys] = "rpcsys";
|
||
syscall_table[SYS_rusagesys] = "rusagesys";
|
||
syscall_table[SYS_schedctl] = "schedctl";
|
||
#ifdef SYS_secsys
|
||
syscall_table[SYS_secsys] = "secsys";
|
||
#endif
|
||
syscall_table[SYS_semsys] = "semsys";
|
||
syscall_table[SYS_send] = "send";
|
||
syscall_table[SYS_sendfilev] = "sendfilev";
|
||
#ifdef SYS_sendmmsg
|
||
syscall_table[SYS_sendmmsg] = "sendmmsg";
|
||
#endif
|
||
syscall_table[SYS_sendmsg] = "sendmsg";
|
||
syscall_table[SYS_sendto] = "sendto";
|
||
syscall_table[SYS_setegid] = "setegid";
|
||
syscall_table[SYS_seteuid] = "seteuid";
|
||
syscall_table[SYS_setgid] = "setgid";
|
||
syscall_table[SYS_setgroups] = "setgroups";
|
||
syscall_table[SYS_setitimer] = "setitimer";
|
||
syscall_table[SYS_setregid] = "setregid";
|
||
syscall_table[SYS_setreuid] = "setreuid";
|
||
syscall_table[SYS_setrlimit] = "setrlimit";
|
||
syscall_table[SYS_setrlimit64] = "setrlimit64";
|
||
syscall_table[SYS_setsockopt] = "setsockopt";
|
||
syscall_table[SYS_setuid] = "setuid";
|
||
syscall_table[SYS_sharefs] = "sharefs";
|
||
syscall_table[SYS_shmsys] = "shmsys";
|
||
syscall_table[SYS_shutdown] = "shutdown";
|
||
#ifdef SYS_sidsys
|
||
syscall_table[SYS_sidsys] = "sidsys";
|
||
#endif
|
||
syscall_table[SYS_sigaction] = "sigaction";
|
||
syscall_table[SYS_sigaltstack] = "sigaltstack";
|
||
#ifdef SYS_signal
|
||
syscall_table[SYS_signal] = "signal";
|
||
#endif
|
||
syscall_table[SYS_signotify] = "signotify";
|
||
syscall_table[SYS_sigpending] = "sigpending";
|
||
syscall_table[SYS_sigprocmask] = "sigprocmask";
|
||
syscall_table[SYS_sigqueue] = "sigqueue";
|
||
#ifdef SYS_sigresend
|
||
syscall_table[SYS_sigresend] = "sigresend";
|
||
#endif
|
||
syscall_table[SYS_sigsendsys] = "sigsendsys";
|
||
syscall_table[SYS_sigsuspend] = "sigsuspend";
|
||
syscall_table[SYS_sigtimedwait] = "sigtimedwait";
|
||
syscall_table[SYS_so_socket] = "so_socket";
|
||
syscall_table[SYS_so_socketpair] = "so_socketpair";
|
||
syscall_table[SYS_sockconfig] = "sockconfig";
|
||
#ifdef SYS_sparc_fixalign
|
||
syscall_table[SYS_sparc_fixalign] = "sparc_fixalign";
|
||
#endif
|
||
syscall_table[SYS_sparc_utrap_install] = "sparc_utrap_install";
|
||
#ifdef SYS_spawn
|
||
syscall_table[SYS_spawn] = "spawn";
|
||
#endif
|
||
#ifdef SYS_stat
|
||
syscall_table[SYS_stat] = "stat";
|
||
#endif
|
||
#ifdef SYS_stat64
|
||
syscall_table[SYS_stat64] = "stat64";
|
||
#endif
|
||
syscall_table[SYS_statfs] = "statfs";
|
||
syscall_table[SYS_statvfs] = "statvfs";
|
||
syscall_table[SYS_statvfs64] = "statvfs64";
|
||
syscall_table[SYS_stime] = "stime";
|
||
syscall_table[SYS_stty] = "stty";
|
||
#ifdef SYS_symlink
|
||
syscall_table[SYS_symlink] = "symlink";
|
||
#endif
|
||
#ifdef SYS_symlinkat
|
||
syscall_table[SYS_symlinkat] = "symlinkat";
|
||
#endif
|
||
syscall_table[SYS_sync] = "sync";
|
||
syscall_table[SYS_syscall] = "syscall";
|
||
syscall_table[SYS_sysconfig] = "sysconfig";
|
||
syscall_table[SYS_sysfs] = "sysfs";
|
||
syscall_table[SYS_sysi86] = "sysi86";
|
||
#ifdef SYS_syssun
|
||
syscall_table[SYS_syssun] = "syssun";
|
||
#endif
|
||
#ifdef SYS_system_stats
|
||
syscall_table[SYS_system_stats] = "system_stats";
|
||
#endif
|
||
syscall_table[SYS_systeminfo] = "systeminfo";
|
||
syscall_table[SYS_tasksys] = "tasksys";
|
||
syscall_table[SYS_time] = "time";
|
||
syscall_table[SYS_timer_create] = "timer_create";
|
||
syscall_table[SYS_timer_delete] = "timer_delete";
|
||
syscall_table[SYS_timer_getoverrun] = "timer_getoverrun";
|
||
syscall_table[SYS_timer_gettime] = "timer_gettime";
|
||
syscall_table[SYS_timer_settime] = "timer_settime";
|
||
syscall_table[SYS_times] = "times";
|
||
syscall_table[SYS_uadmin] = "uadmin";
|
||
syscall_table[SYS_ucredsys] = "ucredsys";
|
||
syscall_table[SYS_ulimit] = "ulimit";
|
||
syscall_table[SYS_umask] = "umask";
|
||
#ifdef SYS_umount
|
||
syscall_table[SYS_umount] = "umount";
|
||
#endif
|
||
syscall_table[SYS_umount2] = "umount2";
|
||
syscall_table[SYS_uname] = "uname";
|
||
#ifdef SYS_unlink
|
||
syscall_table[SYS_unlink] = "unlink";
|
||
#endif
|
||
#ifdef SYS_unlinkat
|
||
syscall_table[SYS_unlinkat] = "unlinkat";
|
||
#endif
|
||
#ifdef SYS_utime
|
||
syscall_table[SYS_utime] = "utime";
|
||
#endif
|
||
#ifdef SYS_utimensat
|
||
syscall_table[SYS_utimensat] = "utimensat";
|
||
#endif
|
||
#ifdef SYS_utimes
|
||
syscall_table[SYS_utimes] = "utimes";
|
||
#endif
|
||
#ifdef SYS_utimesys
|
||
syscall_table[SYS_utimesys] = "utimesys";
|
||
#endif
|
||
syscall_table[SYS_utssys] = "utssys";
|
||
syscall_table[SYS_uucopy] = "uucopy";
|
||
syscall_table[SYS_uucopystr] = "uucopystr";
|
||
syscall_table[SYS_uuidsys] = "uuidsys";
|
||
#ifdef SYS_va_mask
|
||
syscall_table[SYS_va_mask] = "va_mask";
|
||
#endif
|
||
syscall_table[SYS_vfork] = "vfork";
|
||
syscall_table[SYS_vhangup] = "vhangup";
|
||
#ifdef SYS_wait
|
||
syscall_table[SYS_wait] = "wait";
|
||
#endif
|
||
#ifdef SYS_waitid
|
||
syscall_table[SYS_waitid] = "waitid";
|
||
#endif
|
||
#ifdef SYS_waitsys
|
||
syscall_table[SYS_waitsys] = "waitsys";
|
||
#endif
|
||
syscall_table[SYS_write] = "write";
|
||
syscall_table[SYS_writev] = "writev";
|
||
#ifdef SYS_xmknod
|
||
syscall_table[SYS_xmknod] = "xmknod";
|
||
#endif
|
||
#ifdef SYS_xstat
|
||
syscall_table[SYS_xstat] = "xstat";
|
||
#endif
|
||
syscall_table[SYS_yield] = "yield";
|
||
syscall_table[SYS_zone] = "zone";
|
||
}
|
||
|
||
/* Prettyprint syscall NUM. */
|
||
|
||
void
|
||
proc_prettyfprint_syscall (FILE *file, int num, int verbose)
|
||
{
|
||
if (syscall_table[num])
|
||
fprintf (file, "SYS_%s ", syscall_table[num]);
|
||
else
|
||
fprintf (file, "<Unknown syscall %d> ", num);
|
||
}
|
||
|
||
void
|
||
proc_prettyprint_syscall (int num, int verbose)
|
||
{
|
||
proc_prettyfprint_syscall (stdout, num, verbose);
|
||
}
|
||
|
||
/* Prettyprint all syscalls in SYSSET. */
|
||
|
||
void
|
||
proc_prettyfprint_syscalls (FILE *file, sysset_t *sysset, int verbose)
|
||
{
|
||
int i;
|
||
|
||
for (i = 0; i < MAX_SYSCALLS; i++)
|
||
if (prismember (sysset, i))
|
||
{
|
||
proc_prettyfprint_syscall (file, i, verbose);
|
||
}
|
||
fprintf (file, "\n");
|
||
}
|
||
|
||
void
|
||
proc_prettyprint_syscalls (sysset_t *sysset, int verbose)
|
||
{
|
||
proc_prettyfprint_syscalls (stdout, sysset, verbose);
|
||
}
|
||
|
||
/* Prettyprint signals. */
|
||
|
||
/* Signal translation table, ordered ANSI-standard signals first,
|
||
other signals second, with signals in each block ordered by their
|
||
numerical values on a typical POSIX platform. */
|
||
|
||
static struct trans signal_table[] =
|
||
{
|
||
{ 0, "<no signal>", "no signal" },
|
||
|
||
/* SIGINT, SIGILL, SIGABRT, SIGFPE, SIGSEGV and SIGTERM
|
||
are ANSI-standard signals and are always available. */
|
||
|
||
{ SIGINT, "SIGINT", "Interrupt (rubout)" },
|
||
{ SIGILL, "SIGILL", "Illegal instruction" }, /* not reset when caught */
|
||
{ SIGABRT, "SIGABRT", "used by abort()" }, /* replaces SIGIOT */
|
||
{ SIGFPE, "SIGFPE", "Floating point exception" },
|
||
{ SIGSEGV, "SIGSEGV", "Segmentation violation" },
|
||
{ SIGTERM, "SIGTERM", "Software termination signal from kill" },
|
||
|
||
/* All other signals need preprocessor conditionals. */
|
||
|
||
{ SIGHUP, "SIGHUP", "Hangup" },
|
||
{ SIGQUIT, "SIGQUIT", "Quit (ASCII FS)" },
|
||
{ SIGTRAP, "SIGTRAP", "Trace trap" }, /* not reset when caught */
|
||
{ SIGIOT, "SIGIOT", "IOT instruction" },
|
||
{ SIGEMT, "SIGEMT", "EMT instruction" },
|
||
{ SIGKILL, "SIGKILL", "Kill" }, /* Solaris: cannot be caught/ignored */
|
||
{ SIGBUS, "SIGBUS", "Bus error" },
|
||
{ SIGSYS, "SIGSYS", "Bad argument to system call" },
|
||
{ SIGPIPE, "SIGPIPE", "Write to pipe with no one to read it" },
|
||
{ SIGALRM, "SIGALRM", "Alarm clock" },
|
||
{ SIGUSR1, "SIGUSR1", "User defined signal 1" },
|
||
{ SIGUSR2, "SIGUSR2", "User defined signal 2" },
|
||
{ SIGCHLD, "SIGCHLD", "Child status changed" }, /* Posix version */
|
||
{ SIGCLD, "SIGCLD", "Child status changed" }, /* Solaris version */
|
||
{ SIGPWR, "SIGPWR", "Power-fail restart" },
|
||
{ SIGWINCH, "SIGWINCH", "Window size change" },
|
||
{ SIGURG, "SIGURG", "Urgent socket condition" },
|
||
{ SIGPOLL, "SIGPOLL", "Pollable event" },
|
||
{ SIGIO, "SIGIO", "Socket I/O possible" }, /* alias for SIGPOLL */
|
||
{ SIGSTOP, "SIGSTOP", "Stop, not from tty" }, /* cannot be caught or
|
||
ignored */
|
||
{ SIGTSTP, "SIGTSTP", "User stop from tty" },
|
||
{ SIGCONT, "SIGCONT", "Stopped process has been continued" },
|
||
{ SIGTTIN, "SIGTTIN", "Background tty read attempted" },
|
||
{ SIGTTOU, "SIGTTOU", "Background tty write attempted" },
|
||
{ SIGVTALRM, "SIGVTALRM", "Virtual timer expired" },
|
||
{ SIGPROF, "SIGPROF", "Profiling timer expired" },
|
||
{ SIGXCPU, "SIGXCPU", "Exceeded CPU limit" },
|
||
{ SIGXFSZ, "SIGXFSZ", "Exceeded file size limit" },
|
||
{ SIGWAITING, "SIGWAITING", "Process's LWPs are blocked" },
|
||
{ SIGLWP, "SIGLWP", "Used by thread library" },
|
||
{ SIGFREEZE, "SIGFREEZE", "Used by CPR" },
|
||
{ SIGTHAW, "SIGTHAW", "Used by CPR" },
|
||
{ SIGCANCEL, "SIGCANCEL", "Used by libthread" },
|
||
{ SIGLOST, "SIGLOST", "Resource lost" },
|
||
|
||
/* FIXME: add real-time signals. */
|
||
};
|
||
|
||
/* Prettyprint signal number SIGNO. */
|
||
|
||
void
|
||
proc_prettyfprint_signal (FILE *file, int signo, int verbose)
|
||
{
|
||
int i;
|
||
|
||
for (i = 0; i < sizeof (signal_table) / sizeof (signal_table[0]); i++)
|
||
if (signo == signal_table[i].value)
|
||
{
|
||
fprintf (file, "%s", signal_table[i].name);
|
||
if (verbose)
|
||
fprintf (file, ": %s\n", signal_table[i].desc);
|
||
else
|
||
fprintf (file, " ");
|
||
return;
|
||
}
|
||
fprintf (file, "Unknown signal %d%c", signo, verbose ? '\n' : ' ');
|
||
}
|
||
|
||
void
|
||
proc_prettyprint_signal (int signo, int verbose)
|
||
{
|
||
proc_prettyfprint_signal (stdout, signo, verbose);
|
||
}
|
||
|
||
/* Prettyprint all signals in SIGSET. */
|
||
|
||
void
|
||
proc_prettyfprint_signalset (FILE *file, sigset_t *sigset, int verbose)
|
||
{
|
||
int i;
|
||
|
||
/* Loop over all signal numbers from 0 to NSIG, using them as the
|
||
index to prismember. The signal table had better not contain
|
||
aliases, for if it does they will both be printed. */
|
||
|
||
for (i = 0; i < NSIG; i++)
|
||
if (prismember (sigset, i))
|
||
proc_prettyfprint_signal (file, i, verbose);
|
||
|
||
if (!verbose)
|
||
fprintf (file, "\n");
|
||
}
|
||
|
||
void
|
||
proc_prettyprint_signalset (sigset_t *sigset, int verbose)
|
||
{
|
||
proc_prettyfprint_signalset (stdout, sigset, verbose);
|
||
}
|
||
|
||
|
||
/* Prettyprint faults. */
|
||
|
||
/* Fault translation table. */
|
||
|
||
static struct trans fault_table[] =
|
||
{
|
||
{ FLTILL, "FLTILL", "Illegal instruction" },
|
||
{ FLTPRIV, "FLTPRIV", "Privileged instruction" },
|
||
{ FLTBPT, "FLTBPT", "Breakpoint trap" },
|
||
{ FLTTRACE, "FLTTRACE", "Trace trap" },
|
||
{ FLTACCESS, "FLTACCESS", "Memory access fault" },
|
||
{ FLTBOUNDS, "FLTBOUNDS", "Memory bounds violation" },
|
||
{ FLTIOVF, "FLTIOVF", "Integer overflow" },
|
||
{ FLTIZDIV, "FLTIZDIV", "Integer zero divide" },
|
||
{ FLTFPE, "FLTFPE", "Floating-point exception" },
|
||
{ FLTSTACK, "FLTSTACK", "Unrecoverable stack fault" },
|
||
{ FLTPAGE, "FLTPAGE", "Recoverable page fault" },
|
||
{ FLTWATCH, "FLTWATCH", "User watchpoint" },
|
||
};
|
||
|
||
/* Work horse. Accepts an index into the fault table, prints it
|
||
pretty. */
|
||
|
||
static void
|
||
prettyfprint_faulttable_entry (FILE *file, int i, int verbose)
|
||
{
|
||
fprintf (file, "%s", fault_table[i].name);
|
||
if (verbose)
|
||
fprintf (file, ": %s\n", fault_table[i].desc);
|
||
else
|
||
fprintf (file, " ");
|
||
}
|
||
|
||
/* Prettyprint hardware fault number FAULTNO. */
|
||
|
||
void
|
||
proc_prettyfprint_fault (FILE *file, int faultno, int verbose)
|
||
{
|
||
int i;
|
||
|
||
for (i = 0; i < ARRAY_SIZE (fault_table); i++)
|
||
if (faultno == fault_table[i].value)
|
||
{
|
||
prettyfprint_faulttable_entry (file, i, verbose);
|
||
return;
|
||
}
|
||
|
||
fprintf (file, "Unknown hardware fault %d%c",
|
||
faultno, verbose ? '\n' : ' ');
|
||
}
|
||
|
||
void
|
||
proc_prettyprint_fault (int faultno, int verbose)
|
||
{
|
||
proc_prettyfprint_fault (stdout, faultno, verbose);
|
||
}
|
||
|
||
/* Prettyprint all faults in FLTSET. */
|
||
|
||
void
|
||
proc_prettyfprint_faultset (FILE *file, fltset_t *fltset, int verbose)
|
||
{
|
||
int i;
|
||
|
||
/* Loop through the fault table, using the value field as the index
|
||
to prismember. The fault table had better not contain aliases,
|
||
for if it does they will both be printed. */
|
||
|
||
for (i = 0; i < ARRAY_SIZE (fault_table); i++)
|
||
if (prismember (fltset, fault_table[i].value))
|
||
prettyfprint_faulttable_entry (file, i, verbose);
|
||
|
||
if (!verbose)
|
||
fprintf (file, "\n");
|
||
}
|
||
|
||
void
|
||
proc_prettyprint_faultset (fltset_t *fltset, int verbose)
|
||
{
|
||
proc_prettyfprint_faultset (stdout, fltset, verbose);
|
||
}
|
||
|
||
/* TODO: actions, holds... */
|
||
|
||
void
|
||
proc_prettyprint_actionset (struct sigaction *actions, int verbose)
|
||
{
|
||
}
|
||
|
||
void
|
||
_initialize_proc_events (void)
|
||
{
|
||
init_syscall_table ();
|
||
}
|