1997-12-06 05:23:12 +00:00
|
|
|
/*
|
1997-12-20 18:40:43 +00:00
|
|
|
* See i386-fbsd.c for copyright and license terms.
|
|
|
|
*
|
1997-12-06 05:23:12 +00:00
|
|
|
* System call arguments come in several flavours:
|
|
|
|
* Hex -- values that should be printed in hex (addresses)
|
|
|
|
* Octal -- Same as above, but octal
|
|
|
|
* Int -- normal integer values (file descriptors, for example)
|
2014-10-13 16:37:06 +00:00
|
|
|
* LongHex -- long value that should be printed in hex
|
- Add decoding of kse_release, kevent, sigprocmask, unmount, socket, getrusage,
rename, __getcwd, shutdown, getrlimit, setrlimit, _umtx_lock, _umtx_unlock,
pathconf, truncate, ftruncate, kill
- Decode more arguments of open, mprot, *stat, and fcntl.
- Convert all constant-macro and bitfield decoding to lookup tables; much
cleaner than previous code.
- Print the timestamp of process exit and signal reception when -d or -D are in
use
- Try six times with 1/2 second delay to debug the child
PR: bin/52190 (updated)
Submitted by: Dan Nelson <dnelson@allantgroup.com>
Approved by: alfred
2006-05-15 21:18:28 +00:00
|
|
|
* Name -- pointer to a NULL-terminated string.
|
|
|
|
* BinString -- pointer to an array of chars, printed via strvisx().
|
|
|
|
* Ptr -- pointer to some unspecified structure. Just print as hex for now.
|
|
|
|
* Stat -- a pointer to a stat buffer. Prints a couple fields.
|
2017-06-23 18:06:46 +00:00
|
|
|
* Stat11 -- a pointer to a freebsd 11 stat buffer. Prints a couple fields.
|
2015-10-03 18:57:15 +00:00
|
|
|
* StatFs -- a pointer to a statfs buffer. Prints a few fields.
|
1997-12-06 06:51:14 +00:00
|
|
|
* Ioctl -- an ioctl command. Woefully limited.
|
Add support for decoding Timespec, Timeval, Itimerval, Pollfd,
Fd_set and Sigaction structures. Use these for printing the arguments
to sigaction(), nanosleep(), select(), poll(), gettimeofday(),
clock_gettime(), recvfrom(), getitimer() and setitimer().
This is based on Dan's patch from the PR but I've hacked it for
style and some other issues. While Dan has checked this patch, any
goofs are probably my fault.
(The PR also contains support for the dual return values of pipe().
These will follow once I've ported that support to platforms other
than i386.)
PR: 52190
Submitted by: Dan Nelson <dnelson@allantgroup.com>
2004-03-23 12:37:02 +00:00
|
|
|
* Quad -- a double-word value. e.g., lseek(int, offset_t, int)
|
|
|
|
* Signal -- a signal number. Prints the signal name (SIGxxx)
|
|
|
|
* Sockaddr -- a pointer to a struct sockaddr. Prints symbolic AF, and IP:Port
|
|
|
|
* StringArray -- a pointer to an array of string pointers.
|
|
|
|
* Timespec -- a pointer to a struct timespec. Prints both elements.
|
|
|
|
* Timeval -- a pointer to a struct timeval. Prints both elements.
|
- Add decoding of kse_release, kevent, sigprocmask, unmount, socket, getrusage,
rename, __getcwd, shutdown, getrlimit, setrlimit, _umtx_lock, _umtx_unlock,
pathconf, truncate, ftruncate, kill
- Decode more arguments of open, mprot, *stat, and fcntl.
- Convert all constant-macro and bitfield decoding to lookup tables; much
cleaner than previous code.
- Print the timestamp of process exit and signal reception when -d or -D are in
use
- Try six times with 1/2 second delay to debug the child
PR: bin/52190 (updated)
Submitted by: Dan Nelson <dnelson@allantgroup.com>
Approved by: alfred
2006-05-15 21:18:28 +00:00
|
|
|
* Timeval2 -- a pointer to two struct timevals. Prints both elements of both.
|
Add support for decoding Timespec, Timeval, Itimerval, Pollfd,
Fd_set and Sigaction structures. Use these for printing the arguments
to sigaction(), nanosleep(), select(), poll(), gettimeofday(),
clock_gettime(), recvfrom(), getitimer() and setitimer().
This is based on Dan's patch from the PR but I've hacked it for
style and some other issues. While Dan has checked this patch, any
goofs are probably my fault.
(The PR also contains support for the dual return values of pipe().
These will follow once I've ported that support to platforms other
than i386.)
PR: 52190
Submitted by: Dan Nelson <dnelson@allantgroup.com>
2004-03-23 12:37:02 +00:00
|
|
|
* Itimerval -- a pointer to a struct itimerval. Prints all elements.
|
|
|
|
* Pollfd -- a pointer to an array of struct pollfd. Prints .fd and .events.
|
|
|
|
* Fd_set -- a pointer to an array of fd_set. Prints the fds that are set.
|
|
|
|
* Sigaction -- a pointer to a struct sigaction. Prints all elements.
|
- Add decoding of kse_release, kevent, sigprocmask, unmount, socket, getrusage,
rename, __getcwd, shutdown, getrlimit, setrlimit, _umtx_lock, _umtx_unlock,
pathconf, truncate, ftruncate, kill
- Decode more arguments of open, mprot, *stat, and fcntl.
- Convert all constant-macro and bitfield decoding to lookup tables; much
cleaner than previous code.
- Print the timestamp of process exit and signal reception when -d or -D are in
use
- Try six times with 1/2 second delay to debug the child
PR: bin/52190 (updated)
Submitted by: Dan Nelson <dnelson@allantgroup.com>
Approved by: alfred
2006-05-15 21:18:28 +00:00
|
|
|
* Sigset -- a pointer to a sigset_t. Prints the signals that are set.
|
|
|
|
* Sigprocmask -- the first argument to sigprocmask(). Prints the name.
|
|
|
|
* Kevent -- a pointer to an array of struct kevents. Prints all elements.
|
2008-07-31 17:15:21 +00:00
|
|
|
* Pathconf -- the 2nd argument of pathconf().
|
2015-10-06 21:58:38 +00:00
|
|
|
* Utrace -- utrace(2) buffer.
|
2017-06-02 13:33:50 +00:00
|
|
|
* CapRights -- a pointer to a cap_rights_t. Prints all set capabilities.
|
1997-12-06 05:23:12 +00:00
|
|
|
*
|
|
|
|
* In addition, the pointer types (String, Ptr) may have OUT masked in --
|
|
|
|
* this means that the data is set on *return* from the system call -- or
|
|
|
|
* IN (meaning that the data is passed *into* the system call).
|
|
|
|
*/
|
|
|
|
/*
|
1999-08-28 01:08:13 +00:00
|
|
|
* $FreeBSD$
|
1997-12-06 05:23:12 +00:00
|
|
|
*/
|
|
|
|
|
2017-06-23 18:06:46 +00:00
|
|
|
enum Argtype { None = 1, Hex, Octal, Int, UInt, LongHex, Name, Ptr, Stat, Stat11, Ioctl,
|
2015-10-08 05:27:45 +00:00
|
|
|
Quad, Signal, Sockaddr, StringArray, Timespec, Timeval, Itimerval,
|
|
|
|
Pollfd, Fd_set, Sigaction, Fcntl, Mprot, Mmapflags, Whence, Readlinkres,
|
2015-10-03 18:57:15 +00:00
|
|
|
Sigset, Sigprocmask, StatFs, Kevent, Sockdomain, Socktype, Open,
|
2017-06-03 14:22:15 +00:00
|
|
|
Fcntlflag, Rusage, RusageWho, BinString, Shutdown, Resource, Rlimit,
|
|
|
|
Timeval2, Pathconf, Rforkflags, ExitStatus, Waitoptions, Idtype, Procctl,
|
- Decode the arguments for several signal-related system calls: sigpending,
sigqueue, sigreturn, sigsuspend, sigtimedwait, sigwait, sigwaitinfo, and
thr_kill.
- Print signal sets as a structure (with {}'s) and in particular use this to
differentiate empty sets from a NULL pointer.
- Decode arguments for some other system calls: issetugid, pipe2, sysarch
(operations are only decoded for amd64 and i386), and thr_self.
2015-08-17 17:52:28 +00:00
|
|
|
LinuxSockArgs, Umtxop, Atfd, Atflags, Timespec2, Accessmode, Long,
|
Move mksubr from kdump into libsysdecode.
Restructure this script so that it generates a header of tables instead
of a source file. The tables are included in a flags.c source file which
provides functions to decode various system call arguments.
For functions that decode an enumeration, the function returns a pointer
to a string for known values and NULL for unknown values.
For functions that do more complex decoding (typically of a bitmask), the
function accepts a pointer to a FILE object (open_memstream() can be used
as a string builder) to which decoded values are written. If the
function operates on a bitmask, the function returns true if any bits
were decoded or false if the entire value was valid. Additionally, the
third argument accepts a pointer to a value to which any undecoded bits
are stored. This pointer can be NULL if the caller doesn't care about
remaining bits.
Convert kdump over to using decoder functions from libsysdecode instead of
mksubr. truss also uses decoders from libsysdecode instead of private
lookup tables, though lookup tables for objects not decoded by kdump remain
in truss for now. Eventually most of these tables should move into
libsysdecode as the automated table generation approach from mksubr is
less stale than the static tables in truss.
Some changes have been made to truss and kdump output:
- The flags passed to open() are now properly decoded in that one of
O_RDONLY, O_RDWR, O_WRONLY, or O_EXEC is always included in a decoded
mask.
- Optional arguments to open(), openat(), and fcntl() are only printed
in kdump if they exist (e.g. the mode is only printed for open() if
O_CREAT is set in the flags).
- Print argument to F_GETLK/SETLK/SETLKW in kdump as a pointer, not int.
- Include all procctl() commands.
- Correctly decode pipe2() flags in truss by not assuming full
open()-like flags with O_RDONLY, etc.
- Decode file flags passed to *chflags() as file flags (UF_* and SF_*)
rather than as a file mode.
- Fix decoding of quotactl() commands by splitting out the two command
components instead of assuming the raw command value matches the
primary command component.
In addition, truss and kdump now build without triggering any warnings.
All of the sysdecode manpages now include the required headers in the
synopsis.
Reviewed by: kib (several older versions), wblock (manpages)
MFC after: 2 months
Differential Revision: https://reviews.freebsd.org/D7847
2016-10-17 22:37:07 +00:00
|
|
|
Sysarch, ExecArgs, ExecEnv, PipeFds, QuadHex, Utrace, IntArray, Pipe2,
|
2017-03-18 19:59:21 +00:00
|
|
|
CapFcntlRights, Fadvice, FileFlags, Flockop, Getfsstatmode, Kldsymcmd,
|
2017-05-03 12:18:09 +00:00
|
|
|
Kldunloadflags, Sizet, Madvice, Socklent, Sockprotocol, Sockoptlevel,
|
2017-06-08 03:51:17 +00:00
|
|
|
Sockoptname, Msgflags, CapRights, PUInt, PQuadHex, Acltype,
|
2017-06-10 00:37:02 +00:00
|
|
|
Extattrnamespace, Minherit, Mlockall, Mountflags, Msync, Priowhich,
|
2017-06-16 20:03:09 +00:00
|
|
|
Ptraceop, Quotactlcmd, Reboothowto, Rtpriofunc, Schedpolicy, Schedparam,
|
2017-11-25 04:49:12 +00:00
|
|
|
PSig, Siginfo, Kevent11,
|
2015-10-08 05:27:45 +00:00
|
|
|
|
|
|
|
CloudABIAdvice, CloudABIClockID, ClouduABIFDSFlags,
|
|
|
|
CloudABIFDStat, CloudABIFileStat, CloudABIFileType,
|
|
|
|
CloudABIFSFlags, CloudABILookup, CloudABIMFlags, CloudABIMProt,
|
|
|
|
CloudABIMSFlags, CloudABIOFlags, CloudABISDFlags,
|
|
|
|
CloudABISignal, CloudABISockStat, CloudABISSFlags,
|
|
|
|
CloudABITimestamp, CloudABIULFlags, CloudABIWhence };
|
1997-12-06 05:23:12 +00:00
|
|
|
|
2012-09-02 11:03:18 +00:00
|
|
|
#define ARG_MASK 0xff
|
|
|
|
#define OUT 0x100
|
|
|
|
#define IN /*0x20*/0
|
1997-12-06 05:23:12 +00:00
|
|
|
|
|
|
|
struct syscall_args {
|
|
|
|
enum Argtype type;
|
|
|
|
int offset;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct syscall {
|
2015-10-05 18:08:35 +00:00
|
|
|
STAILQ_ENTRY(syscall) entries;
|
2001-12-11 23:34:02 +00:00
|
|
|
const char *name;
|
2015-09-30 19:13:32 +00:00
|
|
|
u_int ret_type; /* 0, 1, or 2 return values */
|
|
|
|
u_int nargs; /* actual number of meaningful arguments */
|
1997-12-06 05:23:12 +00:00
|
|
|
/* Hopefully, no syscalls with > 10 args */
|
|
|
|
struct syscall_args args[10];
|
2009-05-12 20:42:12 +00:00
|
|
|
struct timespec time; /* Time spent for this call */
|
|
|
|
int ncalls; /* Number of calls */
|
|
|
|
int nerror; /* Number of calls that returned with error */
|
2016-12-06 00:39:00 +00:00
|
|
|
bool unknown; /* Unknown system call */
|
1997-12-06 05:23:12 +00:00
|
|
|
};
|
|
|
|
|
2016-12-06 00:39:00 +00:00
|
|
|
struct syscall *get_syscall(struct threadinfo *, u_int, u_int);
|
2015-09-30 19:13:32 +00:00
|
|
|
char *print_arg(struct syscall_args *, unsigned long*, long *, struct trussinfo *);
|
2014-04-24 14:12:35 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Linux Socket defines
|
|
|
|
*/
|
|
|
|
#define LINUX_SOCKET 1
|
|
|
|
#define LINUX_BIND 2
|
|
|
|
#define LINUX_CONNECT 3
|
|
|
|
#define LINUX_LISTEN 4
|
|
|
|
#define LINUX_ACCEPT 5
|
|
|
|
#define LINUX_GETSOCKNAME 6
|
|
|
|
#define LINUX_GETPEERNAME 7
|
|
|
|
#define LINUX_SOCKETPAIR 8
|
|
|
|
#define LINUX_SEND 9
|
|
|
|
#define LINUX_RECV 10
|
|
|
|
#define LINUX_SENDTO 11
|
|
|
|
#define LINUX_RECVFROM 12
|
|
|
|
#define LINUX_SHUTDOWN 13
|
|
|
|
#define LINUX_SETSOCKOPT 14
|
|
|
|
#define LINUX_GETSOCKOPT 15
|
|
|
|
#define LINUX_SENDMSG 16
|
2015-09-30 00:08:24 +00:00
|
|
|
#define LINUX_RECVMSG 17
|
2014-04-24 14:12:35 +00:00
|
|
|
|
|
|
|
#define PAD_(t) (sizeof(register_t) <= sizeof(t) ? \
|
|
|
|
0 : sizeof(register_t) - sizeof(t))
|
2015-09-30 00:08:24 +00:00
|
|
|
|
2014-04-24 14:12:35 +00:00
|
|
|
#if BYTE_ORDER == LITTLE_ENDIAN
|
|
|
|
#define PADL_(t) 0
|
|
|
|
#define PADR_(t) PAD_(t)
|
|
|
|
#else
|
|
|
|
#define PADL_(t) PAD_(t)
|
|
|
|
#define PADR_(t) 0
|
|
|
|
#endif
|
|
|
|
|
|
|
|
typedef int l_int;
|
|
|
|
typedef uint32_t l_ulong;
|
|
|
|
|
|
|
|
struct linux_socketcall_args {
|
|
|
|
char what_l_[PADL_(l_int)]; l_int what; char what_r_[PADR_(l_int)];
|
|
|
|
char args_l_[PADL_(l_ulong)]; l_ulong args; char args_r_[PADR_(l_ulong)];
|
|
|
|
};
|
|
|
|
|
2015-10-05 18:08:35 +00:00
|
|
|
void init_syscalls(void);
|
2016-02-16 22:00:01 +00:00
|
|
|
void print_syscall(struct trussinfo *);
|
|
|
|
void print_syscall_ret(struct trussinfo *, int, long *);
|
2009-05-12 20:42:12 +00:00
|
|
|
void print_summary(struct trussinfo *trussinfo);
|