Decode pathconf() names, *at() flags, and sysarch() numbers in libsysdecode.

Move tables that were previously in truss over to libsysdecode.  truss
output is unchanged, but kdump has been updated to decode these fields.
In addition, sysdecode_sysarch_number() should support all platforms
whereas the old table in truss only supported x86.
This commit is contained in:
John Baldwin 2017-09-04 05:34:36 +00:00
parent ff6ea3fbc5
commit 39a3a4386a
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=323151
8 changed files with 98 additions and 35 deletions

View File

@ -42,6 +42,7 @@ MLINKS+=sysdecode_enum.3 sysdecode_acltype.3 \
sysdecode_enum.3 sysdecode_minherit_flags.3 \
sysdecode_enum.3 sysdecode_msgctl_cmd.3 \
sysdecode_enum.3 sysdecode_nfssvc_flags.3 \
sysdecode_enum.3 sysdecode_pathconf_name.3 \
sysdecode_enum.3 sysdecode_prio_which.3 \
sysdecode_enum.3 sysdecode_procctl_cmd.3 \
sysdecode_enum.3 sysdecode_ptrace_request.3 \
@ -63,11 +64,13 @@ MLINKS+=sysdecode_enum.3 sysdecode_acltype.3 \
sysdecode_enum.3 sysdecode_socketdomain.3 \
sysdecode_enum.3 sysdecode_sockettype.3 \
sysdecode_enum.3 sysdecode_sockopt_level.3 \
sysdecode_enum.3 sysdecode_sysarch_number.3 \
sysdecode_enum.3 sysdecode_umtx_op.3 \
sysdecode_enum.3 sysdecode_vmresult.3 \
sysdecode_enum.3 sysdecode_whence.3
MLINKS+=sysdecode_fcntl_arg.3 sysdecode_fcntl_arg_p.3
MLINKS+=sysdecode_mask.3 sysdecode_accessmode.3 \
sysdecode_mask.3 sysdecode_atflags.3 \
sysdecode_mask.3 sysdecode_capfcntlrights.3 \
sysdecode_mask.3 sysdecode_fcntl_fileflags.3 \
sysdecode_mask.3 sysdecode_fileflags.3 \

View File

