#ifndef _SYS_KTRACE_H_
#define _SYS_KTRACE_H_
#include <sys/param.h>
#include <sys/caprights.h>
#include <sys/signal.h>
#include <sys/socket.h>
#include <sys/_uexterror.h>
#include <sys/_uio.h>
#define KTROP_SET 0
#define KTROP_CLEAR 1
#define KTROP_CLEARFILE 2
#define KTROP(o) ((o)&3)
#define KTRFLAG_DESCEND 4
struct ktr_header_v0 {
int ktr_len;
short ktr_type;
pid_t ktr_pid;
char ktr_comm[MAXCOMLEN + 1];
struct timeval ktr_time;
long ktr_tid;
};
struct ktr_header {
int ktr_len;
short ktr_type;
short ktr_version;
pid_t ktr_pid;
char ktr_comm[MAXCOMLEN + 1];
struct timespec ktr_time;
long ktr_tid;
int ktr_cpu;
};
#define KTR_VERSION0 0
#define KTR_VERSION1 1
#define KTR_OFFSET_V0 sizeof(struct ktr_header_v0) - \
sizeof(struct ktr_header)
#define KTRCHECK(td, type) ((td)->td_proc->p_traceflag & (1 << type))
#define KTRPOINT(td, type) (__predict_false(KTRCHECK((td), (type))))
#define KTRUSERRET(td) do { \
if (__predict_false(!STAILQ_EMPTY_ATOMIC(&(td)->td_proc->p_ktr))) \
ktruserret(td); \
} while (0)
#define KTR_SYSCALL 1
struct ktr_syscall {
short ktr_code;
short ktr_narg;
register_t ktr_args[1];
};
#define KTR_SYSRET 2
struct ktr_sysret {
short ktr_code;
short ktr_eosys;
int ktr_error;
register_t ktr_retval;
};
#define KTR_NAMEI 3
#define KTR_GENIO 4
struct ktr_genio {
int ktr_fd;
enum uio_rw ktr_rw;
};
#define KTR_PSIG 5
struct ktr_psig {
int signo;
sig_t action;
int code;
sigset_t mask;
};
#define KTR_CSW 6
struct ktr_csw_old {
int out;
int user;
};
struct ktr_csw {
int out;
int user;
char wmesg[8];
};
#define KTR_USER_MAXLEN 2048
#define KTR_USER 7
#define KTR_STRUCT 8
struct sockaddr;
struct stat;
struct sysentvec;
#define KTR_SYSCTL 9
#define KTR_PROCCTOR 10
struct ktr_proc_ctor {
u_int sv_flags;
};
#define KTR_PROCDTOR 11
#define KTR_CAPFAIL 12
enum ktr_cap_violation {
CAPFAIL_NOTCAPABLE,
CAPFAIL_INCREASE,
CAPFAIL_SYSCALL,
CAPFAIL_SIGNAL,
CAPFAIL_PROTO,
CAPFAIL_SOCKADDR,
CAPFAIL_NAMEI,
CAPFAIL_CPUSET,
};
union ktr_cap_data {
cap_rights_t cap_rights[2];
#define cap_needed cap_rights[0]
#define cap_held cap_rights[1]
int cap_int;
struct sockaddr cap_sockaddr;
char cap_path[MAXPATHLEN];
};
struct ktr_cap_fail {
enum ktr_cap_violation cap_type;
short cap_code;
u_int cap_svflags;
union ktr_cap_data cap_data;
};
#define KTR_FAULT 13
struct ktr_fault {
vm_offset_t vaddr;
int type;
};
#define KTR_FAULTEND 14
struct ktr_faultend {
int result;
};
#define KTR_STRUCT_ARRAY 15
struct ktr_struct_array {
size_t struct_size;
};
#define KTR_ARGS 16
#define KTR_ENVS 17
#define KTR_EXTERR 18
struct ktr_exterr {
struct uexterror ue;
};
#define KTR_DROP 0x8000
#define KTR_VERSIONED 0x4000
#define KTR_TYPE (KTR_DROP | KTR_VERSIONED)
#define KTRFAC_MASK 0x00ffffff
#define KTRFAC_SYSCALL (1<<KTR_SYSCALL)
#define KTRFAC_SYSRET (1<<KTR_SYSRET)
#define KTRFAC_NAMEI (1<<KTR_NAMEI)
#define KTRFAC_GENIO (1<<KTR_GENIO)
#define KTRFAC_PSIG (1<<KTR_PSIG)
#define KTRFAC_CSW (1<<KTR_CSW)
#define KTRFAC_USER (1<<KTR_USER)
#define KTRFAC_STRUCT (1<<KTR_STRUCT)
#define KTRFAC_SYSCTL (1<<KTR_SYSCTL)
#define KTRFAC_PROCCTOR (1<<KTR_PROCCTOR)
#define KTRFAC_PROCDTOR (1<<KTR_PROCDTOR)
#define KTRFAC_CAPFAIL (1<<KTR_CAPFAIL)
#define KTRFAC_FAULT (1<<KTR_FAULT)
#define KTRFAC_FAULTEND (1<<KTR_FAULTEND)
#define KTRFAC_STRUCT_ARRAY (1<<KTR_STRUCT_ARRAY)
#define KTRFAC_ARGS (1<<KTR_ARGS)
#define KTRFAC_ENVS (1<<KTR_ENVS)
#define KTRFAC_EXTERR (1<<KTR_EXTERR)
#define KTRFAC_ROOT 0x80000000
#define KTRFAC_INHERIT 0x40000000
#define KTRFAC_DROP 0x20000000
#ifdef _KERNEL
struct ktr_io_params;
#ifdef KTRACE
struct vnode *ktr_get_tracevp(struct proc *, bool);
#else
static inline struct vnode *
ktr_get_tracevp(struct proc *p, bool ref)
{
return (NULL);
}
#endif
void ktr_io_params_free(struct ktr_io_params *);
void ktrnamei(const char *);
void ktrcsw(int, int, const char *);
void ktrcsw_out(const struct timespec *, const char *);
void ktrpsig(int, sig_t, sigset_t *, int);
void ktrfault(vm_offset_t, int);
void ktrfaultend(int);
void ktrgenio(int, enum uio_rw, struct uio *, int);
void ktrsyscall(int, int narg, syscallarg_t args[]);
void ktrsysctl(int *name, u_int namelen);
void ktrsysret(int, int, register_t);
void ktrprocctor(struct proc *);
struct ktr_io_params *ktrprocexec(struct proc *);
void ktrprocexit(struct thread *);
void ktrprocfork(struct proc *, struct proc *);
void ktruserret(struct thread *);
void ktrstruct(const char *, const void *, size_t);
void ktrstruct_error(const char *, const void *, size_t, int);
void ktrstructarray(const char *, enum uio_seg, const void *, int, size_t);
void ktrcapfail(enum ktr_cap_violation, const void *);
void ktrdata(int, const void *, size_t);
#define ktrcaprights(s) \
ktrstruct("caprights", (s), sizeof(cap_rights_t))
#define ktritimerval(s) \
ktrstruct("itimerval", (s), sizeof(struct itimerval))
#define ktrsockaddr(s) \
ktrstruct("sockaddr", (s), ((struct sockaddr *)(s))->sa_len)
#define ktrstat(s) \
ktrstruct("stat", (s), sizeof(struct stat))
#define ktrstat_error(s, error) \
ktrstruct_error("stat", (s), sizeof(struct stat), error)
#define ktrcpuset(s, l) \
ktrstruct("cpuset_t", (s), l)
#define ktrsplice(s) \
ktrstruct("splice", (s), sizeof(struct splice))
#define ktrthrparam(s) \
ktrstruct("thrparam", (s), sizeof(struct thr_param))
extern u_int ktr_geniosize;
#ifdef KTRACE
extern int ktr_filesize_limit_signal;
#define __ktrace_used
#else
#define ktr_filesize_limit_signal 0
#define __ktrace_used __unused
#endif
#else
#include <sys/cdefs.h>
__BEGIN_DECLS
int ktrace(const char *, int, int, pid_t);
int utrace(const void *, size_t);
__END_DECLS
#endif
#endif