xref: /qemu/bsd-user/freebsd/target_os_user.h (revision b55e4b9c0525560577384adfc6d30eb0daa8d7be)
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 propagation. */
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  #define TARGET_KI_NSPARE_INT        2
65  #define TARGET_KI_NSPARE_LONG       12
66  #define TARGET_KI_NSPARE_PTR        6
67  
68  #define TARGET_WMESGLEN             8
69  #define TARGET_LOCKNAMELEN          8
70  #define TARGET_TDNAMLEN             16
71  #define TARGET_COMMLEN              19
72  #define TARGET_KI_EMULNAMELEN       16
73  #define TARGET_KI_NGROUPS           16
74  #define TARGET_LOGNAMELEN           17
75  #define TARGET_LOGINCLASSLEN        17
76  
77  #define TARGET_KF_TYPE_NONE         0
78  #define TARGET_KF_TYPE_VNODE        1
79  #define TARGET_KF_TYPE_SOCKET       2
80  #define TARGET_KF_TYPE_PIPE         3
81  #define TARGET_KF_TYPE_FIFO         4
82  #define TARGET_KF_TYPE_KQUEUE       5
83  #define TARGET_KF_TYPE_CRYPTO       6
84  #define TARGET_KF_TYPE_MQUEUE       7
85  #define TARGET_KF_TYPE_SHM          8
86  #define TARGET_KF_TYPE_SEM          9
87  #define TARGET_KF_TYPE_PTS          10
88  #define TARGET_KF_TYPE_PROCDESC     11
89  #define TARGET_KF_TYPE_DEV          12
90  #define TARGET_KF_TYPE_UNKNOWN      255
91  
92  struct target_kinfo_proc {
93      int32_t     ki_structsize;      /* size of this structure */
94      int32_t     ki_layout;          /* reserved: layout identifier */
95      abi_ulong   ki_args;            /* address of command arguments */
96      abi_ulong   ki_paddr;           /* address of proc */
97      abi_ulong   ki_addr;            /* kernel virtual addr of u-area */
98      abi_ulong   ki_tracep;          /* pointer to trace file */
99      abi_ulong   ki_textvp;          /* pointer to executable file */
100      abi_ulong   ki_fd;              /* pointer to open file info */
101      abi_ulong   ki_vmspace;         /* pointer to kernel vmspace struct */
102      abi_ulong   ki_wchan;           /* sleep address */
103      int32_t     ki_pid;             /* Process identifier */
104      int32_t     ki_ppid;            /* parent process id */
105      int32_t     ki_pgid;            /* process group id */
106      int32_t     ki_tpgid;           /* tty process group id */
107      int32_t     ki_sid;             /* Process session ID */
108      int32_t     ki_tsid;            /* Terminal session ID */
109      int16_t     ki_jobc;            /* job control counter */
110      int16_t     ki_spare_short1;    /* unused (just here for alignment) */
111      int32_t     ki_tdev__freebsd11; /* controlling tty dev */
112      target_sigset_t ki_siglist;     /* Signals arrived but not delivered */
113      target_sigset_t ki_sigmask;     /* Current signal mask */
114      target_sigset_t ki_sigignore;   /* Signals being ignored */
115      target_sigset_t ki_sigcatch;    /* Signals being caught by user */
116  
117      int32_t     ki_uid;             /* effective user id */
118      int32_t     ki_ruid;            /* Real user id */
119      int32_t     ki_svuid;           /* Saved effective user id */
120      int32_t     ki_rgid;            /* Real group id */
121      int32_t     ki_svgid;           /* Saved effective group id */
122      int16_t     ki_ngroups;         /* number of groups */
123      int16_t     ki_spare_short2;    /* unused (just here for alignment) */
124      int32_t     ki_groups[TARGET_KI_NGROUPS];  /* groups */
125  
126      abi_long    ki_size;            /* virtual size */
127  
128      abi_long    ki_rssize;          /* current resident set size in pages */
129      abi_long    ki_swrss;           /* resident set size before last swap */
130      abi_long    ki_tsize;           /* text size (pages) XXX */
131      abi_long    ki_dsize;           /* data size (pages) XXX */
132      abi_long    ki_ssize;           /* stack size (pages) */
133  
134      uint16_t    ki_xstat;           /* Exit status for wait & stop signal */
135      uint16_t    ki_acflag;          /* Accounting flags */
136  
137      uint32_t    ki_pctcpu;          /* %cpu for process during ki_swtime */
138  
139      uint32_t    ki_estcpu;          /* Time averaged value of ki_cpticks */
140      uint32_t    ki_slptime;         /* Time since last blocked */
141      uint32_t    ki_swtime;          /* Time swapped in or out */
142      uint32_t    ki_cow;             /* number of copy-on-write faults */
143      uint64_t    ki_runtime;         /* Real time in microsec */
144  
145      struct  target_freebsd_timeval ki_start;  /* starting time */
146      struct  target_freebsd_timeval ki_childtime; /* time used by process children */
147  
148      abi_long    ki_flag;            /* P_* flags */
149      abi_long    ki_kiflag;          /* KI_* flags (below) */
150      int32_t     ki_traceflag;       /* Kernel trace points */
151      char        ki_stat;            /* S* process status */
152      int8_t      ki_nice;            /* Process "nice" value */
153      char        ki_lock;            /* Process lock (prevent swap) count */
154      char        ki_rqindex;         /* Run queue index */
155      u_char      ki_oncpu_old;       /* Which cpu we are on (legacy) */
156      u_char      ki_lastcpu_old;     /* Last cpu we were on (legacy) */
157      char        ki_tdname[TARGET_TDNAMLEN + 1];  /* thread name */
158      char        ki_wmesg[TARGET_WMESGLEN + 1];   /* wchan message */
159      char        ki_login[TARGET_LOGNAMELEN + 1]; /* setlogin name */
160      char        ki_lockname[TARGET_LOCKNAMELEN + 1]; /* lock name */
161      char        ki_comm[TARGET_COMMLEN + 1];     /* command name */
162      char        ki_emul[TARGET_KI_EMULNAMELEN + 1];  /* emulation name */
163      char        ki_loginclass[TARGET_LOGINCLASSLEN + 1]; /* login class */
164  
165      char        ki_sparestrings[50];    /* spare string space */
166      int32_t     ki_spareints[TARGET_KI_NSPARE_INT]; /* spare room for growth */
167      uint64_t ki_tdev;  /* controlling tty dev */
168      int32_t     ki_oncpu;           /* Which cpu we are on */
169      int32_t     ki_lastcpu;         /* Last cpu we were on */
170      int32_t     ki_tracer;          /* Pid of tracing process */
171      int32_t     ki_flag2;           /* P2_* flags */
172      int32_t     ki_fibnum;          /* Default FIB number */
173      uint32_t    ki_cr_flags;        /* Credential flags */
174      int32_t     ki_jid;             /* Process jail ID */
175      int32_t     ki_numthreads;      /* XXXKSE number of threads in total */
176  
177      int32_t     ki_tid;             /* XXXKSE thread id */
178  
179      struct  target_priority ki_pri; /* process priority */
180      struct  target_freebsd_rusage ki_rusage;  /* process rusage statistics */
181          /* XXX - most fields in ki_rusage_ch are not (yet) filled in */
182      struct  target_freebsd_rusage ki_rusage_ch; /* rusage of children processes */
183  
184  
185      abi_ulong   ki_pcb;             /* kernel virtual addr of pcb */
186      abi_ulong   ki_kstack;          /* kernel virtual addr of stack */
187      abi_ulong   ki_udata;           /* User convenience pointer */
188      abi_ulong   ki_tdaddr;          /* address of thread */
189  
190      abi_ulong   ki_spareptrs[TARGET_KI_NSPARE_PTR];  /* spare room for growth */
191      abi_long    ki_sparelongs[TARGET_KI_NSPARE_LONG];/* spare room for growth */
192      abi_long    ki_sflag;           /* PS_* flags */
193      abi_long    ki_tdflags;         /* XXXKSE kthread flag */
194  };
195  
196  struct target_kinfo_file {
197      int32_t  kf_structsize;  /* Variable size of record. */
198      int32_t  kf_type;  /* Descriptor type. */
199      int32_t  kf_fd;   /* Array index. */
200      int32_t  kf_ref_count;  /* Reference count. */
201      int32_t  kf_flags;  /* Flags. */
202      int32_t  kf_pad0;  /* Round to 64 bit alignment. */
203      int64_t  kf_offset;  /* Seek location. */
204      union {
205          struct {
206              uint32_t kf_spareint;
207              /* Socket domain. */
208              int  kf_sock_domain0;
209              /* Socket type. */
210              int  kf_sock_type0;
211              /* Socket protocol. */
212              int  kf_sock_protocol0;
213              /* Socket address. */
214              struct sockaddr_storage kf_sa_local;
215              /* Peer address. */
216              struct sockaddr_storage kf_sa_peer;
217              /* Address of so_pcb. */
218              uint64_t kf_sock_pcb;
219              /* Address of inp_ppcb. */
220              uint64_t kf_sock_inpcb;
221              /* Address of unp_conn. */
222              uint64_t kf_sock_unpconn;
223              /* Send buffer state. */
224              uint16_t kf_sock_snd_sb_state;
225              /* Receive buffer state. */
226              uint16_t kf_sock_rcv_sb_state;
227              /* Round to 64 bit alignment. */
228              uint32_t kf_sock_pad0;
229          } kf_sock;
230          struct {
231              /* Vnode type. */
232              int  kf_file_type;
233              /* Space for future use */
234              int  kf_spareint[3];
235              uint64_t kf_spareint64[30];
236              /* Vnode filesystem id. */
237              uint64_t kf_file_fsid;
238              /* File device. */
239              uint64_t kf_file_rdev;
240              /* Global file id. */
241              uint64_t kf_file_fileid;
242              /* File size. */
243              uint64_t kf_file_size;
244              /* Vnode filesystem id, FreeBSD 11 compat. */
245              uint32_t kf_file_fsid_freebsd11;
246              /* File device, FreeBSD 11 compat. */
247              uint32_t kf_file_rdev_freebsd11;
248              /* File mode. */
249              uint16_t kf_file_mode;
250              /* Round to 64 bit alignment. */
251              uint16_t kf_file_pad0;
252              uint32_t kf_file_pad1;
253          } kf_file;
254          struct {
255              uint32_t kf_spareint[4];
256              uint64_t kf_spareint64[32];
257              uint32_t kf_sem_value;
258              uint16_t kf_sem_mode;
259          } kf_sem;
260          struct {
261              uint32_t kf_spareint[4];
262              uint64_t kf_spareint64[32];
263              uint64_t kf_pipe_addr;
264              uint64_t kf_pipe_peer;
265              uint32_t kf_pipe_buffer_cnt;
266              /* Round to 64 bit alignment. */
267              uint32_t kf_pipe_pad0[3];
268          } kf_pipe;
269          struct {
270              uint32_t kf_spareint[4];
271              uint64_t kf_spareint64[32];
272              uint32_t kf_pts_dev_freebsd11;
273              uint32_t kf_pts_pad0;
274              uint64_t kf_pts_dev;
275              /* Round to 64 bit alignment. */
276              uint32_t kf_pts_pad1[4];
277          } kf_pts;
278          struct {
279              uint32_t kf_spareint[4];
280              uint64_t kf_spareint64[32];
281              int32_t  kf_pid;
282          } kf_proc;
283      } kf_un;
284      uint16_t kf_status;  /* Status flags. */
285      uint16_t kf_pad1;  /* Round to 32 bit alignment. */
286      int32_t  _kf_ispare0;  /* Space for more stuff. */
287      target_cap_rights_t kf_cap_rights; /* Capability rights. */
288      uint64_t _kf_cap_spare; /* Space for future cap_rights_t. */
289      /* Truncated before copyout in sysctl */
290      char  kf_path[PATH_MAX]; /* Path to file, if any. */
291  };
292  
293  struct target_kinfo_vmentry {
294      int32_t  kve_structsize;  /* Variable size of record. */
295      int32_t  kve_type;   /* Type of map entry. */
296      uint64_t kve_start;   /* Starting address. */
297      uint64_t kve_end;   /* Finishing address. */
298      uint64_t kve_offset;   /* Mapping offset in object */
299      uint64_t kve_vn_fileid;   /* inode number if vnode */
300      uint32_t kve_vn_fsid_freebsd11;  /* dev_t of vnode location */
301      int32_t  kve_flags;   /* Flags on map entry. */
302      int32_t  kve_resident;   /* Number of resident pages. */
303      int32_t  kve_private_resident;  /* Number of private pages. */
304      int32_t  kve_protection;  /* Protection bitmask. */
305      int32_t  kve_ref_count;   /* VM obj ref count. */
306      int32_t  kve_shadow_count;  /* VM obj shadow count. */
307      int32_t  kve_vn_type;   /* Vnode type. */
308      uint64_t kve_vn_size;   /* File size. */
309      uint32_t kve_vn_rdev_freebsd11;  /* Device id if device. */
310      uint16_t kve_vn_mode;   /* File mode. */
311      uint16_t kve_status;   /* Status flags. */
312  #if (__FreeBSD_version >= 1300501 && __FreeBSD_version < 1400000) ||    \
313      __FreeBSD_version >= 1400009
314      union {
315          uint64_t _kve_vn_fsid;  /* dev_t of vnode location */
316          uint64_t _kve_obj;  /* handle of anon obj */
317      } kve_type_spec;
318  #define kve_vn_fsid kve_type_spec._kve_vn_fsid
319  #define kve_obj  kve_type_spec._kve_obj
320  #else
321      uint64_t kve_vn_fsid;   /* dev_t of vnode location */
322  #endif
323      uint64_t kve_vn_rdev;   /* Device id if device. */
324      int  _kve_ispare[8];  /* Space for more stuff. */
325      /* Truncated before copyout in sysctl */
326      char  kve_path[PATH_MAX];  /* Path to VM obj, if any. */
327  };
328  
329  #endif /* TARGET_OS_USER_H */
330