Implement show | set may-call-functions [on|off]
[external/binutils.git] / gdb / proc-events.c
1 /* Machine-independent support for Solaris /proc (process file system)
2
3    Copyright (C) 1999-2019 Free Software Foundation, Inc.
4
5    Written by Michael Snyder at Cygnus Solutions.
6    Based on work by Fred Fish, Stu Grossman, Geoff Noer, and others.
7
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20
21 /* Pretty-print "events of interest".
22
23    This module includes pretty-print routines for:
24    * faults (hardware exceptions)
25    * signals (software interrupts)
26    * syscalls
27
28    FIXME: At present, the syscall translation table must be
29    initialized, which is not true of the other translation tables.  */
30
31 #include "defs.h"
32
33 #define _STRUCTURED_PROC 1
34
35 #include <sys/types.h>
36 #include <sys/procfs.h>
37 #include <sys/syscall.h>
38 #include <sys/fault.h>
39
40 #include "proc-utils.h"
41
42 /* Much of the information used in the /proc interface, particularly
43    for printing status information, is kept as tables of structures of
44    the following form.  These tables can be used to map numeric values
45    to their symbolic names and to a string that describes their
46    specific use.  */
47
48 struct trans
49 {
50   int value;                    /* The numeric value.  */
51   const char *name;             /* The equivalent symbolic value.  */
52   const char *desc;             /* Short description of value.  */
53 };
54 \f
55
56 /* Pretty print syscalls.  */
57
58 /* Syscall translation table.  */
59
60 #define MAX_SYSCALLS 262        /* Pretty arbitrary.  */
61 static const char *syscall_table[MAX_SYSCALLS];
62
63 static void
64 init_syscall_table (void)
65 {
66   syscall_table[SYS_accept] = "accept";
67 #ifdef SYS_access
68   syscall_table[SYS_access] = "access";
69 #endif
70   syscall_table[SYS_acct] = "acct";
71   syscall_table[SYS_acctctl] = "acctctl";
72   syscall_table[SYS_acl] = "acl";
73 #ifdef SYS_adi
74   syscall_table[SYS_adi] = "adi";
75 #endif
76   syscall_table[SYS_adjtime] = "adjtime";
77   syscall_table[SYS_alarm] = "alarm";
78   syscall_table[SYS_auditsys] = "auditsys";
79   syscall_table[SYS_autofssys] = "autofssys";
80   syscall_table[SYS_bind] = "bind";
81   syscall_table[SYS_brand] = "brand";
82   syscall_table[SYS_brk] = "brk";
83   syscall_table[SYS_chdir] = "chdir";
84 #ifdef SYS_chmod
85   syscall_table[SYS_chmod] = "chmod";
86 #endif
87 #ifdef SYS_chown
88   syscall_table[SYS_chown] = "chown";
89 #endif
90   syscall_table[SYS_chroot] = "chroot";
91   syscall_table[SYS_cladm] = "cladm";
92   syscall_table[SYS_clock_getres] = "clock_getres";
93   syscall_table[SYS_clock_gettime] = "clock_gettime";
94   syscall_table[SYS_clock_settime] = "clock_settime";
95   syscall_table[SYS_close] = "close";
96   syscall_table[SYS_connect] = "connect";
97   syscall_table[SYS_context] = "context";
98   syscall_table[SYS_corectl] = "corectl";
99   syscall_table[SYS_cpc] = "cpc";
100 #ifdef SYS_creat
101   syscall_table[SYS_creat] = "creat";
102 #endif
103 #ifdef SYS_creat64
104   syscall_table[SYS_creat64] = "creat64";
105 #endif
106   syscall_table[SYS_door] = "door";
107 #ifdef SYS_dup
108   syscall_table[SYS_dup] = "dup";
109 #endif
110 #ifdef SYS_evsys
111   syscall_table[SYS_evsys] = "evsys";
112 #endif
113 #ifdef SYS_evtrapret
114   syscall_table[SYS_evtrapret] = "evtrapret";
115 #endif
116   syscall_table[SYS_exacctsys] = "exacctsys";
117 #ifdef SYS_exec
118   syscall_table[SYS_exec] = "exec";
119 #endif
120   syscall_table[SYS_execve] = "execve";
121   syscall_table[SYS_exit] = "exit";
122 #ifdef SYS_faccessat
123   syscall_table[SYS_faccessat] = "faccessat";
124 #endif
125   syscall_table[SYS_facl] = "facl";
126   syscall_table[SYS_fchdir] = "fchdir";
127 #ifdef SYS_fchmod
128   syscall_table[SYS_fchmod] = "fchmod";
129 #endif
130 #ifdef SYS_fchmodat
131   syscall_table[SYS_fchmodat] = "fchmodat";
132 #endif
133 #ifdef SYS_fchown
134   syscall_table[SYS_fchown] = "fchown";
135 #endif
136 #ifdef SYS_fchownat
137   syscall_table[SYS_fchownat] = "fchownat";
138 #endif
139   syscall_table[SYS_fchroot] = "fchroot";
140   syscall_table[SYS_fcntl] = "fcntl";
141   syscall_table[SYS_fdsync] = "fdsync";
142 #ifdef SYS_fork1
143   syscall_table[SYS_fork1] = "fork1";
144 #endif
145 #ifdef SYS_forkall
146   syscall_table[SYS_forkall] = "forkall";
147 #endif
148 #ifdef SYS_forksys
149   syscall_table[SYS_forksys] = "forksys";
150 #endif
151   syscall_table[SYS_fpathconf] = "fpathconf";
152 #ifdef SYS_frealpathat
153   syscall_table[SYS_frealpathat] = "frealpathat";
154 #endif
155 #ifdef SYS_fsat
156   syscall_table[SYS_fsat] = "fsat";
157 #endif
158 #ifdef SYS_fstat
159   syscall_table[SYS_fstat] = "fstat";
160 #endif
161 #ifdef SYS_fstat64
162   syscall_table[SYS_fstat64] = "fstat64";
163 #endif
164 #ifdef SYS_fstatat
165   syscall_table[SYS_fstatat] = "fstatat";
166 #endif
167 #ifdef SYS_fstatat64
168   syscall_table[SYS_fstatat64] = "fstatat64";
169 #endif
170   syscall_table[SYS_fstatfs] = "fstatfs";
171   syscall_table[SYS_fstatvfs] = "fstatvfs";
172   syscall_table[SYS_fstatvfs64] = "fstatvfs64";
173 #ifdef SYS_fxstat
174   syscall_table[SYS_fxstat] = "fxstat";
175 #endif
176   syscall_table[SYS_getcwd] = "getcwd";
177   syscall_table[SYS_getdents] = "getdents";
178   syscall_table[SYS_getdents64] = "getdents64";
179   syscall_table[SYS_getgid] = "getgid";
180   syscall_table[SYS_getgroups] = "getgroups";
181   syscall_table[SYS_getitimer] = "getitimer";
182   syscall_table[SYS_getloadavg] = "getloadavg";
183   syscall_table[SYS_getmsg] = "getmsg";
184   syscall_table[SYS_getpagesizes] = "getpagesizes";
185   syscall_table[SYS_getpeername] = "getpeername";
186   syscall_table[SYS_getpid] = "getpid";
187   syscall_table[SYS_getpmsg] = "getpmsg";
188 #ifdef SYS_getrandom
189   syscall_table[SYS_getrandom] = "getrandom";
190 #endif
191   syscall_table[SYS_getrlimit] = "getrlimit";
192   syscall_table[SYS_getrlimit64] = "getrlimit64";
193   syscall_table[SYS_getsockname] = "getsockname";
194   syscall_table[SYS_getsockopt] = "getsockopt";
195   syscall_table[SYS_gettimeofday] = "gettimeofday";
196   syscall_table[SYS_getuid] = "getuid";
197   syscall_table[SYS_gtty] = "gtty";
198   syscall_table[SYS_hrtsys] = "hrtsys";
199   syscall_table[SYS_inst_sync] = "inst_sync";
200   syscall_table[SYS_install_utrap] = "install_utrap";
201   syscall_table[SYS_ioctl] = "ioctl";
202 #ifdef SYS_issetugid
203   syscall_table[SYS_issetugid] = "issetugid";
204 #endif
205   syscall_table[SYS_kaio] = "kaio";
206   syscall_table[SYS_kill] = "kill";
207   syscall_table[SYS_labelsys] = "labelsys";
208 #ifdef SYS_lchown
209   syscall_table[SYS_lchown] = "lchown";
210 #endif
211   syscall_table[SYS_lgrpsys] = "lgrpsys";
212 #ifdef SYS_link
213   syscall_table[SYS_link] = "link";
214 #endif
215 #ifdef SYS_linkat
216   syscall_table[SYS_linkat] = "linkat";
217 #endif
218   syscall_table[SYS_listen] = "listen";
219   syscall_table[SYS_llseek] = "llseek";
220   syscall_table[SYS_lseek] = "lseek";
221 #ifdef SYS_lstat
222   syscall_table[SYS_lstat] = "lstat";
223 #endif
224 #ifdef SYS_lstat64
225   syscall_table[SYS_lstat64] = "lstat64";
226 #endif
227   syscall_table[SYS_lwp_cond_broadcast] = "lwp_cond_broadcast";
228   syscall_table[SYS_lwp_cond_signal] = "lwp_cond_signal";
229   syscall_table[SYS_lwp_cond_wait] = "lwp_cond_wait";
230   syscall_table[SYS_lwp_continue] = "lwp_continue";
231   syscall_table[SYS_lwp_create] = "lwp_create";
232   syscall_table[SYS_lwp_detach] = "lwp_detach";
233   syscall_table[SYS_lwp_exit] = "lwp_exit";
234   syscall_table[SYS_lwp_info] = "lwp_info";
235 #ifdef SYS_lwp_kill
236   syscall_table[SYS_lwp_kill] = "lwp_kill";
237 #endif
238 #ifdef SYS_lwp_mutex_lock
239   syscall_table[SYS_lwp_mutex_lock] = "lwp_mutex_lock";
240 #endif
241   syscall_table[SYS_lwp_mutex_register] = "lwp_mutex_register";
242   syscall_table[SYS_lwp_mutex_timedlock] = "lwp_mutex_timedlock";
243   syscall_table[SYS_lwp_mutex_trylock] = "lwp_mutex_trylock";
244   syscall_table[SYS_lwp_mutex_unlock] = "lwp_mutex_unlock";
245   syscall_table[SYS_lwp_mutex_wakeup] = "lwp_mutex_wakeup";
246 #ifdef SYS_lwp_name
247   syscall_table[SYS_lwp_name] = "lwp_name";
248 #endif
249   syscall_table[SYS_lwp_park] = "lwp_park";
250   syscall_table[SYS_lwp_private] = "lwp_private";
251   syscall_table[SYS_lwp_rwlock_sys] = "lwp_rwlock_sys";
252   syscall_table[SYS_lwp_self] = "lwp_self";
253   syscall_table[SYS_lwp_sema_post] = "lwp_sema_post";
254   syscall_table[SYS_lwp_sema_timedwait] = "lwp_sema_timedwait";
255   syscall_table[SYS_lwp_sema_trywait] = "lwp_sema_trywait";
256 #ifdef SYS_lwp_sema_wait
257   syscall_table[SYS_lwp_sema_wait] = "lwp_sema_wait";
258 #endif
259   syscall_table[SYS_lwp_sigmask] = "lwp_sigmask";
260 #ifdef SYS_lwp_sigqueue
261   syscall_table[SYS_lwp_sigqueue] = "lwp_sigqueue";
262 #endif
263   syscall_table[SYS_lwp_suspend] = "lwp_suspend";
264   syscall_table[SYS_lwp_wait] = "lwp_wait";
265 #ifdef SYS_lxstat
266   syscall_table[SYS_lxstat] = "lxstat";
267 #endif
268   syscall_table[SYS_memcntl] = "memcntl";
269 #ifdef SYS_memsys
270   syscall_table[SYS_memsys] = "memsys";
271 #endif
272   syscall_table[SYS_mincore] = "mincore";
273 #ifdef SYS_mkdir
274   syscall_table[SYS_mkdir] = "mkdir";
275 #endif
276 #ifdef SYS_mkdirat
277   syscall_table[SYS_mkdirat] = "mkdirat";
278 #endif
279 #ifdef SYS_mknod
280   syscall_table[SYS_mknod] = "mknod";
281 #endif
282 #ifdef SYS_mknodat
283   syscall_table[SYS_mknodat] = "mknodat";
284 #endif
285   syscall_table[SYS_mmap] = "mmap";
286   syscall_table[SYS_mmap64] = "mmap64";
287 #ifdef SYS_mmapobj
288   syscall_table[SYS_mmapobj] = "mmapobj";
289 #endif
290   syscall_table[SYS_modctl] = "modctl";
291   syscall_table[SYS_mount] = "mount";
292   syscall_table[SYS_mprotect] = "mprotect";
293   syscall_table[SYS_msgsys] = "msgsys";
294   syscall_table[SYS_munmap] = "munmap";
295   syscall_table[SYS_nanosleep] = "nanosleep";
296   syscall_table[SYS_nfssys] = "nfssys";
297   syscall_table[SYS_nice] = "nice";
298   syscall_table[SYS_ntp_adjtime] = "ntp_adjtime";
299   syscall_table[SYS_ntp_gettime] = "ntp_gettime";
300 #ifdef SYS_open
301   syscall_table[SYS_open] = "open";
302 #endif
303 #ifdef SYS_open64
304   syscall_table[SYS_open64] = "open64";
305 #endif
306 #ifdef SYS_openat
307   syscall_table[SYS_openat] = "openat";
308 #endif
309 #ifdef SYS_openat64
310   syscall_table[SYS_openat64] = "openat64";
311 #endif
312   syscall_table[SYS_p_online] = "p_online";
313   syscall_table[SYS_pathconf] = "pathconf";
314   syscall_table[SYS_pause] = "pause";
315   syscall_table[SYS_pcsample] = "pcsample";
316   syscall_table[SYS_pgrpsys] = "pgrpsys";
317   syscall_table[SYS_pipe] = "pipe";
318 #ifdef SYS_plock
319   syscall_table[SYS_plock] = "plock";
320 #endif
321 #ifdef SYS_poll
322   syscall_table[SYS_poll] = "poll";
323 #endif
324   syscall_table[SYS_pollsys] = "pollsys";
325   syscall_table[SYS_port] = "port";
326   syscall_table[SYS_pread] = "pread";
327   syscall_table[SYS_pread64] = "pread64";
328   syscall_table[SYS_priocntlsys] = "priocntlsys";
329   syscall_table[SYS_privsys] = "privsys";
330 #ifdef SYS_processor_bind
331   syscall_table[SYS_processor_bind] = "processor_bind";
332 #endif
333 #ifdef SYS_processor_info
334   syscall_table[SYS_processor_info] = "processor_info";
335 #endif
336 #ifdef SYS_processor_sys
337   syscall_table[SYS_processor_sys] = "processor_sys";
338 #endif
339   syscall_table[SYS_profil] = "profil";
340   syscall_table[SYS_pset] = "pset";
341   syscall_table[SYS_putmsg] = "putmsg";
342   syscall_table[SYS_putpmsg] = "putpmsg";
343   syscall_table[SYS_pwrite] = "pwrite";
344   syscall_table[SYS_pwrite64] = "pwrite64";
345   syscall_table[SYS_rctlsys] = "rctlsys";
346   syscall_table[SYS_read] = "read";
347 #ifdef SYS_readlink
348   syscall_table[SYS_readlink] = "readlink";
349 #endif
350 #ifdef SYS_readlinkat
351   syscall_table[SYS_readlinkat] = "readlinkat";
352 #endif
353   syscall_table[SYS_readv] = "readv";
354   syscall_table[SYS_recv] = "recv";
355   syscall_table[SYS_recvfrom] = "recvfrom";
356 #ifdef SYS_recvmmsg
357   syscall_table[SYS_recvmmsg] = "recvmmsg";
358 #endif
359   syscall_table[SYS_recvmsg] = "recvmsg";
360 #ifdef SYS_reflinkat
361   syscall_table[SYS_reflinkat] = "reflinkat";
362 #endif
363 #ifdef SYS_rename
364   syscall_table[SYS_rename] = "rename";
365 #endif
366 #ifdef SYS_renameat
367   syscall_table[SYS_renameat] = "renameat";
368 #endif
369   syscall_table[SYS_resolvepath] = "resolvepath";
370 #ifdef SYS_rmdir
371   syscall_table[SYS_rmdir] = "rmdir";
372 #endif
373   syscall_table[SYS_rpcsys] = "rpcsys";
374   syscall_table[SYS_rusagesys] = "rusagesys";
375   syscall_table[SYS_schedctl] = "schedctl";
376 #ifdef SYS_secsys
377   syscall_table[SYS_secsys] = "secsys";
378 #endif
379   syscall_table[SYS_semsys] = "semsys";
380   syscall_table[SYS_send] = "send";
381   syscall_table[SYS_sendfilev] = "sendfilev";
382 #ifdef SYS_sendmmsg
383   syscall_table[SYS_sendmmsg] = "sendmmsg";
384 #endif
385   syscall_table[SYS_sendmsg] = "sendmsg";
386   syscall_table[SYS_sendto] = "sendto";
387   syscall_table[SYS_setegid] = "setegid";
388   syscall_table[SYS_seteuid] = "seteuid";
389   syscall_table[SYS_setgid] = "setgid";
390   syscall_table[SYS_setgroups] = "setgroups";
391   syscall_table[SYS_setitimer] = "setitimer";
392   syscall_table[SYS_setregid] = "setregid";
393   syscall_table[SYS_setreuid] = "setreuid";
394   syscall_table[SYS_setrlimit] = "setrlimit";
395   syscall_table[SYS_setrlimit64] = "setrlimit64";
396   syscall_table[SYS_setsockopt] = "setsockopt";
397   syscall_table[SYS_setuid] = "setuid";
398   syscall_table[SYS_sharefs] = "sharefs";
399   syscall_table[SYS_shmsys] = "shmsys";
400   syscall_table[SYS_shutdown] = "shutdown";
401 #ifdef SYS_sidsys
402   syscall_table[SYS_sidsys] = "sidsys";
403 #endif
404   syscall_table[SYS_sigaction] = "sigaction";
405   syscall_table[SYS_sigaltstack] = "sigaltstack";
406 #ifdef SYS_signal
407   syscall_table[SYS_signal] = "signal";
408 #endif
409   syscall_table[SYS_signotify] = "signotify";
410   syscall_table[SYS_sigpending] = "sigpending";
411   syscall_table[SYS_sigprocmask] = "sigprocmask";
412   syscall_table[SYS_sigqueue] = "sigqueue";
413 #ifdef SYS_sigresend
414   syscall_table[SYS_sigresend] = "sigresend";
415 #endif
416   syscall_table[SYS_sigsendsys] = "sigsendsys";
417   syscall_table[SYS_sigsuspend] = "sigsuspend";
418   syscall_table[SYS_sigtimedwait] = "sigtimedwait";
419   syscall_table[SYS_so_socket] = "so_socket";
420   syscall_table[SYS_so_socketpair] = "so_socketpair";
421   syscall_table[SYS_sockconfig] = "sockconfig";
422 #ifdef SYS_sparc_fixalign
423   syscall_table[SYS_sparc_fixalign] = "sparc_fixalign";
424 #endif
425   syscall_table[SYS_sparc_utrap_install] = "sparc_utrap_install";
426 #ifdef SYS_spawn
427   syscall_table[SYS_spawn] = "spawn";
428 #endif
429 #ifdef SYS_stat
430   syscall_table[SYS_stat] = "stat";
431 #endif
432 #ifdef SYS_stat64
433   syscall_table[SYS_stat64] = "stat64";
434 #endif
435   syscall_table[SYS_statfs] = "statfs";
436   syscall_table[SYS_statvfs] = "statvfs";
437   syscall_table[SYS_statvfs64] = "statvfs64";
438   syscall_table[SYS_stime] = "stime";
439   syscall_table[SYS_stty] = "stty";
440 #ifdef SYS_symlink
441   syscall_table[SYS_symlink] = "symlink";
442 #endif
443 #ifdef SYS_symlinkat
444   syscall_table[SYS_symlinkat] = "symlinkat";
445 #endif
446   syscall_table[SYS_sync] = "sync";
447   syscall_table[SYS_syscall] = "syscall";
448   syscall_table[SYS_sysconfig] = "sysconfig";
449   syscall_table[SYS_sysfs] = "sysfs";
450   syscall_table[SYS_sysi86] = "sysi86";
451 #ifdef SYS_syssun
452   syscall_table[SYS_syssun] = "syssun";
453 #endif
454 #ifdef SYS_system_stats
455   syscall_table[SYS_system_stats] = "system_stats";
456 #endif
457   syscall_table[SYS_systeminfo] = "systeminfo";
458   syscall_table[SYS_tasksys] = "tasksys";
459   syscall_table[SYS_time] = "time";
460   syscall_table[SYS_timer_create] = "timer_create";
461   syscall_table[SYS_timer_delete] = "timer_delete";
462   syscall_table[SYS_timer_getoverrun] = "timer_getoverrun";
463   syscall_table[SYS_timer_gettime] = "timer_gettime";
464   syscall_table[SYS_timer_settime] = "timer_settime";
465   syscall_table[SYS_times] = "times";
466   syscall_table[SYS_uadmin] = "uadmin";
467   syscall_table[SYS_ucredsys] = "ucredsys";
468   syscall_table[SYS_ulimit] = "ulimit";
469   syscall_table[SYS_umask] = "umask";
470 #ifdef SYS_umount
471   syscall_table[SYS_umount] = "umount";
472 #endif
473   syscall_table[SYS_umount2] = "umount2";
474   syscall_table[SYS_uname] = "uname";
475 #ifdef SYS_unlink
476   syscall_table[SYS_unlink] = "unlink";
477 #endif
478 #ifdef SYS_unlinkat
479   syscall_table[SYS_unlinkat] = "unlinkat";
480 #endif
481 #ifdef SYS_utime
482   syscall_table[SYS_utime] = "utime";
483 #endif
484 #ifdef SYS_utimensat
485   syscall_table[SYS_utimensat] = "utimensat";
486 #endif
487 #ifdef SYS_utimes
488   syscall_table[SYS_utimes] = "utimes";
489 #endif
490 #ifdef SYS_utimesys
491   syscall_table[SYS_utimesys] = "utimesys";
492 #endif
493   syscall_table[SYS_utssys] = "utssys";
494   syscall_table[SYS_uucopy] = "uucopy";
495   syscall_table[SYS_uucopystr] = "uucopystr";
496 #ifdef SYS_uuidsys
497   syscall_table[SYS_uuidsys] = "uuidsys";
498 #endif
499 #ifdef SYS_va_mask
500   syscall_table[SYS_va_mask] = "va_mask";
501 #endif
502   syscall_table[SYS_vfork] = "vfork";
503   syscall_table[SYS_vhangup] = "vhangup";
504 #ifdef SYS_wait
505   syscall_table[SYS_wait] = "wait";
506 #endif
507 #ifdef SYS_waitid
508   syscall_table[SYS_waitid] = "waitid";
509 #endif
510 #ifdef SYS_waitsys
511   syscall_table[SYS_waitsys] = "waitsys";
512 #endif
513   syscall_table[SYS_write] = "write";
514   syscall_table[SYS_writev] = "writev";
515 #ifdef SYS_xmknod
516   syscall_table[SYS_xmknod] = "xmknod";
517 #endif
518 #ifdef SYS_xstat
519   syscall_table[SYS_xstat] = "xstat";
520 #endif
521   syscall_table[SYS_yield] = "yield";
522   syscall_table[SYS_zone] = "zone";
523 }
524
525 /* Prettyprint syscall NUM.  */
526
527 void
528 proc_prettyfprint_syscall (FILE *file, int num, int verbose)
529 {
530   if (syscall_table[num])
531     fprintf (file, "SYS_%s ", syscall_table[num]);
532   else
533     fprintf (file, "<Unknown syscall %d> ", num);
534 }
535
536 void
537 proc_prettyprint_syscall (int num, int verbose)
538 {
539   proc_prettyfprint_syscall (stdout, num, verbose);
540 }
541
542 /* Prettyprint all syscalls in SYSSET.  */
543
544 void
545 proc_prettyfprint_syscalls (FILE *file, sysset_t *sysset, int verbose)
546 {
547   int i;
548
549   for (i = 0; i < MAX_SYSCALLS; i++)
550     if (prismember (sysset, i))
551       {
552         proc_prettyfprint_syscall (file, i, verbose);
553       }
554   fprintf (file, "\n");
555 }
556
557 void
558 proc_prettyprint_syscalls (sysset_t *sysset, int verbose)
559 {
560   proc_prettyfprint_syscalls (stdout, sysset, verbose);
561 }
562 \f
563 /* Prettyprint signals.  */
564
565 /* Signal translation table, ordered ANSI-standard signals first,
566    other signals second, with signals in each block ordered by their
567    numerical values on a typical POSIX platform.  */
568
569 static struct trans signal_table[] = 
570 {
571   { 0,      "<no signal>", "no signal" }, 
572
573   /* SIGINT, SIGILL, SIGABRT, SIGFPE, SIGSEGV and SIGTERM
574      are ANSI-standard signals and are always available.  */
575
576   { SIGINT, "SIGINT", "Interrupt (rubout)" },
577   { SIGILL, "SIGILL", "Illegal instruction" },  /* not reset when caught */
578   { SIGABRT, "SIGABRT", "used by abort()" },    /* replaces SIGIOT */
579   { SIGFPE, "SIGFPE", "Floating point exception" },
580   { SIGSEGV, "SIGSEGV", "Segmentation violation" },
581   { SIGTERM, "SIGTERM", "Software termination signal from kill" },
582
583   /* All other signals need preprocessor conditionals.  */
584
585   { SIGHUP, "SIGHUP", "Hangup" },
586   { SIGQUIT, "SIGQUIT", "Quit (ASCII FS)" },
587   { SIGTRAP, "SIGTRAP", "Trace trap" },         /* not reset when caught */
588   { SIGIOT, "SIGIOT", "IOT instruction" },
589   { SIGEMT, "SIGEMT", "EMT instruction" },
590   { SIGKILL, "SIGKILL", "Kill" },       /* Solaris: cannot be caught/ignored */
591   { SIGBUS, "SIGBUS", "Bus error" },
592   { SIGSYS, "SIGSYS", "Bad argument to system call" },
593   { SIGPIPE, "SIGPIPE", "Write to pipe with no one to read it" },
594   { SIGALRM, "SIGALRM", "Alarm clock" },
595   { SIGUSR1, "SIGUSR1", "User defined signal 1" },
596   { SIGUSR2, "SIGUSR2", "User defined signal 2" },
597   { SIGCHLD, "SIGCHLD", "Child status changed" },       /* Posix version */
598   { SIGCLD, "SIGCLD", "Child status changed" },         /* Solaris version */
599   { SIGPWR, "SIGPWR", "Power-fail restart" },
600   { SIGWINCH, "SIGWINCH", "Window size change" },
601   { SIGURG, "SIGURG", "Urgent socket condition" },
602   { SIGPOLL, "SIGPOLL", "Pollable event" },
603   { SIGIO, "SIGIO", "Socket I/O possible" },    /* alias for SIGPOLL */
604   { SIGSTOP, "SIGSTOP", "Stop, not from tty" }, /* cannot be caught or
605                                                    ignored */
606   { SIGTSTP, "SIGTSTP", "User stop from tty" },
607   { SIGCONT, "SIGCONT", "Stopped process has been continued" },
608   { SIGTTIN, "SIGTTIN", "Background tty read attempted" },
609   { SIGTTOU, "SIGTTOU", "Background tty write attempted" },
610   { SIGVTALRM, "SIGVTALRM", "Virtual timer expired" },
611   { SIGPROF, "SIGPROF", "Profiling timer expired" },
612   { SIGXCPU, "SIGXCPU", "Exceeded CPU limit" },
613   { SIGXFSZ, "SIGXFSZ", "Exceeded file size limit" },
614   { SIGWAITING, "SIGWAITING", "Process's LWPs are blocked" },
615   { SIGLWP, "SIGLWP", "Used by thread library" },
616   { SIGFREEZE, "SIGFREEZE", "Used by CPR" },
617   { SIGTHAW, "SIGTHAW", "Used by CPR" },
618   { SIGCANCEL, "SIGCANCEL", "Used by libthread" },
619   { SIGLOST, "SIGLOST", "Resource lost" },
620
621   /* FIXME: add real-time signals.  */
622 };
623
624 /* Prettyprint signal number SIGNO.  */
625
626 void
627 proc_prettyfprint_signal (FILE *file, int signo, int verbose)
628 {
629   int i;
630
631   for (i = 0; i < sizeof (signal_table) / sizeof (signal_table[0]); i++)
632     if (signo == signal_table[i].value)
633       {
634         fprintf (file, "%s", signal_table[i].name);
635         if (verbose)
636           fprintf (file, ": %s\n", signal_table[i].desc);
637         else
638           fprintf (file, " ");
639         return;
640       }
641   fprintf (file, "Unknown signal %d%c", signo, verbose ? '\n' : ' ');
642 }
643
644 void
645 proc_prettyprint_signal (int signo, int verbose)
646 {
647   proc_prettyfprint_signal (stdout, signo, verbose);
648 }
649
650 /* Prettyprint all signals in SIGSET.  */
651
652 void
653 proc_prettyfprint_signalset (FILE *file, sigset_t *sigset, int verbose)
654 {
655   int i;
656
657   /* Loop over all signal numbers from 0 to NSIG, using them as the
658      index to prismember.  The signal table had better not contain
659      aliases, for if it does they will both be printed.  */
660
661   for (i = 0; i < NSIG; i++)
662     if (prismember (sigset, i))
663       proc_prettyfprint_signal (file, i, verbose);
664
665   if (!verbose)
666     fprintf (file, "\n");
667 }
668
669 void
670 proc_prettyprint_signalset (sigset_t *sigset, int verbose)
671 {
672   proc_prettyfprint_signalset (stdout, sigset, verbose);
673 }
674 \f
675
676 /* Prettyprint faults.  */
677
678 /* Fault translation table.  */
679
680 static struct trans fault_table[] =
681 {
682   { FLTILL, "FLTILL", "Illegal instruction" },
683   { FLTPRIV, "FLTPRIV", "Privileged instruction" },
684   { FLTBPT, "FLTBPT", "Breakpoint trap" },
685   { FLTTRACE, "FLTTRACE", "Trace trap" },
686   { FLTACCESS, "FLTACCESS", "Memory access fault" },
687   { FLTBOUNDS, "FLTBOUNDS", "Memory bounds violation" },
688   { FLTIOVF, "FLTIOVF", "Integer overflow" },
689   { FLTIZDIV, "FLTIZDIV", "Integer zero divide" },
690   { FLTFPE, "FLTFPE", "Floating-point exception" },
691   { FLTSTACK, "FLTSTACK", "Unrecoverable stack fault" },
692   { FLTPAGE, "FLTPAGE", "Recoverable page fault" },
693   { FLTWATCH, "FLTWATCH", "User watchpoint" },
694 };
695
696 /* Work horse.  Accepts an index into the fault table, prints it
697    pretty.  */
698
699 static void
700 prettyfprint_faulttable_entry (FILE *file, int i, int verbose)
701 {
702   fprintf (file, "%s", fault_table[i].name);
703   if (verbose)
704     fprintf (file, ": %s\n", fault_table[i].desc);
705   else
706     fprintf (file, " ");
707 }
708
709 /* Prettyprint hardware fault number FAULTNO.  */
710
711 void
712 proc_prettyfprint_fault (FILE *file, int faultno, int verbose)
713 {
714   int i;
715
716   for (i = 0; i < ARRAY_SIZE (fault_table); i++)
717     if (faultno == fault_table[i].value)
718       {
719         prettyfprint_faulttable_entry (file, i, verbose);
720         return;
721       }
722
723   fprintf (file, "Unknown hardware fault %d%c", 
724            faultno, verbose ? '\n' : ' ');
725 }
726
727 void
728 proc_prettyprint_fault (int faultno, int verbose)
729 {
730   proc_prettyfprint_fault (stdout, faultno, verbose);
731 }
732
733 /* Prettyprint all faults in FLTSET.  */
734
735 void
736 proc_prettyfprint_faultset (FILE *file, fltset_t *fltset, int verbose)
737 {
738   int i;
739
740   /* Loop through the fault table, using the value field as the index
741      to prismember.  The fault table had better not contain aliases,
742      for if it does they will both be printed.  */
743
744   for (i = 0; i < ARRAY_SIZE (fault_table); i++)
745     if (prismember (fltset, fault_table[i].value))
746       prettyfprint_faulttable_entry (file, i, verbose);
747
748   if (!verbose)
749     fprintf (file, "\n");
750 }
751
752 void
753 proc_prettyprint_faultset (fltset_t *fltset, int verbose)
754 {
755   proc_prettyfprint_faultset (stdout, fltset, verbose);
756 }
757
758 /* TODO: actions, holds...  */
759
760 void
761 proc_prettyprint_actionset (struct sigaction *actions, int verbose)
762 {
763 }
764
765 void
766 _initialize_proc_events (void)
767 {
768   init_syscall_table ();
769 }