set varsize-limit: New GDB setting for maximum dynamic object size
[external/binutils.git] / gdb / proc-events.c
1 /* Machine-independent support for Solaris /proc (process file system)
2
3    Copyright (C) 1999-2018 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   syscall_table[SYS_uuidsys] = "uuidsys";
497 #ifdef SYS_va_mask
498   syscall_table[SYS_va_mask] = "va_mask";
499 #endif
500   syscall_table[SYS_vfork] = "vfork";
501   syscall_table[SYS_vhangup] = "vhangup";
502 #ifdef SYS_wait
503   syscall_table[SYS_wait] = "wait";
504 #endif
505 #ifdef SYS_waitid
506   syscall_table[SYS_waitid] = "waitid";
507 #endif
508 #ifdef SYS_waitsys
509   syscall_table[SYS_waitsys] = "waitsys";
510 #endif
511   syscall_table[SYS_write] = "write";
512   syscall_table[SYS_writev] = "writev";
513 #ifdef SYS_xmknod
514   syscall_table[SYS_xmknod] = "xmknod";
515 #endif
516 #ifdef SYS_xstat
517   syscall_table[SYS_xstat] = "xstat";
518 #endif
519   syscall_table[SYS_yield] = "yield";
520   syscall_table[SYS_zone] = "zone";
521 }
522
523 /* Prettyprint syscall NUM.  */
524
525 void
526 proc_prettyfprint_syscall (FILE *file, int num, int verbose)
527 {
528   if (syscall_table[num])
529     fprintf (file, "SYS_%s ", syscall_table[num]);
530   else
531     fprintf (file, "<Unknown syscall %d> ", num);
532 }
533
534 void
535 proc_prettyprint_syscall (int num, int verbose)
536 {
537   proc_prettyfprint_syscall (stdout, num, verbose);
538 }
539
540 /* Prettyprint all syscalls in SYSSET.  */
541
542 void
543 proc_prettyfprint_syscalls (FILE *file, sysset_t *sysset, int verbose)
544 {
545   int i;
546
547   for (i = 0; i < MAX_SYSCALLS; i++)
548     if (prismember (sysset, i))
549       {
550         proc_prettyfprint_syscall (file, i, verbose);
551       }
552   fprintf (file, "\n");
553 }
554
555 void
556 proc_prettyprint_syscalls (sysset_t *sysset, int verbose)
557 {
558   proc_prettyfprint_syscalls (stdout, sysset, verbose);
559 }
560 \f
561 /* Prettyprint signals.  */
562
563 /* Signal translation table, ordered ANSI-standard signals first,
564    other signals second, with signals in each block ordered by their
565    numerical values on a typical POSIX platform.  */
566
567 static struct trans signal_table[] = 
568 {
569   { 0,      "<no signal>", "no signal" }, 
570
571   /* SIGINT, SIGILL, SIGABRT, SIGFPE, SIGSEGV and SIGTERM
572      are ANSI-standard signals and are always available.  */
573
574   { SIGINT, "SIGINT", "Interrupt (rubout)" },
575   { SIGILL, "SIGILL", "Illegal instruction" },  /* not reset when caught */
576   { SIGABRT, "SIGABRT", "used by abort()" },    /* replaces SIGIOT */
577   { SIGFPE, "SIGFPE", "Floating point exception" },
578   { SIGSEGV, "SIGSEGV", "Segmentation violation" },
579   { SIGTERM, "SIGTERM", "Software termination signal from kill" },
580
581   /* All other signals need preprocessor conditionals.  */
582
583   { SIGHUP, "SIGHUP", "Hangup" },
584   { SIGQUIT, "SIGQUIT", "Quit (ASCII FS)" },
585   { SIGTRAP, "SIGTRAP", "Trace trap" },         /* not reset when caught */
586   { SIGIOT, "SIGIOT", "IOT instruction" },
587   { SIGEMT, "SIGEMT", "EMT instruction" },
588   { SIGKILL, "SIGKILL", "Kill" },       /* Solaris: cannot be caught/ignored */
589   { SIGBUS, "SIGBUS", "Bus error" },
590   { SIGSYS, "SIGSYS", "Bad argument to system call" },
591   { SIGPIPE, "SIGPIPE", "Write to pipe with no one to read it" },
592   { SIGALRM, "SIGALRM", "Alarm clock" },
593   { SIGUSR1, "SIGUSR1", "User defined signal 1" },
594   { SIGUSR2, "SIGUSR2", "User defined signal 2" },
595   { SIGCHLD, "SIGCHLD", "Child status changed" },       /* Posix version */
596   { SIGCLD, "SIGCLD", "Child status changed" },         /* Solaris version */
597   { SIGPWR, "SIGPWR", "Power-fail restart" },
598   { SIGWINCH, "SIGWINCH", "Window size change" },
599   { SIGURG, "SIGURG", "Urgent socket condition" },
600   { SIGPOLL, "SIGPOLL", "Pollable event" },
601   { SIGIO, "SIGIO", "Socket I/O possible" },    /* alias for SIGPOLL */
602   { SIGSTOP, "SIGSTOP", "Stop, not from tty" }, /* cannot be caught or
603                                                    ignored */
604   { SIGTSTP, "SIGTSTP", "User stop from tty" },
605   { SIGCONT, "SIGCONT", "Stopped process has been continued" },
606   { SIGTTIN, "SIGTTIN", "Background tty read attempted" },
607   { SIGTTOU, "SIGTTOU", "Background tty write attempted" },
608   { SIGVTALRM, "SIGVTALRM", "Virtual timer expired" },
609   { SIGPROF, "SIGPROF", "Profiling timer expired" },
610   { SIGXCPU, "SIGXCPU", "Exceeded CPU limit" },
611   { SIGXFSZ, "SIGXFSZ", "Exceeded file size limit" },
612   { SIGWAITING, "SIGWAITING", "Process's LWPs are blocked" },
613   { SIGLWP, "SIGLWP", "Used by thread library" },
614   { SIGFREEZE, "SIGFREEZE", "Used by CPR" },
615   { SIGTHAW, "SIGTHAW", "Used by CPR" },
616   { SIGCANCEL, "SIGCANCEL", "Used by libthread" },
617   { SIGLOST, "SIGLOST", "Resource lost" },
618
619   /* FIXME: add real-time signals.  */
620 };
621
622 /* Prettyprint signal number SIGNO.  */
623
624 void
625 proc_prettyfprint_signal (FILE *file, int signo, int verbose)
626 {
627   int i;
628
629   for (i = 0; i < sizeof (signal_table) / sizeof (signal_table[0]); i++)
630     if (signo == signal_table[i].value)
631       {
632         fprintf (file, "%s", signal_table[i].name);
633         if (verbose)
634           fprintf (file, ": %s\n", signal_table[i].desc);
635         else
636           fprintf (file, " ");
637         return;
638       }
639   fprintf (file, "Unknown signal %d%c", signo, verbose ? '\n' : ' ');
640 }
641
642 void
643 proc_prettyprint_signal (int signo, int verbose)
644 {
645   proc_prettyfprint_signal (stdout, signo, verbose);
646 }
647
648 /* Prettyprint all signals in SIGSET.  */
649
650 void
651 proc_prettyfprint_signalset (FILE *file, sigset_t *sigset, int verbose)
652 {
653   int i;
654
655   /* Loop over all signal numbers from 0 to NSIG, using them as the
656      index to prismember.  The signal table had better not contain
657      aliases, for if it does they will both be printed.  */
658
659   for (i = 0; i < NSIG; i++)
660     if (prismember (sigset, i))
661       proc_prettyfprint_signal (file, i, verbose);
662
663   if (!verbose)
664     fprintf (file, "\n");
665 }
666
667 void
668 proc_prettyprint_signalset (sigset_t *sigset, int verbose)
669 {
670   proc_prettyfprint_signalset (stdout, sigset, verbose);
671 }
672 \f
673
674 /* Prettyprint faults.  */
675
676 /* Fault translation table.  */
677
678 static struct trans fault_table[] =
679 {
680   { FLTILL, "FLTILL", "Illegal instruction" },
681   { FLTPRIV, "FLTPRIV", "Privileged instruction" },
682   { FLTBPT, "FLTBPT", "Breakpoint trap" },
683   { FLTTRACE, "FLTTRACE", "Trace trap" },
684   { FLTACCESS, "FLTACCESS", "Memory access fault" },
685   { FLTBOUNDS, "FLTBOUNDS", "Memory bounds violation" },
686   { FLTIOVF, "FLTIOVF", "Integer overflow" },
687   { FLTIZDIV, "FLTIZDIV", "Integer zero divide" },
688   { FLTFPE, "FLTFPE", "Floating-point exception" },
689   { FLTSTACK, "FLTSTACK", "Unrecoverable stack fault" },
690   { FLTPAGE, "FLTPAGE", "Recoverable page fault" },
691   { FLTWATCH, "FLTWATCH", "User watchpoint" },
692 };
693
694 /* Work horse.  Accepts an index into the fault table, prints it
695    pretty.  */
696
697 static void
698 prettyfprint_faulttable_entry (FILE *file, int i, int verbose)
699 {
700   fprintf (file, "%s", fault_table[i].name);
701   if (verbose)
702     fprintf (file, ": %s\n", fault_table[i].desc);
703   else
704     fprintf (file, " ");
705 }
706
707 /* Prettyprint hardware fault number FAULTNO.  */
708
709 void
710 proc_prettyfprint_fault (FILE *file, int faultno, int verbose)
711 {
712   int i;
713
714   for (i = 0; i < ARRAY_SIZE (fault_table); i++)
715     if (faultno == fault_table[i].value)
716       {
717         prettyfprint_faulttable_entry (file, i, verbose);
718         return;
719       }
720
721   fprintf (file, "Unknown hardware fault %d%c", 
722            faultno, verbose ? '\n' : ' ');
723 }
724
725 void
726 proc_prettyprint_fault (int faultno, int verbose)
727 {
728   proc_prettyfprint_fault (stdout, faultno, verbose);
729 }
730
731 /* Prettyprint all faults in FLTSET.  */
732
733 void
734 proc_prettyfprint_faultset (FILE *file, fltset_t *fltset, int verbose)
735 {
736   int i;
737
738   /* Loop through the fault table, using the value field as the index
739      to prismember.  The fault table had better not contain aliases,
740      for if it does they will both be printed.  */
741
742   for (i = 0; i < ARRAY_SIZE (fault_table); i++)
743     if (prismember (fltset, fault_table[i].value))
744       prettyfprint_faulttable_entry (file, i, verbose);
745
746   if (!verbose)
747     fprintf (file, "\n");
748 }
749
750 void
751 proc_prettyprint_faultset (fltset_t *fltset, int verbose)
752 {
753   proc_prettyfprint_faultset (stdout, fltset, verbose);
754 }
755
756 /* TODO: actions, holds...  */
757
758 void
759 proc_prettyprint_actionset (struct sigaction *actions, int verbose)
760 {
761 }
762
763 void
764 _initialize_proc_events (void)
765 {
766   init_syscall_table ();
767 }