#ifndef _SYS_USER_H_
#define _SYS_USER_H_
#include <machine/pcb.h>
#ifndef _KERNEL
#include <sys/errno.h>
#include <sys/event.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/ucred.h>
#include <sys/uio.h>
#include <sys/queue.h>
#include <sys/_lock.h>
#include <sys/_mutex.h>
#include <sys/proc.h>
#include <vm/vm.h>
#include <vm/vm_param.h>
#include <vm/pmap.h>
#include <vm/vm_map.h>
#endif
#ifndef _SYS_RESOURCEVAR_H_
#include <sys/resourcevar.h>
#endif
#ifndef _SYS_SIGNALVAR_H_
#include <sys/signalvar.h>
#endif
#ifndef _SYS_SOCKET_VAR_H_
#include <sys/socket.h>
#endif
#include <sys/caprights.h>
#define KI_NSPARE_INT 2
#define KI_NSPARE_LONG 12
#define KI_NSPARE_PTR 4
#ifndef _KERNEL
#ifndef KINFO_PROC_SIZE
#error "Unknown architecture"
#endif
#endif
#define WMESGLEN 8
#define LOCKNAMELEN 8
#define TDNAMLEN 16
#define COMMLEN 19
#define KI_EMULNAMELEN 16
#define KI_NGROUPS 16
#define LOGNAMELEN 17
#define LOGINCLASSLEN 17
#ifndef BURN_BRIDGES
#define OCOMMLEN TDNAMLEN
#define ki_ocomm ki_tdname
#endif
#define KI_CRF_CAPABILITY_MODE 0x00000001
#define KI_CRF_GRP_OVERFLOW 0x80000000
struct kinfo_proc {
int ki_structsize;
int ki_layout;
struct pargs *ki_args;
struct proc *ki_paddr;
struct user *ki_addr;
struct vnode *ki_tracep;
struct vnode *ki_textvp;
struct filedesc *ki_fd;
struct vmspace *ki_vmspace;
const void *ki_wchan;
pid_t ki_pid;
pid_t ki_ppid;
pid_t ki_pgid;
pid_t ki_tpgid;
pid_t ki_sid;
pid_t ki_tsid;
short ki_jobc;
short ki_spare_short1;
uint32_t ki_tdev_freebsd11;
sigset_t ki_siglist;
sigset_t ki_sigmask;
sigset_t ki_sigignore;
sigset_t ki_sigcatch;
uid_t ki_uid;
uid_t ki_ruid;
uid_t ki_svuid;
gid_t ki_rgid;
gid_t ki_svgid;
short ki_ngroups;
short ki_spare_short2;
gid_t ki_groups[KI_NGROUPS];
vm_size_t ki_size;
segsz_t ki_rssize;
segsz_t ki_swrss;
segsz_t ki_tsize;
segsz_t ki_dsize;
segsz_t ki_ssize;
u_short ki_xstat;
u_short ki_acflag;
fixpt_t ki_pctcpu;
u_int ki_estcpu;
u_int ki_slptime;
u_int ki_swtime;
u_int ki_cow;
u_int64_t ki_runtime;
struct timeval ki_start;
struct timeval ki_childtime;
long ki_flag;
long ki_kiflag;
int ki_traceflag;
char ki_stat;
signed char ki_nice;
char ki_lock;
char ki_rqindex;
u_char ki_oncpu_old;
u_char ki_lastcpu_old;
char ki_tdname[TDNAMLEN+1];
char ki_wmesg[WMESGLEN+1];
char ki_login[LOGNAMELEN+1];
char ki_lockname[LOCKNAMELEN+1];
char ki_comm[COMMLEN+1];
char ki_emul[KI_EMULNAMELEN+1];
char ki_loginclass[LOGINCLASSLEN+1];
char ki_moretdname[MAXCOMLEN-TDNAMLEN+1];
char ki_sparestrings[46];
int ki_spareints[KI_NSPARE_INT];
uint64_t ki_tdev;
int ki_oncpu;
int ki_lastcpu;
int ki_tracer;
int ki_flag2;
int ki_fibnum;
u_int ki_cr_flags;
int ki_jid;
int ki_numthreads;
lwpid_t ki_tid;
struct priority ki_pri;
struct rusage ki_rusage;
struct rusage ki_rusage_ch;
struct pcb *ki_pcb;
void *ki_kstack;
void *ki_udata;
struct thread *ki_tdaddr;
struct pwddesc *ki_pd;
void *ki_uerrmsg;
void *ki_spareptrs[KI_NSPARE_PTR];
long ki_sparelongs[KI_NSPARE_LONG];
long ki_sflag;
long ki_tdflags;
};
void fill_kinfo_proc(struct proc *, struct kinfo_proc *);
#define ki_childstime ki_rusage_ch.ru_stime
#define ki_childutime ki_rusage_ch.ru_utime
#define PS_INMEM 0x00001
#define KI_CTTY 0x00000001
#define KI_SLEADER 0x00000002
#define KI_LOCKBLOCK 0x00000004
struct user {
struct pstats u_stats;
struct kinfo_proc u_kproc;
};
#define KF_ATTR_VALID 0x0001
#define KF_TYPE_NONE 0
#define KF_TYPE_VNODE 1
#define KF_TYPE_SOCKET 2
#define KF_TYPE_PIPE 3
#define KF_TYPE_FIFO 4
#define KF_TYPE_KQUEUE 5
#define KF_TYPE_MQUEUE 7
#define KF_TYPE_SHM 8
#define KF_TYPE_SEM 9
#define KF_TYPE_PTS 10
#define KF_TYPE_PROCDESC 11
#define KF_TYPE_DEV 12
#define KF_TYPE_EVENTFD 13
#define KF_TYPE_TIMERFD 14
#define KF_TYPE_INOTIFY 15
#define KF_TYPE_JAILDESC 16
#define KF_TYPE_UNKNOWN 255
#define KF_VTYPE_VNON 0
#define KF_VTYPE_VREG 1
#define KF_VTYPE_VDIR 2
#define KF_VTYPE_VBLK 3
#define KF_VTYPE_VCHR 4
#define KF_VTYPE_VLNK 5
#define KF_VTYPE_VSOCK 6
#define KF_VTYPE_VFIFO 7
#define KF_VTYPE_VBAD 8
#define KF_VTYPE_UNKNOWN 255
#define KF_FD_TYPE_CWD -1
#define KF_FD_TYPE_ROOT -2
#define KF_FD_TYPE_JAIL -3
#define KF_FD_TYPE_TRACE -4
#define KF_FD_TYPE_TEXT -5
#define KF_FD_TYPE_CTTY -6
#define KF_FLAG_READ 0x00000001
#define KF_FLAG_WRITE 0x00000002
#define KF_FLAG_APPEND 0x00000004
#define KF_FLAG_ASYNC 0x00000008
#define KF_FLAG_FSYNC 0x00000010
#define KF_FLAG_NONBLOCK 0x00000020
#define KF_FLAG_DIRECT 0x00000040
#define KF_FLAG_HASLOCK 0x00000080
#define KF_FLAG_SHLOCK 0x00000100
#define KF_FLAG_EXLOCK 0x00000200
#define KF_FLAG_NOFOLLOW 0x00000400
#define KF_FLAG_CREAT 0x00000800
#define KF_FLAG_TRUNC 0x00001000
#define KF_FLAG_EXCL 0x00002000
#define KF_FLAG_EXEC 0x00004000
#if defined(__amd64__)
#define KINFO_OFILE_SIZE 1328
#endif
#if defined(__i386__)
#define KINFO_OFILE_SIZE 1324
#endif
struct kinfo_ofile {
int kf_structsize;
int kf_type;
int kf_fd;
int kf_ref_count;
int kf_flags;
off_t kf_offset;
int kf_vnode_type;
int kf_sock_domain;
int kf_sock_type;
int kf_sock_protocol;
char kf_path[PATH_MAX];
struct sockaddr_storage kf_sa_local;
struct sockaddr_storage kf_sa_peer;
};
#if defined(__amd64__) || defined(__i386__)
#define KINFO_FILE_SIZE 1392
#endif
struct kinfo_file {
int kf_structsize;
int kf_type;
int kf_fd;
int kf_ref_count;
int kf_flags;
int kf_pad0;
int64_t kf_offset;
union {
struct {
int kf_vnode_type;
int kf_sock_domain;
int kf_sock_type;
int kf_sock_protocol;
struct sockaddr_storage kf_sa_local;
struct sockaddr_storage kf_sa_peer;
};
union {
struct {
uint32_t kf_sock_sendq;
int kf_sock_domain0;
int kf_sock_type0;
int kf_sock_protocol0;
struct sockaddr_storage kf_sa_local;
struct sockaddr_storage kf_sa_peer;
uint64_t kf_sock_pcb;
uint64_t kf_sock_inpcb;
uint64_t kf_sock_unpconn;
uint16_t kf_sock_snd_sb_state;
uint16_t kf_sock_rcv_sb_state;
uint32_t kf_sock_recvq;
} kf_sock;
struct {
int kf_file_type;
int kf_spareint[3];
uint64_t kf_spareint64[29];
uint64_t kf_file_nlink;
uint64_t kf_file_fsid;
uint64_t kf_file_rdev;
uint64_t kf_file_fileid;
uint64_t kf_file_size;
uint32_t kf_file_fsid_freebsd11;
uint32_t kf_file_rdev_freebsd11;
uint16_t kf_file_mode;
uint16_t kf_file_pad0;
uint32_t kf_file_pad1;
} kf_file;
struct {
uint32_t kf_spareint[4];
uint64_t kf_spareint64[32];
uint32_t kf_sem_value;
uint16_t kf_sem_mode;
} kf_sem;
struct {
uint32_t kf_spareint[4];
uint64_t kf_spareint64[32];
uint64_t kf_pipe_addr;
uint64_t kf_pipe_peer;
uint32_t kf_pipe_buffer_cnt;
uint32_t kf_pipe_buffer_in;
uint32_t kf_pipe_buffer_out;
uint32_t kf_pipe_buffer_size;
} kf_pipe;
struct {
uint32_t kf_spareint[4];
uint64_t kf_spareint64[32];
uint32_t kf_pts_dev_freebsd11;
uint32_t kf_pts_pad0;
uint64_t kf_pts_dev;
uint32_t kf_pts_pad1[4];
} kf_pts;
struct {
uint32_t kf_spareint[4];
uint64_t kf_spareint64[32];
pid_t kf_pid;
} kf_proc;
struct {
uint64_t kf_eventfd_value;
uint32_t kf_eventfd_flags;
uint32_t kf_eventfd_spareint[3];
uint64_t kf_eventfd_addr;
} kf_eventfd;
struct {
uint32_t kf_timerfd_clockid;
uint32_t kf_timerfd_flags;
uint64_t kf_timerfd_addr;
} kf_timerfd;
struct {
int32_t kf_jid;
} kf_jail;
struct {
uint64_t kf_kqueue_addr;
int32_t kf_kqueue_count;
int32_t kf_kqueue_state;
} kf_kqueue;
struct {
uint64_t kf_inotify_npending;
uint64_t kf_inotify_nbpending;
} kf_inotify;
} kf_un;
};
uint16_t kf_status;
uint16_t kf_pad1;
int _kf_ispare0;
cap_rights_t kf_cap_rights;
uint64_t _kf_cap_spare;
char kf_path[PATH_MAX];
};
struct kinfo_lockf {
int kl_structsize;
int kl_rw;
int kl_type;
int kl_pid;
int kl_sysid;
int kl_pad0;
uint64_t kl_file_fsid;
uint64_t kl_file_rdev;
uint64_t kl_file_fileid;
off_t kl_start;
off_t kl_len;
char kl_path[PATH_MAX];
};
#define KLOCKF_RW_READ 0x01
#define KLOCKF_RW_WRITE 0x02
#define KLOCKF_TYPE_FLOCK 0x01
#define KLOCKF_TYPE_PID 0x02
#define KLOCKF_TYPE_REMOTE 0x03
#define KVME_TYPE_NONE 0
#define KVME_TYPE_DEFAULT 1
#define KVME_TYPE_VNODE 2
#define KVME_TYPE_SWAP 3
#define KVME_TYPE_DEVICE 4
#define KVME_TYPE_PHYS 5
#define KVME_TYPE_DEAD 6
#define KVME_TYPE_SG 7
#define KVME_TYPE_MGTDEVICE 8
#define KVME_TYPE_GUARD 9
#define KVME_TYPE_UNKNOWN 255
#define KVME_PROT_READ 0x00000001
#define KVME_PROT_WRITE 0x00000002
#define KVME_PROT_EXEC 0x00000004
#define KVME_MAX_PROT_READ 0x00010000
#define KVME_MAX_PROT_WRITE 0x00020000
#define KVME_MAX_PROT_EXEC 0x00040000
#define KVME_FLAG_COW 0x00000001
#define KVME_FLAG_NEEDS_COPY 0x00000002
#define KVME_FLAG_NOCOREDUMP 0x00000004
#define KVME_FLAG_SUPER 0x00000008
#define KVME_FLAG_GROWS_UP 0x00000010
#define KVME_FLAG_GROWS_DOWN 0x00000020
#define KVME_FLAG_USER_WIRED 0x00000040
#define KVME_FLAG_SYSVSHM 0x00000080
#define KVME_FLAG_POSIXSHM 0x00000100
#if defined(__amd64__)
#define KINFO_OVMENTRY_SIZE 1168
#endif
#if defined(__i386__)
#define KINFO_OVMENTRY_SIZE 1128
#endif
struct kinfo_ovmentry {
int kve_structsize;
int kve_type;
void *kve_start;
void *kve_end;
int kve_flags;
int kve_resident;
int kve_private_resident;
int kve_protection;
int kve_ref_count;
int kve_shadow_count;
char kve_path[PATH_MAX];
void *_kve_pspare[8];
off_t kve_offset;
uint64_t kve_fileid;
uint32_t kve_fsid;
int _kve_ispare[3];
};
#if defined(__amd64__) || defined(__i386__)
#define KINFO_VMENTRY_SIZE 1160
#endif
struct kinfo_vmentry {
int kve_structsize;
int kve_type;
uint64_t kve_start;
uint64_t kve_end;
uint64_t kve_offset;
uint64_t kve_vn_fileid;
uint32_t kve_vn_fsid_freebsd11;
int kve_flags;
int kve_resident;
int kve_private_resident;
int kve_protection;
int kve_ref_count;
int kve_shadow_count;
int kve_vn_type;
uint64_t kve_vn_size;
uint32_t kve_vn_rdev_freebsd11;
uint16_t kve_vn_mode;
uint16_t kve_status;
union {
uint64_t _kve_vn_fsid;
uint64_t _kve_obj;
} kve_type_spec;
uint64_t kve_vn_rdev;
int _kve_ispare[8];
char kve_path[PATH_MAX];
};
#define kve_vn_fsid kve_type_spec._kve_vn_fsid
#define kve_obj kve_type_spec._kve_obj
#define KVMO_FLAG_SYSVSHM 0x0001
#define KVMO_FLAG_POSIXSHM 0x0002
struct kinfo_vmobject {
int kvo_structsize;
int kvo_type;
uint64_t kvo_size;
uint64_t kvo_vn_fileid;
uint32_t kvo_vn_fsid_freebsd11;
int kvo_ref_count;
int kvo_shadow_count;
int kvo_memattr;
uint64_t kvo_resident;
uint64_t kvo_active;
uint64_t kvo_inactive;
union {
uint64_t _kvo_vn_fsid;
uint64_t _kvo_backing_obj;
} kvo_type_spec;
uint64_t kvo_me;
uint64_t kvo_laundry;
uint64_t kvo_wired;
uint64_t _kvo_qspare[4];
uint32_t kvo_swapped;
uint32_t kvo_flags;
uint32_t _kvo_ispare[6];
char kvo_path[PATH_MAX];
};
#define kvo_vn_fsid kvo_type_spec._kvo_vn_fsid
#define kvo_backing_obj kvo_type_spec._kvo_backing_obj
#define KKST_MAXLEN 1024
#define KKST_STATE_STACKOK 0
#define KKST_STATE_SWAPPED 1
#define KKST_STATE_RUNNING 2
#if defined(__amd64__) || defined(__i386__)
#define KINFO_KSTACK_SIZE 1096
#endif
struct kinfo_kstack {
lwpid_t kkst_tid;
int kkst_state;
char kkst_trace[KKST_MAXLEN];
int _kkst_ispare[16];
};
struct kinfo_sigtramp {
void *ksigtramp_start;
void *ksigtramp_end;
void *ksigtramp_spare[4];
};
#define KMAP_FLAG_WIREFUTURE 0x01
#define KMAP_FLAG_ASLR 0x02
#define KMAP_FLAG_ASLR_IGNSTART 0x04
#define KMAP_FLAG_WXORX 0x08
#define KMAP_FLAG_ASLR_STACK 0x10
#define KMAP_FLAG_ASLR_SHARED_PAGE 0x20
struct kinfo_vm_layout {
uintptr_t kvm_min_user_addr;
uintptr_t kvm_max_user_addr;
uintptr_t kvm_text_addr;
size_t kvm_text_size;
uintptr_t kvm_data_addr;
size_t kvm_data_size;
uintptr_t kvm_stack_addr;
size_t kvm_stack_size;
int kvm_map_flags;
uintptr_t kvm_shp_addr;
size_t kvm_shp_size;
uintptr_t kvm_spare[12];
};
#define KNOTE_STATUS_ACTIVE 0x00000001
#define KNOTE_STATUS_QUEUED 0x00000002
#define KNOTE_STATUS_DISABLED 0x00000004
#define KNOTE_STATUS_DETACHED 0x00000008
#define KNOTE_STATUS_KQUEUE 0x00000010
#define KNOTE_EXTDATA_NONE 0
#define KNOTE_EXTDATA_VNODE 1
#define KNOTE_EXTDATA_PIPE 2
struct kinfo_knote {
int knt_kq_fd;
struct kevent knt_event;
int knt_status;
int knt_extdata;
uint64_t knt_spare0[4];
union {
struct {
int knt_vnode_type;
uint64_t knt_vnode_fsid;
uint64_t knt_vnode_fileid;
char knt_vnode_fullpath[PATH_MAX];
} knt_vnode;
struct {
ino_t knt_pipe_ino;
} knt_pipe;
};
};
#ifdef _KERNEL
#define KERN_PROC_NOTHREADS 0x1
#define KERN_PROC_MASK32 0x2
#define KERN_FILEDESC_PACK_KINFO 0x00000001U
#define KERN_VMMAP_PACK_KINFO 0x00000001U
struct sbuf;
int kern_proc_filedesc_out(struct proc *p, struct sbuf *sb, ssize_t maxlen,
int flags);
int kern_proc_cwd_out(struct proc *p, struct sbuf *sb, ssize_t maxlen);
int kern_proc_out(struct proc *p, struct sbuf *sb, int flags);
int kern_proc_vmmap_out(struct proc *p, struct sbuf *sb, ssize_t maxlen,
int flags);
int kern_proc_kqueues_out(struct proc *p, struct sbuf *s, size_t maxlen,
bool compat32);
int vntype_to_kinfo(int vtype);
void pack_kinfo(struct kinfo_file *kif);
#endif
#endif