/* Machine-independent support for Solaris /proc (process file system) Copyright (C) 1999-2023 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 . */ /* 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" #include #include #include #include #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, " ", 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" }, /* 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 (); }