shim_types.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505
  1. /* -*- mode:c; c-file-style:"k&r"; c-basic-offset: 4; tab-width:4; indent-tabs-mode:nil; mode:auto-fill; fill-column:78; -*- */
  2. /* vim: set ts=4 sw=4 et tw=78 fo=cqt wm=0: */
  3. #ifndef _SHIM_TYPES_H_
  4. #define _SHIM_TYPES_H_
  5. #include <stddef.h>
  6. #include <stdint.h>
  7. #include <stdbool.h>
  8. #define __KERNEL__
  9. #include <linux/types.h>
  10. #include <linux/utsname.h>
  11. #include <linux/times.h>
  12. #include <linux/shm.h>
  13. #include <linux/msg.h>
  14. #include <linux/sem.h>
  15. #include <linux/kernel.h>
  16. #include <linux/utime.h>
  17. #include <linux/futex.h>
  18. #include <linux/aio_abi.h>
  19. #include <linux/perf_event.h>
  20. #include <linux/timex.h>
  21. #include <linux/version.h>
  22. #include <asm/posix_types.h>
  23. #include <asm/statfs.h>
  24. #include <asm/stat.h>
  25. #include <asm/ldt.h>
  26. #include <asm/signal.h>
  27. #include <asm/siginfo.h>
  28. #include <asm/poll.h>
  29. typedef unsigned int __u32;
  30. typedef unsigned long int nfds_t;
  31. typedef unsigned long int nlink_t;
  32. typedef uint32_t socklen_t;
  33. typedef __kernel_uid_t uid_t;
  34. typedef __kernel_gid_t gid_t;
  35. typedef __kernel_pid_t pid_t;
  36. typedef __kernel_caddr_t caddr_t;
  37. typedef __kernel_mode_t mode_t;
  38. typedef __kernel_off_t off_t;
  39. typedef __kernel_loff_t loff_t;
  40. typedef __kernel_time_t time_t;
  41. typedef __kernel_old_dev_t dev_t;
  42. typedef __kernel_ino_t ino_t;
  43. typedef __kernel_clockid_t clockid_t;
  44. typedef __kernel_key_t key_t;
  45. typedef __kernel_timer_t timer_t;
  46. typedef __kernel_fd_set fd_set;
  47. /* linux/time.h */
  48. #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 18, 0)
  49. struct __kernel_timespec {
  50. __kernel_time_t tv_sec; /* seconds */
  51. long tv_nsec; /* nanoseconds */
  52. };
  53. struct __kernel_itimerspec {
  54. struct __kernel_timespec it_interval; /* timer period */
  55. struct __kernel_timespec it_value; /* timer expiration */
  56. };
  57. #endif
  58. struct __kernel_timeval {
  59. __kernel_time_t tv_sec; /* seconds */
  60. __kernel_suseconds_t tv_usec; /* microsecond */
  61. };
  62. struct __kernel_itimerval {
  63. struct __kernel_timeval it_interval; /* time interval */
  64. struct __kernel_timeval it_value; /* current value */
  65. };
  66. struct __kernel_timezone {
  67. int tz_minuteswest; /* minutes west of Greenwich */
  68. int tz_dsttime; /* type of dst correction */
  69. };
  70. /* linux/time.h
  71. * syscall interface - used (mainly by NTP daemon)
  72. * to discipline kernel clock oscillator
  73. */
  74. struct __kernel_timex {
  75. unsigned int modes; /* mode selector */
  76. long offset; /* time offset (usec) */
  77. long freq; /* frequency offset (scaled ppm) */
  78. long maxerror; /* maximum error (usec) */
  79. long esterror; /* estimated error (usec) */
  80. int status; /* clock command/status */
  81. long constant; /* pll time constant */
  82. long precision; /* clock precision (usec) (read only) */
  83. long tolerance; /* clock frequency tolerance (ppm)
  84. * (read only) */
  85. struct __kernel_timeval time; /* (read only) */
  86. long tick; /* (modified) usecs between clock ticks */
  87. long ppsfreq; /* pps frequency (scaled ppm) (ro) */
  88. long jitter; /* pps jitter (us) (ro) */
  89. int shift; /* interval duration (s) (shift) (ro) */
  90. long stabil; /* pps stability (scaled ppm) (ro) */
  91. long jitcnt; /* jitter limit exceeded (ro) */
  92. long calcnt; /* calibration intervals (ro) */
  93. long errcnt; /* calibration errors (ro) */
  94. long stbcnt; /* stability limit exceeded (ro) */
  95. int tai; /* TAI offset (ro) */
  96. int :32; int :32; int :32; int :32;
  97. int :32; int :32; int :32; int :32;
  98. int :32; int :32; int :32;
  99. };
  100. /* /arch/x86/include/asm/posix_types_64.h */
  101. typedef unsigned int __kernel_uid_t;
  102. typedef __kernel_uid_t __kernel_uid32_t;
  103. /* quota.h */
  104. typedef __kernel_uid32_t qid_t; /* Type in which we store ids in memory */
  105. /* capability.h */
  106. typedef struct __user_cap_header_struct {
  107. __u32 version;
  108. int pid;
  109. } *cap_user_header_t;
  110. typedef struct __user_cap_data_struct {
  111. __u32 effective;
  112. __u32 permitted;
  113. __u32 inheritable;
  114. } *cap_user_data_t;
  115. /* defined in function in sysdeps/unix/sysv/linux/sysctl.c */
  116. struct __kernel_sysctl_args {
  117. int *name; /* integer vector describing variable */
  118. int nlen; /* length of this vector */
  119. void *oldval; /* 0 or address where to store old value */
  120. size_t *oldlenp; /* available room for old value,
  121. overwritten by actual size of old value */
  122. void *newval; /* 0 or address of new value */
  123. size_t newlen; /* size of new value */
  124. };
  125. struct __kernel_sched_param {
  126. int __sched_priority;
  127. };
  128. struct __kernel_sigaction {
  129. __sighandler_t k_sa_handler;
  130. unsigned long sa_flags;
  131. void (*sa_restorer) (void);
  132. sigset_t sa_mask;
  133. };
  134. /* linux/aio_abi.h (for io_setup which has no glibc wrapper) */
  135. typedef unsigned long aio_context_t;
  136. /* asm/signal.h */
  137. #define NUM_SIGS 64
  138. #define NUM_KNOWN_SIGS 32
  139. typedef struct {
  140. unsigned long __val[NUM_SIGS / (8 * sizeof(unsigned long))];
  141. } __sigset_t;
  142. /* linux/rlimit.h */
  143. struct __kernel_rusage {
  144. struct __kernel_timeval ru_utime; /* user time used */
  145. struct __kernel_timeval ru_stime; /* system time used */
  146. long ru_maxrss; /* maximum resident set size */
  147. long ru_ixrss; /* integral shared memory size */
  148. long ru_idrss; /* integral unshared data size */
  149. long ru_isrss; /* integral unshared stack size */
  150. long ru_minflt; /* page reclaims */
  151. long ru_majflt; /* page faults */
  152. long ru_nswap; /* swaps */
  153. long ru_inblock; /* block input operations */
  154. long ru_oublock; /* block output operations */
  155. long ru_msgsnd; /* messages sent */
  156. long ru_msgrcv; /* messages received */
  157. long ru_nsignals; /* signals received */
  158. long ru_nvcsw; /* voluntary context switches */
  159. long ru_nivcsw; /* involuntary " */
  160. };
  161. struct __kernel_rlimit {
  162. unsigned long rlim_cur, rlim_max;
  163. };
  164. struct __kernel_rlimit64 {
  165. uint64_t rlim_cur, rlim_max;
  166. };
  167. /* linux/eventpoll.h
  168. * On x86-64 make the 64bit structure have the same alignment as the
  169. * 32bit structure. This makes 32bit emulation easier.
  170. *
  171. * UML/x86_64 needs the same packing as x86_64
  172. */
  173. struct __kernel_epoll_event {
  174. __u32 events;
  175. __u64 data;
  176. }
  177. #ifdef __x86_64__
  178. __attribute__((packed));
  179. #else
  180. ;
  181. #endif
  182. /* sys/ucontext.h */
  183. /* Type for general register. */
  184. typedef long int greg_t;
  185. /* Number of general registers. */
  186. #define NGREG 23
  187. /* Container for all general registers. */
  188. typedef greg_t gregset_t[NGREG];
  189. /* Number of each register in the `gregset_t' array. */
  190. enum
  191. {
  192. REG_R8 = 0,
  193. # define REG_R8 REG_R8
  194. REG_R9,
  195. # define REG_R9 REG_R9
  196. REG_R10,
  197. # define REG_R10 REG_R10
  198. REG_R11,
  199. # define REG_R11 REG_R11
  200. REG_R12,
  201. # define REG_R12 REG_R12
  202. REG_R13,
  203. # define REG_R13 REG_R13
  204. REG_R14,
  205. # define REG_R14 REG_R14
  206. REG_R15,
  207. # define REG_R15 REG_R15
  208. REG_RDI,
  209. # define REG_RDI REG_RDI
  210. REG_RSI,
  211. # define REG_RSI REG_RSI
  212. REG_RBP,
  213. # define REG_RBP REG_RBP
  214. REG_RBX,
  215. # define REG_RBX REG_RBX
  216. REG_RDX,
  217. # define REG_RDX REG_RDX
  218. REG_RAX,
  219. # define REG_RAX REG_RAX
  220. REG_RCX,
  221. # define REG_RCX REG_RCX
  222. REG_RSP,
  223. # define REG_RSP REG_RSP
  224. REG_RIP,
  225. # define REG_RIP REG_RIP
  226. REG_EFL,
  227. # define REG_EFL REG_EFL
  228. REG_CSGSFS, /* Actually short cs, gs, fs, __pad0. */
  229. # define REG_CSGSFS REG_CSGSFS
  230. REG_ERR,
  231. # define REG_ERR REG_ERR
  232. REG_TRAPNO,
  233. # define REG_TRAPNO REG_TRAPNO
  234. REG_OLDMASK,
  235. # define REG_OLDMASK REG_OLDMASK
  236. REG_CR2
  237. # define REG_CR2 REG_CR2
  238. };
  239. struct _libc_fpxreg {
  240. unsigned short int significand[4];
  241. unsigned short int exponent;
  242. unsigned short int padding[3];
  243. };
  244. struct _libc_xmmreg {
  245. __uint32_t element[4];
  246. };
  247. struct _libc_fpstate {
  248. /* 64-bit FXSAVE format. */
  249. __uint16_t cwd;
  250. __uint16_t swd;
  251. __uint16_t ftw;
  252. __uint16_t fop;
  253. __uint64_t rip;
  254. __uint64_t rdp;
  255. __uint32_t mxcsr;
  256. __uint32_t mxcr_mask;
  257. struct _libc_fpxreg st[8];
  258. struct _libc_xmmreg _xmm[16];
  259. __uint32_t padding[24];
  260. };
  261. /* Structure to describe FPU registers. */
  262. typedef struct _libc_fpstate *fpregset_t;
  263. /* Context to describe whole processor state. */
  264. typedef struct {
  265. gregset_t gregs;
  266. /* Note that fpregs is a pointer. */
  267. fpregset_t fpregs;
  268. unsigned long __reserved1 [8];
  269. } mcontext_t;
  270. /* Userlevel context. */
  271. typedef struct ucontext {
  272. unsigned long int uc_flags;
  273. struct ucontext *uc_link;
  274. stack_t uc_stack;
  275. mcontext_t uc_mcontext;
  276. __sigset_t uc_sigmask;
  277. struct _libc_fpstate __fpregs_mem;
  278. } ucontext_t;
  279. #define RED_ZONE_SIZE 128
  280. /* bits/ustat.h */
  281. struct __kernel_ustat
  282. {
  283. __daddr_t f_tfree; /* Number of free blocks. */
  284. __ino_t f_tinode; /* Number of free inodes. */
  285. char f_fname[6];
  286. char f_fpack[6];
  287. };
  288. /* bits/socket.h */
  289. struct msghdr {
  290. void *msg_name; /* Address to send to/receive from. */
  291. socklen_t msg_namelen; /* Length of address data. */
  292. struct iovec *msg_iov; /* Vector of data to send/receive into. */
  293. size_t msg_iovlen; /* Number of elements in the vector. */
  294. void *msg_control; /* Ancillary data (eg BSD filedesc passing). */
  295. size_t msg_controllen; /* Ancillary data buffer length.
  296. !! The type should be socklen_t but the
  297. definition of the kernel is incompatible
  298. with this. */
  299. int msg_flags; /* Flags on received message. */
  300. };
  301. /* For `recvmmsg'. */
  302. struct mmsghdr {
  303. struct msghdr msg_hdr; /* Actual message header. */
  304. unsigned int msg_len; /* Number of received bytes for the entry. */
  305. };
  306. /* POSIX.1g specifies this type name for the `sa_family' member. */
  307. typedef unsigned short int sa_family_t;
  308. /* This macro is used to declare the initial common members
  309. of the data types used for socket addresses, `struct sockaddr',
  310. `struct sockaddr_in', `struct sockaddr_un', etc. */
  311. #define __SOCKADDR_COMMON(sa_prefix) \
  312. sa_family_t sa_prefix##family
  313. /* Structure describing a generic socket address. */
  314. struct sockaddr {
  315. __SOCKADDR_COMMON (sa_); /* Common data: address family and length. */
  316. char sa_data[14]; /* Address data. */
  317. };
  318. /* linux/mqueue.h */
  319. struct __kernel_mq_attr {
  320. long mq_flags; /* message queue flags */
  321. long mq_maxmsg; /* maximum number of messages */
  322. long mq_msgsize; /* maximum message size */
  323. long mq_curmsgs; /* number of messages currently queued */
  324. long __reserved[4]; /* ignored for input, zeroed for output */
  325. };
  326. /* bits/uio.h */
  327. /* Structure for scatter/gather I/O. */
  328. struct iovec {
  329. void * iov_base; /* Pointer to data. */
  330. size_t iov_len; /* Length of data. */
  331. };
  332. /* bits/sched.h */
  333. /* Type for array elements in 'cpu_set_t'. */
  334. typedef unsigned long int __kernel_cpu_mask;
  335. /* Size definition for CPU sets. */
  336. # define __CPU_SETSIZE 1024
  337. # define __NCPUBITS (8 * sizeof (__kernel_cpu_mask))
  338. /* Data structure to describe CPU mask. */
  339. typedef struct {
  340. __kernel_cpu_mask __bits[__CPU_SETSIZE / __NCPUBITS];
  341. } __kernel_cpu_set_t;
  342. struct getcpu_cache {
  343. unsigned long blob[128 / sizeof(long)];
  344. };
  345. # undef __CPU_SETSIZE
  346. # undef __NCPUBITS
  347. #define LINUX_DT_UNKNOWN 0
  348. #define LINUX_DT_FIFO 1
  349. #define LINUX_DT_CHR 2
  350. #define LINUX_DT_DIR 4
  351. #define LINUX_DT_BLK 6
  352. #define LINUX_DT_REG 8
  353. #define LINUX_DT_LNK 10
  354. #define LINUX_DT_SOCK 12
  355. #define LINUX_DT_WHT 14
  356. struct linux_dirent64 {
  357. uint64_t d_ino; /* Inode number */
  358. uint64_t d_off; /* Offset to next linux_dirent */
  359. unsigned short int d_reclen; /* Length of this linux_dirent */
  360. unsigned char d_type;
  361. char d_name[]; /* File name (null-terminated) */
  362. };
  363. struct linux_dirent {
  364. unsigned long d_ino; /* Inode number */
  365. unsigned long d_off; /* Offset to next linux_dirent */
  366. unsigned short int d_reclen; /* Length of this linux_dirent */
  367. char d_name[]; /* File name (null-terminated) */
  368. };
  369. struct linux_dirent_tail {
  370. char pad;
  371. unsigned char d_type;
  372. };
  373. struct linux_file_handle {
  374. unsigned int handle_bytes;
  375. int handle_type;
  376. unsigned char f_handle[0];
  377. };
  378. struct __kernel_addrinfo
  379. {
  380. int ai_flags; /* Input flags. */
  381. int ai_family; /* Protocol family for socket. */
  382. int ai_socktype; /* Socket type. */
  383. int ai_protocol; /* Protocol for socket. */
  384. socklen_t ai_addrlen; /* Length of socket address. */
  385. struct sockaddr *ai_addr; /* Socket address for socket. */
  386. char *ai_canonname; /* Canonical name for service location. */
  387. struct addrinfo *ai_next; /* Pointer to next in list. */
  388. };
  389. #include "elf.h"
  390. #ifdef __x86_64__
  391. typedef Elf64_auxv_t elf_auxv_t;
  392. #else
  393. typedef Elf64_auxv_t elf_auxv_t;
  394. #endif
  395. /* typedef for shim internal types */
  396. typedef unsigned int IDTYPE;
  397. typedef uint16_t FDTYPE;
  398. typedef unsigned long LEASETYPE;
  399. typedef uint64_t HASHTYPE;
  400. typedef struct atomic_int REFTYPE;
  401. #include <pal.h>
  402. struct shim_lock {
  403. PAL_HANDLE lock;
  404. IDTYPE owner;
  405. };
  406. typedef struct shim_aevent {
  407. PAL_HANDLE event;
  408. } AEVENTTYPE;
  409. #define STR_SIZE 256
  410. struct shim_str {
  411. char str[STR_SIZE];
  412. };
  413. #define QSTR_SIZE 32
  414. /* Use qstr for names. This has fixed size string + string object
  415. * if len > SHIM_QSTR_SIZE then use overflow string */
  416. struct shim_qstr {
  417. HASHTYPE hash;
  418. size_t len;
  419. char name[QSTR_SIZE];
  420. struct shim_str * oflow;
  421. };
  422. #endif /* _SHIM_TYPES_H_ */