1 /*
2  *  sys/user.h definitions
3  *
4  *  Copyright (c) 2015 Stacey D. Son (sson at FreeBSD)
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #ifndef _TARGET_OS_USER_H_
21 #define _TARGET_OS_USER_H_
22 
23 /*
24  * from sys/priority.h
25  */
26 struct target_priority {
27     uint8_t     pri_class;      /* Scheduling class. */
28     uint8_t     pri_level;      /* Normal priority level. */
29     uint8_t     pri_native;     /* Priority before propogation. */
30     uint8_t     pri_user;       /* User priority based on p_cpu and p_nice. */
31 };
32 
33 /*
34  * sys/caprights.h
35  */
36 #define TARGET_CAP_RIGHTS_VERSION  0
37 
38 typedef struct target_cap_rights {
39     uint64_t    cr_rights[TARGET_CAP_RIGHTS_VERSION + 2];
40 } target_cap_rights_t;
41 
42 /*
43  * From sys/_socketaddr_storage.h
44  *
45  */
46 #define TARGET_SS_MAXSIZE     128U
47 #define TARGET_SS_ALIGNSIZE   (sizeof(__int64_t))
48 #define TARGET_SS_PAD1SIZE    (TARGET_SS_ALIGNSIZE - sizeof(unsigned char) - \
49         sizeof(uint8_t))
50 #define TARGET_SS_PAD2SIZE    (TARGET_SS_MAXSIZE - sizeof(unsigned char) - \
51         sizeof(uint8_t) - TARGET_SS_PAD1SIZE - TARGET_SS_ALIGNSIZE)
52 
53 struct target_sockaddr_storage {
54     unsigned char   ss_len;         /* address length */
55     uint8_t         ss_family;      /* address family */
56     char            __ss_pad1[TARGET_SS_PAD1SIZE];
57     __int64_t       __ss_align;     /* force desired struct alignment */
58     char            __ss_pad2[TARGET_SS_PAD2SIZE];
59 };
60 
61 /*
62  * from sys/user.h
63  */
64 #if defined(__FreeBSD_version) && __FreeBSD_version >= 1200031
65 #define TARGET_KI_NSPARE_INT        2
66 #elif defined(__FreeBSD_version) && __FreeBSD_version >= 1100000
67 #define TARGET_KI_NSPARE_INT        4
68 #elif defined(__FreeBSD_version) && __FreeBSD_version >= 1000000
69 #define TARGET_KI_NSPARE_INT        7
70 #else
71 #define TARGET_KI_NSPARE_INT        9
72 #endif /* ! __FreeBSD_version >= 1000000 */
73 #define TARGET_KI_NSPARE_LONG       12
74 #define TARGET_KI_NSPARE_PTR        6
75 
76 #define TARGET_WMESGLEN             8
77 #define TARGET_LOCKNAMELEN          8
78 #define TARGET_TDNAMLEN             16
79 #define TARGET_COMMLEN              19
80 #define TARGET_KI_EMULNAMELEN       16
81 #define TARGET_KI_NGROUPS           16
82 #define TARGET_LOGNAMELEN           17
83 #define TARGET_LOGINCLASSLEN        17
84 
85 #define TARGET_KF_TYPE_NONE         0
86 #define TARGET_KF_TYPE_VNODE        1
87 #define TARGET_KF_TYPE_SOCKET       2
88 #define TARGET_KF_TYPE_PIPE         3
89 #define TARGET_KF_TYPE_FIFO         4
90 #define TARGET_KF_TYPE_KQUEUE       5
91 #define TARGET_KF_TYPE_CRYPTO       6
92 #define TARGET_KF_TYPE_MQUEUE       7
93 #define TARGET_KF_TYPE_SHM          8
94 #define TARGET_KF_TYPE_SEM          9
95 #define TARGET_KF_TYPE_PTS          10
96 #define TARGET_KF_TYPE_PROCDESC     11
97 #define TARGET_KF_TYPE_DEV          12
98 #define TARGET_KF_TYPE_UNKNOWN      255
99 
100 struct target_kinfo_proc {
101     int32_t     ki_structsize;      /* size of this structure */
102     int32_t     ki_layout;          /* reserved: layout identifier */
103     abi_ulong   ki_args;            /* address of command arguments */
104     abi_ulong   ki_paddr;           /* address of proc */
105     abi_ulong   ki_addr;            /* kernel virtual addr of u-area */
106     abi_ulong   ki_tracep;          /* pointer to trace file */
107     abi_ulong   ki_textvp;          /* pointer to executable file */
108     abi_ulong   ki_fd;              /* pointer to open file info */
109     abi_ulong   ki_vmspace;         /* pointer to kernel vmspace struct */
110     abi_ulong   ki_wchan;           /* sleep address */
111     int32_t     ki_pid;             /* Process identifier */
112     int32_t     ki_ppid;            /* parent process id */
113     int32_t     ki_pgid;            /* process group id */
114     int32_t     ki_tpgid;           /* tty process group id */
115     int32_t     ki_sid;             /* Process session ID */
116     int32_t     ki_tsid;            /* Terminal session ID */
117     int16_t     ki_jobc;            /* job control counter */
118     int16_t     ki_spare_short1;    /* unused (just here for alignment) */
119 #if defined(__FreeBSD_version) && __FreeBSD_version >= 1200031
120     int32_t     ki_tdev__freebsd11; /* controlling tty dev */
121 #else
122     int32_t     ki_tdev;            /* controlling tty dev */
123 #endif
124     target_sigset_t ki_siglist;     /* Signals arrived but not delivered */
125     target_sigset_t ki_sigmask;     /* Current signal mask */
126     target_sigset_t ki_sigignore;   /* Signals being ignored */
127     target_sigset_t ki_sigcatch;    /* Signals being caught by user */
128 
129     int32_t     ki_uid;             /* effective user id */
130     int32_t     ki_ruid;            /* Real user id */
131     int32_t     ki_svuid;           /* Saved effective user id */
132     int32_t     ki_rgid;            /* Real group id */
133     int32_t     ki_svgid;           /* Saved effective group id */
134     int16_t     ki_ngroups;         /* number of groups */
135     int16_t     ki_spare_short2;    /* unused (just here for alignment) */
136     int32_t     ki_groups[TARGET_KI_NGROUPS];  /* groups */
137 
138     abi_long    ki_size;            /* virtual size */
139 
140     abi_long    ki_rssize;          /* current resident set size in pages */
141     abi_long    ki_swrss;           /* resident set size before last swap */
142     abi_long    ki_tsize;           /* text size (pages) XXX */
143     abi_long    ki_dsize;           /* data size (pages) XXX */
144     abi_long    ki_ssize;           /* stack size (pages) */
145 
146     uint16_t    ki_xstat;           /* Exit status for wait & stop signal */
147     uint16_t    ki_acflag;          /* Accounting flags */
148 
149     uint32_t    ki_pctcpu;          /* %cpu for process during ki_swtime */
150 
151     uint32_t    ki_estcpu;          /* Time averaged value of ki_cpticks */
152     uint32_t    ki_slptime;         /* Time since last blocked */
153     uint32_t    ki_swtime;          /* Time swapped in or out */
154     uint32_t    ki_cow;             /* number of copy-on-write faults */
155     uint64_t    ki_runtime;         /* Real time in microsec */
156 
157     struct  target_freebsd_timeval ki_start;  /* starting time */
158     struct  target_freebsd_timeval ki_childtime; /* time used by process children */
159 
160     abi_long    ki_flag;            /* P_* flags */
161     abi_long    ki_kiflag;          /* KI_* flags (below) */
162     int32_t     ki_traceflag;       /* Kernel trace points */
163     char        ki_stat;            /* S* process status */
164     int8_t      ki_nice;            /* Process "nice" value */
165     char        ki_lock;            /* Process lock (prevent swap) count */
166     char        ki_rqindex;         /* Run queue index */
167 #if defined(__FreeBSD_version) && __FreeBSD_version >= 1100000
168     u_char      ki_oncpu_old;       /* Which cpu we are on (legacy) */
169     u_char      ki_lastcpu_old;     /* Last cpu we were on (legacy) */
170 #else
171     u_char      ki_oncpu;           /* Which cpu we are on */
172     u_char      ki_lastcpu;         /* Last cpu we were on */
173 #endif /* ! __FreeBSD_version >= 1100000 */
174 #if defined(__FreeBSD_version) && __FreeBSD_version >= 900000
175     char        ki_tdname[TARGET_TDNAMLEN + 1];  /* thread name */
176 #else
177     char        ki_ocomm[TARGET_TDNAMLEN + 1];   /* thread name */
178 #endif /* ! __FreeBSD_version >= 900000 */
179     char        ki_wmesg[TARGET_WMESGLEN + 1];   /* wchan message */
180     char        ki_login[TARGET_LOGNAMELEN + 1]; /* setlogin name */
181     char        ki_lockname[TARGET_LOCKNAMELEN + 1]; /* lock name */
182     char        ki_comm[TARGET_COMMLEN + 1];     /* command name */
183     char        ki_emul[TARGET_KI_EMULNAMELEN + 1];  /* emulation name */
184 #if defined(__FreeBSD_version) && __FreeBSD_version >= 900000
185     char        ki_loginclass[TARGET_LOGINCLASSLEN + 1]; /* login class */
186 #endif /* ! __FreeBSD_version >= 900000 */
187 
188 #if defined(__FreeBSD_version) && __FreeBSD_version >= 900000
189     char        ki_sparestrings[50];    /* spare string space */
190 #else
191     char        ki_sparestrings[68];    /* spare string space */
192 #endif /* ! __FreeBSD_version >= 900000 */
193     int32_t     ki_spareints[TARGET_KI_NSPARE_INT]; /* spare room for growth */
194 #if defined(__FreeBSD_version) && __FreeBSD_version >= 1200031
195  uint64_t ki_tdev;  /* controlling tty dev */
196 #endif
197 #if defined(__FreeBSD_version) && __FreeBSD_version >= 1100000
198     int32_t     ki_oncpu;           /* Which cpu we are on */
199     int32_t     ki_lastcpu;         /* Last cpu we were on */
200     int32_t     ki_tracer;          /* Pid of tracing process */
201 #endif /* __FreeBSD_version >= 1100000 */
202 #if defined(__FreeBSD_version) && __FreeBSD_version >= 900000
203     int32_t     ki_flag2;           /* P2_* flags */
204     int32_t     ki_fibnum;          /* Default FIB number */
205 #endif /* ! __FreeBSD_version >= 900000 */
206     uint32_t    ki_cr_flags;        /* Credential flags */
207     int32_t     ki_jid;             /* Process jail ID */
208     int32_t     ki_numthreads;      /* XXXKSE number of threads in total */
209 
210     int32_t     ki_tid;             /* XXXKSE thread id */
211 
212     struct  target_priority ki_pri; /* process priority */
213     struct  target_freebsd_rusage ki_rusage;  /* process rusage statistics */
214         /* XXX - most fields in ki_rusage_ch are not (yet) filled in */
215     struct  target_freebsd_rusage ki_rusage_ch; /* rusage of children processes */
216 
217 
218     abi_ulong   ki_pcb;             /* kernel virtual addr of pcb */
219     abi_ulong   ki_kstack;          /* kernel virtual addr of stack */
220     abi_ulong   ki_udata;           /* User convenience pointer */
221     abi_ulong   ki_tdaddr;          /* address of thread */
222 
223     abi_ulong   ki_spareptrs[TARGET_KI_NSPARE_PTR];  /* spare room for growth */
224     abi_long    ki_sparelongs[TARGET_KI_NSPARE_LONG];/* spare room for growth */
225     abi_long    ki_sflag;           /* PS_* flags */
226     abi_long    ki_tdflags;         /* XXXKSE kthread flag */
227 };
228 
229 struct target_kinfo_file {
230     int32_t  kf_structsize;  /* Variable size of record. */
231     int32_t  kf_type;  /* Descriptor type. */
232     int32_t  kf_fd;   /* Array index. */
233     int32_t  kf_ref_count;  /* Reference count. */
234     int32_t  kf_flags;  /* Flags. */
235     int32_t  kf_pad0;  /* Round to 64 bit alignment. */
236     int64_t  kf_offset;  /* Seek location. */
237 #if defined(__FreeBSD_version) && __FreeBSD_version < 1200031
238     int32_t  kf_vnode_type;  /* Vnode type. */
239     int32_t  kf_sock_domain;  /* Socket domain. */
240     int32_t  kf_sock_type;  /* Socket type. */
241     int32_t  kf_sock_protocol; /* Socket protocol. */
242     struct target_sockaddr_storage kf_sa_local; /* Socket address. */
243     struct target_sockaddr_storage kf_sa_peer; /* Peer address. */
244 #endif
245 #if defined(__FreeBSD_version) && __FreeBSD_version >= 900000
246     union {
247         struct {
248 #if defined(__FreeBSD_version) && __FreeBSD_version >= 1200031
249             uint32_t kf_spareint;
250             /* Socket domain. */
251             int  kf_sock_domain0;
252             /* Socket type. */
253             int  kf_sock_type0;
254             /* Socket protocol. */
255             int  kf_sock_protocol0;
256             /* Socket address. */
257             struct sockaddr_storage kf_sa_local;
258             /* Peer address. */
259             struct sockaddr_storage kf_sa_peer;
260 #endif
261             /* Address of so_pcb. */
262             uint64_t kf_sock_pcb;
263             /* Address of inp_ppcb. */
264             uint64_t kf_sock_inpcb;
265             /* Address of unp_conn. */
266             uint64_t kf_sock_unpconn;
267             /* Send buffer state. */
268             uint16_t kf_sock_snd_sb_state;
269             /* Receive buffer state. */
270             uint16_t kf_sock_rcv_sb_state;
271             /* Round to 64 bit alignment. */
272             uint32_t kf_sock_pad0;
273         } kf_sock;
274         struct {
275 #if defined(__FreeBSD_version) && __FreeBSD_version >= 1200031
276             /* Vnode type. */
277             int  kf_file_type;
278             /* Space for future use */
279             int  kf_spareint[3];
280             uint64_t kf_spareint64[30];
281             /* Vnode filesystem id. */
282             uint64_t kf_file_fsid;
283             /* File device. */
284             uint64_t kf_file_rdev;
285             /* Global file id. */
286             uint64_t kf_file_fileid;
287             /* File size. */
288             uint64_t kf_file_size;
289             /* Vnode filesystem id, FreeBSD 11 compat. */
290             uint32_t kf_file_fsid_freebsd11;
291             /* File device, FreeBSD 11 compat. */
292             uint32_t kf_file_rdev_freebsd11;
293 #else
294             /* Global file id. */
295             uint64_t kf_file_fileid;
296             /* File size. */
297             uint64_t kf_file_size;
298             /* Vnode filesystem id. */
299             uint32_t kf_file_fsid;
300             /* File device. */
301             uint32_t kf_file_rdev;
302 #endif
303             /* File mode. */
304             uint16_t kf_file_mode;
305             /* Round to 64 bit alignment. */
306             uint16_t kf_file_pad0;
307             uint32_t kf_file_pad1;
308         } kf_file;
309         struct {
310 #if defined(__FreeBSD_version) && __FreeBSD_version >= 1200031
311             uint32_t kf_spareint[4];
312             uint64_t kf_spareint64[32];
313 #endif
314             uint32_t kf_sem_value;
315             uint16_t kf_sem_mode;
316         } kf_sem;
317         struct {
318 #if defined(__FreeBSD_version) && __FreeBSD_version >= 1200031
319             uint32_t kf_spareint[4];
320             uint64_t kf_spareint64[32];
321 #endif
322             uint64_t kf_pipe_addr;
323             uint64_t kf_pipe_peer;
324             uint32_t kf_pipe_buffer_cnt;
325             /* Round to 64 bit alignment. */
326             uint32_t kf_pipe_pad0[3];
327         } kf_pipe;
328         struct {
329 #if defined(__FreeBSD_version) && __FreeBSD_version >= 1200031
330             uint32_t kf_spareint[4];
331             uint64_t kf_spareint64[32];
332             uint32_t kf_pts_dev_freebsd11;
333             uint32_t kf_pts_pad0;
334             uint64_t kf_pts_dev;
335             /* Round to 64 bit alignment. */
336             uint32_t kf_pts_pad1[4];
337 #else
338             uint32_t kf_pts_dev;
339             /* Round to 64 bit alignment. */
340             uint32_t kf_pts_pad0[7];
341 #endif
342         } kf_pts;
343         struct {
344 #if defined(__FreeBSD_version) && __FreeBSD_version >= 1200031
345             uint32_t kf_spareint[4];
346             uint64_t kf_spareint64[32];
347 #endif
348             int32_t  kf_pid;
349         } kf_proc;
350     } kf_un;
351     uint16_t kf_status;  /* Status flags. */
352     uint16_t kf_pad1;  /* Round to 32 bit alignment. */
353     int32_t  _kf_ispare0;  /* Space for more stuff. */
354 #if defined(__FreeBSD_version) && __FreeBSD_version >= 1000000
355     target_cap_rights_t kf_cap_rights; /* Capability rights. */
356     uint64_t _kf_cap_spare; /* Space for future cap_rights_t. */
357 #else /* ! __FreeBSD_version >= 1000000 */
358     uint64_t        kf_cap_rights;
359     int  _kf_ispare[4];
360 #endif /* ! __FreeBSD_version >= 1000000 */
361 
362 #else /* ! __FreeBSD_version >= 900000 */
363     int  _kf_ispare[16];
364 #endif /* ! __FreeBSD_version >= 900000 */
365     /* Truncated before copyout in sysctl */
366     char  kf_path[PATH_MAX]; /* Path to file, if any. */
367 };
368 
369 struct target_kinfo_vmentry {
370     int32_t  kve_structsize;  /* Variable size of record. */
371     int32_t  kve_type;   /* Type of map entry. */
372     uint64_t kve_start;   /* Starting address. */
373     uint64_t kve_end;   /* Finishing address. */
374     uint64_t kve_offset;   /* Mapping offset in object */
375 #if defined(__FreeBSD_version) && __FreeBSD_version >= 900000
376     uint64_t kve_vn_fileid;   /* inode number if vnode */
377 #if defined(__FreeBSD_version) && __FreeBSD_version >= 1200031
378     uint32_t kve_vn_fsid_freebsd11;  /* dev_t of vnode location */
379 #else
380     uint32_t kve_vn_fsid;   /* dev_t of vnode location */
381 #endif
382 #else /* !  __FreeBSD_version >= 900000 */
383     uint64_t kve_fileid;   /* inode number if vnode */
384     uint32_t kve_fsid;   /* dev_t of vnode location */
385 #endif /* !  __FreeBSD_version >= 900000 */
386     int32_t  kve_flags;   /* Flags on map entry. */
387     int32_t  kve_resident;   /* Number of resident pages. */
388     int32_t  kve_private_resident;  /* Number of private pages. */
389     int32_t  kve_protection;  /* Protection bitmask. */
390     int32_t  kve_ref_count;   /* VM obj ref count. */
391     int32_t  kve_shadow_count;  /* VM obj shadow count. */
392 #if defined(__FreeBSD_version) && __FreeBSD_version >= 900000
393     int32_t  kve_vn_type;   /* Vnode type. */
394     uint64_t kve_vn_size;   /* File size. */
395 #if defined(__FreeBSD_version) && __FreeBSD_version >= 1200031
396     uint32_t kve_vn_rdev_freebsd11;  /* Device id if device. */
397 #else
398     uint32_t kve_vn_rdev;   /* Device id if device. */
399 #endif
400     uint16_t kve_vn_mode;   /* File mode. */
401     uint16_t kve_status;   /* Status flags. */
402 #if defined(__FreeBSD_version) && __FreeBSD_version >= 1200031
403 #if (__FreeBSD_version >= 1300501 && __FreeBSD_version < 1400000) ||    \
404     __FreeBSD_version >= 1400009
405     union {
406         uint64_t _kve_vn_fsid;  /* dev_t of vnode location */
407         uint64_t _kve_obj;  /* handle of anon obj */
408     } kve_type_spec;
409 #define kve_vn_fsid kve_type_spec._kve_vn_fsid
410 #define kve_obj  kve_type_spec._kve_obj
411 #else
412     uint64_t kve_vn_fsid;   /* dev_t of vnode location */
413 #endif
414     uint64_t kve_vn_rdev;   /* Device id if device. */
415     int  _kve_ispare[8];  /* Space for more stuff. */
416 #else
417     int32_t  _kve_ispare[12];  /* Space for more stuff. */
418 #endif
419 #else /* !  __FreeBSD_version >= 900000 */
420     int  _kve_pad0;
421     int32_t  _kve_ispare[16];  /* Space for more stuff. */
422 #endif /* !  __FreeBSD_version >= 900000 */
423     /* Truncated before copyout in sysctl */
424     char  kve_path[PATH_MAX];  /* Path to VM obj, if any. */
425 };
426 
427 #endif /* ! _TARGET_OS_USER_H_ */
428