@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$");
#include <sys/stat.h>
#include <sys/thr.h>
#include <sys/umtx.h>
#include <machine/sysarch.h>
#include <netinet/in.h>
#include <netinet/sctp.h>
#include <netinet/tcp.h>
@ -250,6 +251,13 @@ sysdecode_atfd(int fd)
return (NULL);
}
bool
sysdecode_atflags(FILE *fp, int flag, int *rem)
{
return (print_mask_int(fp, atflags, flag, rem));
}
static struct name_table semctlops[] = {
X(GETNCNT) X(GETPID) X(GETVAL) X(GETALL) X(GETZCNT) X(SETVAL) X(SETALL)
X(IPC_RMID) X(IPC_SET) X(IPC_STAT) XEND
@ -947,6 +955,13 @@ sysdecode_mmap_flags(FILE *fp, int flags, int *rem)
return (printed);
}
const char *
sysdecode_pathconf_name(int name)
{
return (lookup_value(pathconfname, name));
}
const char *
sysdecode_rtprio_function(int function)
{
@ -988,6 +1003,13 @@ sysdecode_sigcode(int sig, int si_code)
}
}
const char *
sysdecode_sysarch_number(int number)
{
return (lookup_value(sysarchnum, number));
}
bool
sysdecode_umtx_cvwait_flags(FILE *fp, u_long flags, u_long *rem)
{

View File

@ -91,6 +91,7 @@ _EOF_
gen_table "accessmode" "[A-Z]_OK[[:space:]]+0?x?[0-9A-Fa-f]+" "sys/unistd.h"
gen_table "acltype" "ACL_TYPE_[A-Z4_]+[[:space:]]+0x[0-9]+" "sys/acl.h"
gen_table "atflags" "AT_[A-Z_]+[[:space:]]+0x[0-9]+" "sys/fcntl.h"
gen_table "capfcntl" "CAP_FCNTL_[A-Z]+[[:space:]]+\(1" "sys/capsicum.h"
gen_table "extattrns" "EXTATTR_NAMESPACE_[A-Z]+[[:space:]]+0x[0-9]+" "sys/extattr.h"
gen_table "fadvisebehav" "POSIX_FADV_[A-Z]+[[:space:]]+[0-9]+" "sys/fcntl.h"
@ -109,6 +110,7 @@ gen_table "filemode" "S_[A-Z]+[[:space:]]+[0-6]{7}" "sys/
gen_table "mountflags" "MNT_[A-Z]+[[:space:]]+0x[0-9]+" "sys/mount.h"
gen_table "msyncflags" "MS_[A-Z]+[[:space:]]+0x[0-9]+" "sys/mman.h"
gen_table "nfssvcflags" "NFSSVC_[A-Z0-9]+[[:space:]]+0x[0-9]+" "nfs/nfssvc.h"
gen_table "pathconfname" "_PC_[A-Z4_]+[[:space:]]+[0-9]+" "sys/unistd.h"
gen_table "prio" "PRIO_[A-Z]+[[:space:]]+[0-9]" "sys/resource.h"
gen_table "procctlcmd" "PROC_[A-Z_]+[[:space:]]+[0-9]" "sys/procctl.h" "PROC_TRACE_CTL_"
gen_table "ptraceop" "PT_[[:alnum:]_]+[[:space:]]+[0-9]+" "sys/ptrace.h"
@ -153,6 +155,11 @@ gen_table "sigcode" "SI_[A-Z]+[[:space:]]+0(x[0-9abcdef]+)?" "sys/
gen_table "umtxcvwaitflags" "CVWAIT_[A-Z_]+[[:space:]]+0x[0-9]+" "sys/umtx.h"
gen_table "umtxrwlockflags" "URWLOCK_PREFER_READER[[:space:]]+0x[0-9]+" "sys/umtx.h"
gen_table "caprights" "CAP_[A-Z_]+[[:space:]]+CAPRIGHT\([0-9],[[:space:]]+0x[0-9]{16}ULL\)" "sys/capsicum.h"
if [ -e "${include_dir}/x86/sysarch.h" ]; then
gen_table "sysarchnum" "(AMD64|I386)_[A-Z86_]+[[:space:]]+[0-9]+" "x86/sysarch.h"
else
gen_table "sysarchnum" "[A-Z_]+[[:space:]]+[0-9]+" "machine/sysarch.h"
fi
# Generate a .depend file for our output file
if [ -n "$output_file" ]; then

View File

@ -42,6 +42,7 @@ int sysdecode_abi_to_freebsd_errno(enum sysdecode_abi _abi, int _error);
bool sysdecode_access_mode(FILE *_fp, int _mode, int *_rem);
const char *sysdecode_acltype(int _type);
const char *sysdecode_atfd(int _fd);
bool sysdecode_atflags(FILE *_fp, int _flags, int *_rem);
bool sysdecode_cap_fcntlrights(FILE *_fp, uint32_t _rights, uint32_t *_rem);
void sysdecode_cap_rights(FILE *_fp, cap_rights_t *_rightsp);
const char *sysdecode_extattrnamespace(int _namespace);
@ -73,6 +74,7 @@ bool sysdecode_msg_flags(FILE *_fp, int _flags, int *_rem);
bool sysdecode_msync_flags(FILE *_fp, int _flags, int *_rem);
const char *sysdecode_nfssvc_flags(int _flags);
bool sysdecode_open_flags(FILE *_fp, int _flags, int *_rem);
const char *sysdecode_pathconf_name(int _name);
bool sysdecode_pipe2_flags(FILE *_fp, int _flags, int *_rem);
const char *sysdecode_prio_which(int _which);
const char *sysdecode_procctl_cmd(int _cmd);
@ -105,6 +107,7 @@ bool sysdecode_socket_type(FILE *_fp, int _type, int *_rem);
const char *sysdecode_sockopt_level(int _level);
const char *sysdecode_sockopt_name(int _level, int _optname);
const char *sysdecode_syscallname(enum sysdecode_abi _abi, unsigned int _code);
const char *sysdecode_sysarch_number(int _number);
bool sysdecode_thr_create_flags(FILE *_fp, int _flags, int *_rem);
bool sysdecode_umtx_cvwait_flags(FILE *_fp, u_long _flags, u_long *_rem);
const char *sysdecode_umtx_op(int _op);

View File

@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd June 3, 2017
.Dd September 3, 2017
.Dt sysdecode_enum 3
.Os
.Sh NAME
@ -46,6 +46,7 @@
.Nm sysdecode_minherit_flags ,
.Nm sysdecode_msgctl_cmd ,
.Nm sysdecode_nfssvc_flags ,
.Nm sysdecode_pathconf_name ,
.Nm sysdecode_prio_which ,
.Nm sysdecode_procctl_cmd ,
.Nm sysdecode_ptrace_request ,
@ -67,6 +68,7 @@
.Nm sysdecode_socketdomain ,
.Nm sysdecode_sockettype ,
.Nm sysdecode_sockopt_level ,
.Nm sysdecode_sysarch_number ,
.Nm sysdecode_umtx_op ,
.Nm sysdecode_vmresult ,
.Nm sysdecode_whence
@ -110,6 +112,8 @@
.Ft const char *
.Fn sysdecode_nfssvc_flags "int flags"
.Ft const char *
.Fn sysdecode_pathconf_name "int name"
.Ft const char *
.Fn sysdecode_prio_which "int which"
.Ft const char *
.Fn sysdecode_procctl_cmd "int cmd"
@ -152,6 +156,8 @@
.Ft const char *
.Fn sysdecode_sockopt_level "int level"
.Ft const char *
.Fn sysdecode_sysarch_number "int number"
.Ft const char *
.Fn sysdecode_umtx_op "int op"
.Ft const char *
.Fn sysdecode_vmresult "int result"
@ -186,6 +192,7 @@ Most of these functions decode an argument passed to a system call:
.It Fn sysdecode_minherit_inherit Ta Xr minherit 2 Ta Fa inherit
.It Fn sysdecode_msgctl_cmd Ta Xr msgctl 2 Ta Fa cmd
.It Fn sysdecode_nfssvc_flags Ta Xr nfssvc 2 Ta Fa flags
.It Fn sysdecode_pathconf_name Ta Xr pathconf 2 Ta Fa name
.It Fn sysdecode_prio_which Ta Xr getpriority 2 Ta Fa which
.It Fn sysdecode_procctl_cmd Ta Xr procctl 2 Ta Fa cmd
.It Fn sysdecode_ptrace_request Ta Xr ptrace 2 Ta Fa request
@ -198,6 +205,7 @@ Most of these functions decode an argument passed to a system call:
.It Fn sysdecode_shutdown_how Ta Xr shutdown 2 Ta Fa how
.It Fn sysdecode_sigprocmask_how Ta Xr sigprocmask 2 Ta Fa how
.It Fn sysdecode_sockopt_level Ta Xr getsockopt 2 Ta Fa level
.It Fn sysdecode_sysarch_number Ta Xr sysarch 2 Ta Fa number
.It Fn sysdecode_umtx_op Ta Xr _umtx_op 2 Ta Fa op
.It Fn sysdecode_whence Ta Xr lseek 2 Ta Fa whence
.El

View File

@ -25,12 +25,13 @@
.\"
.\" $FreeBSD$
.\"
.Dd January 2, 2017
.Dd September 3, 2017
.Dt sysdecode_mask 3
.Os
.Sh NAME
.Nm sysdecode_mask ,
.Nm sysdecode_accessmode ,
.Nm sysdecode_atflags ,
.Nm sysdecode_capfcntlrights ,
.Nm sysdecode_fcntl_fileflags ,
.Nm sysdecode_fileflags ,
@ -66,6 +67,8 @@
.Ft bool
.Fn sysdecode_access_mode "FILE *fp" "int mode" "int *rem"
.Ft bool
.Fn sysdecode_atflags "FILE *fp" "int flags" "int *rem"
.Ft bool
.Fn sysdecode_cap_fcntlrights "FILE *fp" "uint32_t rights" "uint32_t *rem"
.Ft bool
.Fn sysdecode_fcntl_fileflags "FILE *fp" "int flags" "int *rem"
@ -148,6 +151,7 @@ Most of these functions decode an argument passed to a system call:
.Bl -column "Fn sysdecode_flock_operation" "Xr cap_fcntls_limit 2"
.It Sy Function Ta Sy System Call Ta Sy Argument
.It Fn sysdecode_access_mode Ta Xr access 2 Ta Fa mode
.It Fn sysdecode_atflags Ta Xr chflagsat 2 , Xr fstatat 2 Ta Fa atflag , Fa flag
.It Fn sysdecode_cap_fcntlrights Ta Xr cap_fcntls_limit 2 Ta Fa fcntlrights
.It Fn sysdecode_fileflags Ta Xr chflags 2 Ta Fa flags
.It Fn sysdecode_filemode Ta Xr chmod 2 , Xr open 2 Ta mode

View File

@ -1060,6 +1060,15 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
ip++;
narg--;
break;
case SYS_pathconf:
case SYS_lpathconf:
case SYS_fpathconf:
print_number(ip, narg, c);
putchar(',');
print_integer_arg(sysdecode_pathconf_name, *ip);
ip++;
narg--;
break;
case SYS_getpriority:
case SYS_setpriority:
putchar('(');
@ -1419,6 +1428,7 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
print_integer_arg_valid(sysdecode_atfd, *ip);
ip++;
narg--;
print_number(ip, narg, c);
break;
case SYS_cap_fcntls_limit:
print_number(ip, narg, c);
@ -1477,6 +1487,41 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
print_number(ip, narg, c);
print_number64(first, ip, narg, c);
break;
case SYS_fchownat:
print_number(ip, narg, c);
print_number(ip, narg, c);
print_number(ip, narg, c);
break;
case SYS_fstatat:
case SYS_utimensat:
print_number(ip, narg, c);
print_number(ip, narg, c);
break;
case SYS_unlinkat:
print_number(ip, narg, c);
break;
case SYS_sysarch:
putchar('(');
print_integer_arg(sysdecode_sysarch_number, *ip);
ip++;
narg--;
c = ',';
break;
}
switch (ktr->ktr_code) {
case SYS_chflagsat:
case SYS_fchownat:
case SYS_faccessat:
case SYS_fchmodat:
case SYS_fstatat:
case SYS_linkat:
case SYS_unlinkat:
case SYS_utimensat:
putchar(',');
print_mask_arg0(sysdecode_atflags, *ip);
ip++;
narg--;
break;
}
}
while (narg > 0) {

View File

@ -49,7 +49,6 @@ __FBSDID("$FreeBSD$");
#include <sys/stat.h>
#include <sys/un.h>
#include <sys/wait.h>
#include <machine/sysarch.h>
#include <netinet/in.h>
#include <arpa/inet.h>
@ -697,35 +696,6 @@ static struct xlat sigaction_flags[] = {
X(SA_NODEFER) X(SA_NOCLDWAIT) X(SA_SIGINFO) XEND
};
static struct xlat pathconf_arg[] = {
X(_PC_LINK_MAX) X(_PC_MAX_CANON) X(_PC_MAX_INPUT)
X(_PC_NAME_MAX) X(_PC_PATH_MAX) X(_PC_PIPE_BUF)
X(_PC_CHOWN_RESTRICTED) X(_PC_NO_TRUNC) X(_PC_VDISABLE)
X(_PC_ASYNC_IO) X(_PC_PRIO_IO) X(_PC_SYNC_IO)
X(_PC_ALLOC_SIZE_MIN) X(_PC_FILESIZEBITS)
X(_PC_REC_INCR_XFER_SIZE) X(_PC_REC_MAX_XFER_SIZE)
X(_PC_REC_MIN_XFER_SIZE) X(_PC_REC_XFER_ALIGN)
X(_PC_SYMLINK_MAX) X(_PC_ACL_EXTENDED) X(_PC_ACL_PATH_MAX)
X(_PC_CAP_PRESENT) X(_PC_INF_PRESENT) X(_PC_MAC_PRESENT)
X(_PC_ACL_NFS4) X(_PC_MIN_HOLE_SIZE) XEND
};
static struct xlat at_flags[] = {
X(AT_EACCESS) X(AT_SYMLINK_NOFOLLOW) X(AT_SYMLINK_FOLLOW)
X(AT_REMOVEDIR) XEND
};
static struct xlat sysarch_ops[] = {
#if defined(__i386__) || defined(__amd64__)
X(I386_GET_LDT) X(I386_SET_LDT) X(I386_GET_IOPERM) X(I386_SET_IOPERM)
X(I386_VM86) X(I386_GET_FSBASE) X(I386_SET_FSBASE) X(I386_GET_GSBASE)
X(I386_SET_GSBASE) X(I386_GET_XFPUSTATE) X(AMD64_GET_FSBASE)
X(AMD64_SET_FSBASE) X(AMD64_GET_GSBASE) X(AMD64_SET_GSBASE)
X(AMD64_GET_XFPUSTATE)
#endif
XEND
};
static struct xlat linux_socketcall_ops[] = {
X(LINUX_SOCKET) X(LINUX_BIND) X(LINUX_CONNECT) X(LINUX_LISTEN)
X(LINUX_ACCEPT) X(LINUX_GETSOCKNAME) X(LINUX_GETPEERNAME)
@ -1689,7 +1659,7 @@ print_arg(struct syscall_args *sc, unsigned long *args, long *retval,
print_integer_arg(sysdecode_getrusage_who, fp, args[sc->offset]);
break;
case Pathconf:
fputs(xlookup(pathconf_arg, args[sc->offset]), fp);
print_integer_arg(sysdecode_pathconf_name, fp, args[sc->offset]);
break;
case Rforkflags:
print_mask_arg(sysdecode_rfork_flags, fp, args[sc->offset]);
@ -1955,13 +1925,14 @@ print_arg(struct syscall_args *sc, unsigned long *args, long *retval,
print_integer_arg(sysdecode_atfd, fp, args[sc->offset]);
break;
case Atflags:
fputs(xlookup_bits(at_flags, args[sc->offset]), fp);
print_mask_arg(sysdecode_atflags, fp, args[sc->offset]);
break;
case Accessmode:
print_mask_arg(sysdecode_access_mode, fp, args[sc->offset]);
break;
case Sysarch:
fputs(xlookup(sysarch_ops, args[sc->offset]), fp);
print_integer_arg(sysdecode_sysarch_number, fp,
args[sc->offset]);
break;
case PipeFds:
/*