| /* Machine-independent support for Solaris /proc (process file system) |
| |
| Copyright (C) 1999-2024 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 <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"; |
| #ifdef SYS_uuidsys |
| syscall_table[SYS_uuidsys] = "uuidsys"; |
| #endif |
| #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 |
| _initialize_proc_events () |
| { |
| init_syscall_table (); |
| } |