| /* | |
| * System call related declarations | |
| * | |
| * Copyright (c) 2013-2015 Stacey D. Son | |
| * | |
| * SPDX-License-Identifier: GPL-2.0-or-later | |
| */ | |
| #ifndef SYSCALL_DEFS_H | |
| #define SYSCALL_DEFS_H | |
| #include <sys/syscall.h> | |
| #include <sys/resource.h> | |
| #include "errno_defs.h" | |
| #include "os-syscall.h" | |
| /* | |
| * machine/_types.h | |
| * or x86/_types.h | |
| */ | |
| struct target_iovec { | |
| abi_long iov_base; /* Starting address */ | |
| abi_long iov_len; /* Number of bytes */ | |
| }; | |
| /* | |
| * sys/ipc.h | |
| */ | |
| struct target_ipc_perm { | |
| uint32_t cuid; /* creator user id */ | |
| uint32_t cgid; /* creator group id */ | |
| uint32_t uid; /* user id */ | |
| uint32_t gid; /* group id */ | |
| uint16_t mode; /* r/w permission */ | |
| uint16_t seq; /* sequence # */ | |
| abi_long key; /* user specified msg/sem/shm key */ | |
| }; | |
| #define TARGET_IPC_RMID 0 /* remove identifier */ | |
| #define TARGET_IPC_SET 1 /* set options */ | |
| #define TARGET_IPC_STAT 2 /* get options */ | |
| /* | |
| * sys/sem.h | |
| */ | |
| #define TARGET_GETNCNT 3 /* Return the value of semncnt {READ} */ | |
| #define TARGET_GETPID 4 /* Return the value of sempid {READ} */ | |
| #define TARGET_GETVAL 5 /* Return the value of semval {READ} */ | |
| #define TARGET_GETALL 6 /* Return semvals into arg.array {READ} */ | |
| #define TARGET_GETZCNT 7 /* Return the value of semzcnt {READ} */ | |
| #define TARGET_SETVAL 8 /* Set the value of semval to arg.val {ALTER} */ | |
| #define TARGET_SETALL 9 /* Set semvals from arg.array {ALTER} */ | |
| struct target_sembuf { | |
| abi_ushort sem_num; /* semaphore # */ | |
| abi_short sem_op; /* semaphore operation */ | |
| abi_short sem_flg; /* operation flags */ | |
| }; | |
| union target_semun { | |
| abi_int val; /* value for SETVAL */ | |
| abi_ulong buf; /* buffer for IPC_STAT & IPC_SET */ | |
| abi_ulong array; /* array for GETALL & SETALL */ | |
| }; | |
| struct target_semid_ds { | |
| struct target_ipc_perm sem_perm; /* operation permission struct */ | |
| abi_ptr sem_base; /* pointer to first semaphore in set */ | |
| abi_ushort sem_nsems; /* number of sems in set */ | |
| target_time_t sem_otime; /* last operation time */ | |
| target_time_t sem_ctime; /* times measured in secs */ | |
| }; | |
| /* | |
| * sys/shm.h | |
| */ | |
| struct target_shmid_ds { | |
| struct target_ipc_perm shm_perm; /* peration permission structure */ | |
| abi_ulong shm_segsz; /* size of segment in bytes */ | |
| int32_t shm_lpid; /* process ID of last shared memory op */ | |
| int32_t shm_cpid; /* process ID of creator */ | |
| int32_t shm_nattch; /* number of current attaches */ | |
| target_time_t shm_atime; /* time of last shmat() */ | |
| target_time_t shm_dtime; /* time of last shmdt() */ | |
| target_time_t shm_ctime; /* time of last change by shmctl() */ | |
| }; | |
| #define N_BSD_SHM_REGIONS 32 | |
| struct bsd_shm_regions { | |
| abi_long start; | |
| abi_long size; | |
| }; | |
| /* | |
| * sys/msg.h | |
| */ | |
| struct target_msqid_ds { | |
| struct target_ipc_perm msg_perm; /* msg queue permission bits */ | |
| abi_ptr msg_first; /* first message in the queue */ | |
| abi_ptr msg_last; /* last message in the queue */ | |
| abi_ulong msg_cbytes; /* # of bytes in use on the queue */ | |
| abi_ulong msg_qnum; /* number of msgs in the queue */ | |
| abi_ulong msg_qbytes; /* max # of bytes on the queue */ | |
| int32_t msg_lspid; /* pid of last msgsnd() */ | |
| int32_t msg_lrpid; /* pid of last msgrcv() */ | |
| target_time_t msg_stime; /* time of last msgsnd() */ | |
| target_time_t msg_rtime; /* time of last msgrcv() */ | |
| target_time_t msg_ctime; /* time of last msgctl() */ | |
| }; | |
| /* | |
| * sys/msgbuf.h | |
| */ | |
| struct target_msgbuf { | |
| abi_long mtype; /* message type */ | |
| char mtext[1]; /* body of message */ | |
| }; | |
| /* | |
| * sys/mman.h | |
| */ | |
| /* | |
| * FreeBSD doesn't define this, but Linux does. In Linux, it's only MAP_PRIVATE | |
| * and MAP_SHARED and a few Linux-specific types (0xf). FreeBSD allows other | |
| * types of mapping with MAP_ANON, MAP_GUARD, and MAP_STACK. The mask on Linux | |
| * excludes these: They don't have MAP_GUARD, and MAP_STACK and MAP_ANON have | |
| * similar flags with different names that aren't in it's 0xf MAP_TYPE. | |
| */ | |
| #define MAP_TYPE (MAP_PRIVATE | MAP_SHARED) | |
| /* | |
| * sys/time.h | |
| * sys/timex.h | |
| */ | |
| /* compare to sys/timespec.h */ | |
| struct target_freebsd_timespec { | |
| target_time_t tv_sec; /* seconds */ | |
| abi_long tv_nsec; /* and nanoseconds */ | |
| #if !defined(TARGET_I386) && TARGET_ABI_BITS == 32 | |
| abi_long _pad; | |
| #endif | |
| }; | |
| #define TARGET_CPUCLOCK_WHICH_PID 0 | |
| #define TARGET_CPUCLOCK_WHICH_TID 1 | |
| /* sys/umtx.h */ | |
| struct target_freebsd__umtx_time { | |
| struct target_freebsd_timespec _timeout; | |
| uint32_t _flags; | |
| uint32_t _clockid; | |
| }; | |
| struct target_freebsd_timeval { | |
| target_time_t tv_sec; /* seconds */ | |
| target_suseconds_t tv_usec;/* and microseconds */ | |
| #if !defined(TARGET_I386) && TARGET_ABI_BITS == 32 | |
| abi_long _pad; | |
| #endif | |
| }; | |
| /* compare to sys/timex.h */ | |
| struct target_freebsd_ntptimeval { | |
| struct target_freebsd_timespec time; | |
| abi_long maxerror; | |
| abi_long esterror; | |
| abi_long tai; | |
| int32_t time_state; | |
| }; | |
| struct target_freebsd_itimerspec { | |
| struct target_freebsd_timespec it_interval; | |
| struct target_freebsd_timespec it_value; | |
| }; | |
| struct target_freebsd_timex { | |
| uint32_t modes; | |
| abi_long offset; | |
| abi_long freq; | |
| abi_long maxerror; | |
| abi_long esterror; | |
| int32_t status; | |
| abi_long constant; | |
| abi_long precision; | |
| abi_long tolerance; | |
| abi_long ppsfreq; | |
| abi_long jitter; | |
| int32_t shift; | |
| abi_long stabil; | |
| abi_long jitcnt; | |
| abi_long calcnt; | |
| abi_long errcnt; | |
| abi_long stbcnt; | |
| }; | |
| /* Maxiumum of 32 active POSIX timers allowed at any one time. */ | |
| extern int g_posix_timers[32]; | |
| #define TIMER_MAGIC 0x0caf0000 | |
| #define TIMER_MAGIC_MASK 0xffff0000 | |
| /* | |
| * sys/event.h | |
| */ | |
| struct target_freebsd11_kevent { | |
| abi_ulong ident; | |
| int16_t filter; | |
| uint16_t flags; | |
| uint32_t fflags; | |
| abi_long data; | |
| abi_ulong udata; | |
| }; | |
| struct target_freebsd_kevent { | |
| abi_ulong ident; | |
| int16_t filter; | |
| uint16_t flags; | |
| uint32_t fflags; | |
| int64_t data; | |
| abi_ulong udata; | |
| uint64_t ext[4]; | |
| }; | |
| /* | |
| * sys/resource.h | |
| */ | |
| #define TARGET_RLIM_INFINITY RLIM_INFINITY | |
| #define TARGET_RLIMIT_CPU 0 | |
| #define TARGET_RLIMIT_FSIZE 1 | |
| #define TARGET_RLIMIT_DATA 2 | |
| #define TARGET_RLIMIT_STACK 3 | |
| #define TARGET_RLIMIT_CORE 4 | |
| #define TARGET_RLIMIT_RSS 5 | |
| #define TARGET_RLIMIT_MEMLOCK 6 | |
| #define TARGET_RLIMIT_NPROC 7 | |
| #define TARGET_RLIMIT_NOFILE 8 | |
| #define TARGET_RLIMIT_SBSIZE 9 | |
| #define TARGET_RLIMIT_AS 10 | |
| #define TARGET_RLIMIT_NPTS 11 | |
| #define TARGET_RLIMIT_SWAP 12 | |
| struct target_rlimit { | |
| uint64_t rlim_cur; | |
| uint64_t rlim_max; | |
| }; | |
| struct target_freebsd_rusage { | |
| struct target_freebsd_timeval ru_utime; /* user time used */ | |
| struct target_freebsd_timeval ru_stime; /* system time used */ | |
| abi_long ru_maxrss; /* maximum resident set size */ | |
| abi_long ru_ixrss; /* integral shared memory size */ | |
| abi_long ru_idrss; /* integral unshared data size */ | |
| abi_long ru_isrss; /* integral unshared stack size */ | |
| abi_long ru_minflt; /* page reclaims */ | |
| abi_long ru_majflt; /* page faults */ | |
| abi_long ru_nswap; /* swaps */ | |
| abi_long ru_inblock; /* block input operations */ | |
| abi_long ru_oublock; /* block output operations */ | |
| abi_long ru_msgsnd; /* messages sent */ | |
| abi_long ru_msgrcv; /* messages received */ | |
| abi_long ru_nsignals; /* signals received */ | |
| abi_long ru_nvcsw; /* voluntary context switches */ | |
| abi_long ru_nivcsw; /* involuntary context switches */ | |
| }; | |
| struct target_freebsd__wrusage { | |
| struct target_freebsd_rusage wru_self; | |
| struct target_freebsd_rusage wru_children; | |
| }; | |
| /* | |
| * sys/socket.h | |
| */ | |
| /* | |
| * Types | |
| */ | |
| #define TARGET_SOCK_STREAM 1 /* stream socket */ | |
| #define TARGET_SOCK_DGRAM 2 /* datagram socket */ | |
| #define TARGET_SOCK_RAW 3 /* raw-protocol interface */ | |
| #define TARGET_SOCK_RDM 4 /* reliably-delivered message */ | |
| #define TARGET_SOCK_SEQPACKET 5 /* sequenced packet stream */ | |
| /* | |
| * Option flags per-socket. | |
| */ | |
| #define TARGET_SO_DEBUG 0x0001 /* turn on debugging info recording */ | |
| #define TARGET_SO_ACCEPTCONN 0x0002 /* socket has had listen() */ | |
| #define TARGET_SO_REUSEADDR 0x0004 /* allow local address reuse */ | |
| #define TARGET_SO_KEEPALIVE 0x0008 /* keep connections alive */ | |
| #define TARGET_SO_DONTROUTE 0x0010 /* just use interface addresses */ | |
| #define TARGET_SO_BROADCAST 0x0020 /* permit sending of broadcast msgs */ | |
| #define TARGET_SO_USELOOPBACK 0x0040 /* bypass hardware when possible */ | |
| #define TARGET_SO_LINGER 0x0080 /* linger on close if data present */ | |
| #define TARGET_SO_OOBINLINE 0x0100 /* leave received OOB data in line */ | |
| #define TARGET_SO_REUSEPORT 0x0200 /* allow local address & port reuse */ | |
| #define TARGET_SO_TIMESTAMP 0x0400 /* timestamp received dgram traffic */ | |
| #define TARGET_SO_NOSIGPIPE 0x0800 /* no SIGPIPE from EPIPE */ | |
| #define TARGET_SO_ACCEPTFILTER 0x1000 /* there is an accept filter */ | |
| #define TARGET_SO_BINTIME 0x2000 /* timestamp received dgram traffic */ | |
| #define TARGET_SO_NO_OFFLOAD 0x4000 /* socket cannot be offloaded */ | |
| #define TARGET_SO_NO_DDP 0x8000 /* disable direct data placement */ | |
| /* | |
| * Additional options, not kept in so_options. | |
| */ | |
| #define TARGET_SO_SNDBUF 0x1001 /* send buffer size */ | |
| #define TARGET_SO_RCVBUF 0x1002 /* receive buffer size */ | |
| #define TARGET_SO_SNDLOWAT 0x1003 /* send low-water mark */ | |
| #define TARGET_SO_RCVLOWAT 0x1004 /* receive low-water mark */ | |
| #define TARGET_SO_SNDTIMEO 0x1005 /* send timeout */ | |
| #define TARGET_SO_RCVTIMEO 0x1006 /* receive timeout */ | |
| #define TARGET_SO_ERROR 0x1007 /* get error status and clear */ | |
| #define TARGET_SO_TYPE 0x1008 /* get socket type */ | |
| #define TARGET_SO_LABEL 0x1009 /* socket's MAC label */ | |
| #define TARGET_SO_PEERLABEL 0x1010 /* socket's peer's MAC label */ | |
| #define TARGET_SO_LISTENQLIMIT 0x1011 /* socket's backlog limit */ | |
| #define TARGET_SO_LISTENQLEN 0x1012 /* socket's complete queue length */ | |
| #define TARGET_SO_LISTENINCQLEN 0x1013 /* socket's incomplete queue length */ | |
| #define TARGET_SO_SETFIB 0x1014 /* use this FIB to route */ | |
| #define TARGET_SO_USER_COOKIE 0x1015 /* user cookie (dummynet etc.) */ | |
| #define TARGET_SO_PROTOCOL 0x1016 /* get socket protocol (Linux name) */ | |
| /* alias for SO_PROTOCOL (SunOS name) */ | |
| #define TARGET_SO_PROTOTYPE TARGET_SO_PROTOCOL | |
| /* | |
| * Level number for (get/set)sockopt() to apply to socket itself. | |
| */ | |
| #define TARGET_SOL_SOCKET 0xffff /* options for socket level */ | |
| #ifndef CMSG_ALIGN | |
| #define CMSG_ALIGN(len) (((len) + sizeof(long) - 1) & ~(sizeof(long) - 1)) | |
| #endif | |
| /* | |
| * sys/socket.h | |
| */ | |
| struct target_msghdr { | |
| abi_long msg_name; /* Socket name */ | |
| int32_t msg_namelen; /* Length of name */ | |
| abi_long msg_iov; /* Data blocks */ | |
| int32_t msg_iovlen; /* Number of blocks */ | |
| abi_long msg_control; /* Per protocol magic (eg BSD fd passing) */ | |
| int32_t msg_controllen; /* Length of cmsg list */ | |
| int32_t msg_flags; /* flags on received message */ | |
| }; | |
| struct target_sockaddr { | |
| uint8_t sa_len; | |
| uint8_t sa_family; | |
| uint8_t sa_data[14]; | |
| } QEMU_PACKED; | |
| struct target_in_addr { | |
| uint32_t s_addr; /* big endian */ | |
| }; | |
| struct target_cmsghdr { | |
| uint32_t cmsg_len; | |
| int32_t cmsg_level; | |
| int32_t cmsg_type; | |
| }; | |
| /* | |
| * mips32 is the exception to the general rule of long-alignment; it | |
| * unconditionally uses 64-bit alignment instead. | |
| */ | |
| #if defined(TARGET_MIPS) && TARGET_ABI_BITS == 32 | |
| #define TARGET_ALIGNBYTES (sizeof(abi_llong) - 1) | |
| #else | |
| #define TARGET_ALIGNBYTES (sizeof(abi_long) - 1) | |
| #endif | |
| #define TARGET_CMSG_NXTHDR(mhdr, cmsg, cmsg_start) \ | |
| __target_cmsg_nxthdr(mhdr, cmsg, cmsg_start) | |
| #define TARGET_CMSG_ALIGN(len) (((len) + TARGET_ALIGNBYTES) \ | |
| & (size_t) ~TARGET_ALIGNBYTES) | |
| #define TARGET_CMSG_DATA(cmsg) \ | |
| ((unsigned char *)(cmsg) + TARGET_CMSG_ALIGN(sizeof(struct target_cmsghdr))) | |
| #define TARGET_CMSG_SPACE(len) \ | |
| (TARGET_CMSG_ALIGN(sizeof(struct target_cmsghdr)) + TARGET_CMSG_ALIGN(len)) | |
| #define TARGET_CMSG_LEN(len) \ | |
| (TARGET_CMSG_ALIGN(sizeof(struct target_cmsghdr)) + (len)) | |
| static inline struct target_cmsghdr * | |
| __target_cmsg_nxthdr(struct target_msghdr *__mhdr, | |
| struct target_cmsghdr *__cmsg, | |
| struct target_cmsghdr *__cmsg_start) | |
| { | |
| struct target_cmsghdr *__ptr; | |
| __ptr = (struct target_cmsghdr *)((unsigned char *) __cmsg + | |
| TARGET_CMSG_ALIGN(tswap32(__cmsg->cmsg_len))); | |
| if ((unsigned long)((char *)(__ptr + 1) - (char *)__cmsg_start) > | |
| tswap32(__mhdr->msg_controllen)) { | |
| /* No more entries. */ | |
| return (struct target_cmsghdr *)0; | |
| } | |
| return __ptr; | |
| } | |
| /* | |
| * netinet/in.h | |
| */ | |
| struct target_ip_mreq { | |
| struct target_in_addr imr_multiaddr; | |
| struct target_in_addr imr_interface; | |
| }; | |
| struct target_ip_mreqn { | |
| struct target_in_addr imr_multiaddr; | |
| struct target_in_addr imr_address; | |
| int32_t imr_ifindex; | |
| }; | |
| /* | |
| * sys/stat.h | |
| */ | |
| struct target_freebsd11_stat { | |
| uint32_t st_dev; /* inode's device */ | |
| uint32_t st_ino; /* inode's number */ | |
| int16_t st_mode; /* inode protection mode */ | |
| int16_t st_nlink; /* number of hard links */ | |
| uint32_t st_uid; /* user ID of the file's owner */ | |
| uint32_t st_gid; /* group ID of the file's group */ | |
| uint32_t st_rdev; /* device type */ | |
| struct target_freebsd_timespec st_atim; /* time last accessed */ | |
| struct target_freebsd_timespec st_mtim; /* time last data modification */ | |
| struct target_freebsd_timespec st_ctim; /* time last file status change */ | |
| int64_t st_size; /* file size, in bytes */ | |
| int64_t st_blocks; /* blocks allocated for file */ | |
| uint32_t st_blksize; /* optimal blocksize for I/O */ | |
| uint32_t st_flags; /* user defined flags for file */ | |
| uint32_t st_gen; /* file generation number */ | |
| int32_t st_lspare; | |
| struct target_freebsd_timespec st_birthtim; /* time of file creation */ | |
| /* | |
| * Explicitly pad st_birthtim to 16 bytes so that the size of | |
| * struct stat is backwards compatible. We use bitfields instead | |
| * of an array of chars so that this doesn't require a C99 compiler | |
| * to compile if the size of the padding is 0. We use 2 bitfields | |
| * to cover up to 64 bits on 32-bit machines. We assume that | |
| * CHAR_BIT is 8... | |
| */ | |
| unsigned int:(8 / 2) * (16 - (int)sizeof(struct target_freebsd_timespec)); | |
| unsigned int:(8 / 2) * (16 - (int)sizeof(struct target_freebsd_timespec)); | |
| } __packed; | |
| #if defined(TARGET_I386) && !defined(TARGET_X86_64) | |
| #define TARGET_HAS_STAT_TIME_T_EXT 1 | |
| #endif | |
| struct target_stat { | |
| uint64_t st_dev; /* inode's device */ | |
| uint64_t st_ino; /* inode's number */ | |
| uint64_t st_nlink; /* number of hard links */ | |
| int16_t st_mode; /* inode protection mode */ | |
| int16_t st_padding0; | |
| uint32_t st_uid; /* user ID of the file's owner */ | |
| uint32_t st_gid; /* group ID of the file's group */ | |
| int32_t st_padding1; | |
| uint64_t st_rdev; /* device type */ | |
| #ifdef TARGET_HAS_STAT_TIME_T_EXT | |
| int32_t st_atim_ext; | |
| #endif | |
| struct target_freebsd_timespec st_atim; /* time of last access */ | |
| #ifdef TARGET_HAS_STAT_TIME_T_EXT | |
| int32_t st_mtim_ext; | |
| #endif | |
| struct target_freebsd_timespec st_mtim; /* time of last data modification */ | |
| #ifdef TARGET_HAS_STAT_TIME_T_EXT | |
| int32_t st_ctim_ext; | |
| #endif | |
| struct target_freebsd_timespec st_ctim;/* time of last file status change */ | |
| #ifdef TARGET_HAS_STAT_TIME_T_EXT | |
| int32_t st_btim_ext; | |
| #endif | |
| struct target_freebsd_timespec st_birthtim; /* time of file creation */ | |
| int64_t st_size; /* file size, in bytes */ | |
| int64_t st_blocks; /* blocks allocated for file */ | |
| uint32_t st_blksize; /* optimal blocksize for I/O */ | |
| uint32_t st_flags; /* user defined flags for file */ | |
| uint64_t st_gen; /* file generation number */ | |
| uint64_t st_spare[10]; | |
| }; | |
| /* struct nstat is the same as stat above but without the st_lspare field */ | |
| struct target_freebsd11_nstat { | |
| uint32_t st_dev; /* inode's device */ | |
| uint32_t st_ino; /* inode's number */ | |
| int16_t st_mode; /* inode protection mode */ | |
| int16_t st_nlink; /* number of hard links */ | |
| uint32_t st_uid; /* user ID of the file's owner */ | |
| uint32_t st_gid; /* group ID of the file's group */ | |
| uint32_t st_rdev; /* device type */ | |
| struct target_freebsd_timespec st_atim; /* time last accessed */ | |
| struct target_freebsd_timespec st_mtim; /* time last data modification */ | |
| struct target_freebsd_timespec st_ctim; /* time last file status change */ | |
| int64_t st_size; /* file size, in bytes */ | |
| int64_t st_blocks; /* blocks allocated for file */ | |
| uint32_t st_blksize; /* optimal blocksize for I/O */ | |
| uint32_t st_flags; /* user defined flags for file */ | |
| uint32_t st_gen; /* file generation number */ | |
| struct target_freebsd_timespec st_birthtim; /* time of file creation */ | |
| /* | |
| * Explicitly pad st_birthtim to 16 bytes so that the size of | |
| * struct stat is backwards compatible. We use bitfields instead | |
| * of an array of chars so that this doesn't require a C99 compiler | |
| * to compile if the size of the padding is 0. We use 2 bitfields | |
| * to cover up to 64 bits on 32-bit machines. We assume that | |
| * CHAR_BIT is 8... | |
| */ | |
| unsigned int:(8 / 2) * (16 - (int)sizeof(struct target_freebsd_timespec)); | |
| unsigned int:(8 / 2) * (16 - (int)sizeof(struct target_freebsd_timespec)); | |
| } __packed; | |
| /* | |
| * sys/mount.h | |
| */ | |
| /* filesystem id type */ | |
| typedef struct target_freebsd_fsid { int32_t val[2]; } target_freebsd_fsid_t; | |
| /* filesystem statistics */ | |
| struct target_freebsd11_statfs { | |
| uint32_t f_version; /* structure version number */ | |
| uint32_t f_type; /* type of filesystem */ | |
| uint64_t f_flags; /* copy of mount exported flags */ | |
| uint64_t f_bsize; /* filesystem fragment size */ | |
| uint64_t f_iosize; /* optimal transfer block size */ | |
| uint64_t f_blocks; /* total data blocks in filesystem */ | |
| uint64_t f_bfree; /* free blocks in filesystem */ | |
| int64_t f_bavail; /* free blocks avail to non-superuser */ | |
| uint64_t f_files; /* total file nodes in filesystem */ | |
| int64_t f_ffree; /* free nodes avail to non-superuser */ | |
| uint64_t f_syncwrites; /* count of sync writes since mount */ | |
| uint64_t f_asyncwrites; /* count of async writes since mount */ | |
| uint64_t f_syncreads; /* count of sync reads since mount */ | |
| uint64_t f_asyncreads; /* count of async reads since mount */ | |
| uint64_t f_spare[10]; /* unused spare */ | |
| uint32_t f_namemax; /* maximum filename length */ | |
| uint32_t f_owner; /* user that mounted the filesystem */ | |
| target_freebsd_fsid_t f_fsid; /* filesystem id */ | |
| char f_charspare[80]; /* spare string space */ | |
| char f_fstypename[16]; /* filesys type name */ | |
| char f_mntfromname[88]; /* mount filesystem */ | |
| char f_mntonname[88]; /* dir on which mounted*/ | |
| }; | |
| struct target_statfs { | |
| uint32_t f_version; /* structure version number */ | |
| uint32_t f_type; /* type of filesystem */ | |
| uint64_t f_flags; /* copy of mount exported flags */ | |
| uint64_t f_bsize; /* filesystem fragment size */ | |
| uint64_t f_iosize; /* optimal transfer block size */ | |
| uint64_t f_blocks; /* total data blocks in filesystem */ | |
| uint64_t f_bfree; /* free blocks in filesystem */ | |
| int64_t f_bavail; /* free blocks avail to non-superuser */ | |
| uint64_t f_files; /* total file nodes in filesystem */ | |
| int64_t f_ffree; /* free nodes avail to non-superuser */ | |
| uint64_t f_syncwrites; /* count of sync writes since mount */ | |
| uint64_t f_asyncwrites; /* count of async writes since mount */ | |
| uint64_t f_syncreads; /* count of sync reads since mount */ | |
| uint64_t f_asyncreads; /* count of async reads since mount */ | |
| uint64_t f_spare[10]; /* unused spare */ | |
| uint32_t f_namemax; /* maximum filename length */ | |
| uint32_t f_owner; /* user that mounted the filesystem */ | |
| target_freebsd_fsid_t f_fsid; /* filesystem id */ | |
| char f_charspare[80]; /* spare string space */ | |
| char f_fstypename[16]; /* filesystem type name */ | |
| char f_mntfromname[1024]; /* mounted filesystem */ | |
| char f_mntonname[1024]; /* directory on which mounted */ | |
| }; | |
| /* File identifier. These are unique per filesystem on a single machine. */ | |
| #define TARGET_MAXFIDSZ 16 | |
| struct target_freebsd_fid { | |
| uint16_t fid_len; /* len of data in bytes */ | |
| uint16_t fid_data0; /* force longword align */ | |
| char fid_data[TARGET_MAXFIDSZ]; /* data (variable len) */ | |
| }; | |
| /* Generic file handle */ | |
| struct target_freebsd_fhandle { | |
| target_freebsd_fsid_t fh_fsid; /* Filesystem id of mount point */ | |
| struct target_freebsd_fid fh_fid; /* Filesys specific id */ | |
| }; | |
| typedef struct target_freebsd_fhandle target_freebsd_fhandle_t; | |
| /* | |
| * sys/fcntl.h | |
| */ | |
| #define TARGET_F_DUPFD 0 | |
| #define TARGET_F_GETFD 1 | |
| #define TARGET_F_SETFD 2 | |
| #define TARGET_F_GETFL 3 | |
| #define TARGET_F_SETFL 4 | |
| #define TARGET_F_GETOWN 5 | |
| #define TARGET_F_SETOWN 6 | |
| #define TARGET_F_OGETLK 7 | |
| #define TARGET_F_OSETLK 8 | |
| #define TARGET_F_OSETLKW 9 | |
| #define TARGET_F_DUP2FD 10 | |
| #define TARGET_F_GETLK 11 | |
| #define TARGET_F_SETLK 12 | |
| #define TARGET_F_SETLKW 13 | |
| #define TARGET_F_SETLK_REMOTE 14 | |
| #define TARGET_F_READAHEAD 15 | |
| #define TARGET_F_RDAHEAD 16 | |
| #define TARGET_F_DUPFD_CLOEXEC 17 | |
| #define TARGET_F_DUP2FD_CLOEXEC 18 | |
| /* FreeBSD-specific */ | |
| #define TARGET_F_ADD_SEALS 19 | |
| #define TARGET_F_GET_SEALS 20 | |
| struct target_freebsd_flock { | |
| int64_t l_start; | |
| int64_t l_len; | |
| int32_t l_pid; | |
| int16_t l_type; | |
| int16_t l_whence; | |
| int32_t l_sysid; | |
| } QEMU_PACKED; | |
| /* sys/unistd.h */ | |
| /* user: vfork(2) semantics, clear signals */ | |
| #define TARGET_RFSPAWN (1U << 31) | |
| /* sys/specialfd.h */ | |
| enum target_specialfd_type { | |
| TARGET_SPECIALFD_EVENT = 1, | |
| }; | |
| struct target_specialfd_eventfd { | |
| unsigned int initval; | |
| int flags; | |
| }; | |
| /* | |
| * FreeBSD thread and user mutex support. | |
| */ | |
| /* sys/thr.h */ | |
| #define TARGET_THR_SUSPENDED 0x0001 | |
| #define TARGET_THR_SYSTEM_SCOPE 0x0002 | |
| struct target_freebsd_thr_param { | |
| abi_ulong start_func; /* thread entry function. */ | |
| abi_ulong arg; /* argument for entry function. */ | |
| abi_ulong stack_base; /* stack base address. */ | |
| abi_ulong stack_size; /* stack size. */ | |
| abi_ulong tls_base; /* tls base address. */ | |
| abi_ulong tls_size; /* tls size. */ | |
| abi_ulong child_tid; /* address to store new TID. */ | |
| abi_ulong parent_tid; /* parent access the new TID here. */ | |
| int32_t flags; /* thread flags. */ | |
| abi_ulong rtp; /* Real-time scheduling priority. */ | |
| abi_ulong spare[3]; /* spares. */ | |
| }; | |
| /* sys/rtprio.h */ | |
| struct target_freebsd_rtprio { | |
| uint16_t type; | |
| uint16_t prio; | |
| }; | |
| typedef struct { | |
| CPUArchState *env; | |
| long parent_tid; | |
| pthread_mutex_t mutex; | |
| pthread_cond_t cond; | |
| pthread_t thread; | |
| sigset_t sigmask; | |
| struct target_freebsd_thr_param param; | |
| } new_freebsd_thread_info_t; | |
| /* sys/utmx.h */ | |
| /* op code for _umtx_op */ | |
| #define TARGET_UMTX_OP_LOCK 0 | |
| #define TARGET_UMTX_OP_UNLOCK 1 | |
| #define TARGET_UMTX_OP_WAIT 2 | |
| #define TARGET_UMTX_OP_WAKE 3 | |
| #define TARGET_UMTX_OP_MUTEX_TRYLOCK 4 | |
| #define TARGET_UMTX_OP_MUTEX_LOCK 5 | |
| #define TARGET_UMTX_OP_MUTEX_UNLOCK 6 | |
| #define TARGET_UMTX_OP_SET_CEILING 7 | |
| #define TARGET_UMTX_OP_CV_WAIT 8 | |
| #define TARGET_UMTX_OP_CV_SIGNAL 9 | |
| #define TARGET_UMTX_OP_CV_BROADCAST 10 | |
| #define TARGET_UMTX_OP_WAIT_UINT 11 | |
| #define TARGET_UMTX_OP_RW_RDLOCK 12 | |
| #define TARGET_UMTX_OP_RW_WRLOCK 13 | |
| #define TARGET_UMTX_OP_RW_UNLOCK 14 | |
| #define TARGET_UMTX_OP_WAIT_UINT_PRIVATE 15 | |
| #define TARGET_UMTX_OP_WAKE_PRIVATE 16 | |
| #define TARGET_UMTX_OP_MUTEX_WAIT 17 | |
| #define TARGET_UMTX_OP_MUTEX_WAKE 18 | |
| #define TARGET_UMTX_OP_SEM_WAIT 19 | |
| #define TARGET_UMTX_OP_SEM_WAKE 20 | |
| #define TARGET_UMTX_OP_NWAKE_PRIVATE 21 | |
| #define TARGET_UMTX_OP_MUTEX_WAKE2 22 | |
| #define TARGET_UMTX_OP_SEM2_WAIT 23 | |
| #define TARGET_UMTX_OP_SEM2_WAKE 24 | |
| #define TARGET_UMTX_OP_SHM 25 | |
| #define TARGET_UMTX_OP_ROBUST_LISTS 26 | |
| /* flags for UMTX_OP_CV_WAIT */ | |
| #define TARGET_CVWAIT_CHECK_UNPARKING 0x01 | |
| #define TARGET_CVWAIT_ABSTIME 0x02 | |
| #define TARGET_CVWAIT_CLOCKID 0x04 | |
| #define TARGET_UMTX_UNOWNED 0x0 | |
| #define TARGET_UMUTEX_UNOWNED 0x0 | |
| #define TARGET_UMTX_CONTESTED (abi_ulong)(-1) | |
| #define TARGET_UMUTEX_CONTESTED 0x80000000U | |
| /* flags for umutex */ | |
| #define TARGET_UMUTEX_ERROR_CHECK 0x0002 /* Error-checking mutex */ | |
| #define TARGET_UMUTEX_PRIO_INHERIT 0x0004 /* Priority inherited mutex */ | |
| #define TARGET_UMUTEX_PRIO_PROTECT 0x0008 /* Priority protect mutex */ | |
| #define TARGET_UMUTEX_TRY 1 | |
| #define TARGET_UMUTEX_WAIT 2 | |
| /* urwlock flags */ | |
| #define TARGET_URWLOCK_PREFER_READER 0x0002 | |
| #define TARGET_URWLOCK_WRITE_OWNER 0x80000000U | |
| #define TARGET_URWLOCK_WRITE_WAITERS 0x40000000U | |
| #define TARGET_URWLOCK_READ_WAITERS 0x20000000U | |
| #define TARGET_URWLOCK_MAX_READERS 0x1fffffffU | |
| #define TARGET_URWLOCK_READER_COUNT(c) ((c) & TARGET_URWLOCK_MAX_READERS) | |
| /* | |
| * sys/acl.h | |
| */ | |
| #define TARGET_FREEBSD_ACL_MAX_ENTRIES 254 | |
| /* vaild acl_type_t arguments */ | |
| #define TARGET_FREEBSD_ACL_TYPE_ACCESS_OLD 0x00000000 | |
| #define TARGET_FREEBSD_ACL_TYPE_DEFAULT_OLD 0x00000001 | |
| #define TARGET_FREEBSD_ACL_TYPE_ACCESS 0x00000002 | |
| #define TARGET_FREEBSD_ACL_TYPE_DEFAULT 0x00000003 | |
| #define TARGET_FREEBSD_ACL_TYPE_NFS4 0x00000004 | |
| struct target_freebsd_acl_entry { | |
| uint32_t ae_tag; | |
| uint32_t ae_id; | |
| uint32_t ae_perm; | |
| uint16_t ae_entry_type; | |
| uint16_t ae_flags; | |
| }; | |
| struct target_freebsd_acl { | |
| uint32_t acl_maxcnt; | |
| uint32_t acl_cnt; | |
| int32_t acl_spare[4]; | |
| struct target_freebsd_acl_entry acl_entry[TARGET_FREEBSD_ACL_MAX_ENTRIES]; | |
| }; | |
| /* | |
| * sys/uuid.h | |
| */ | |
| #define TARGET_UUID_NODE_LEN 6 | |
| struct target_uuid { | |
| uint32_t time_low; | |
| uint16_t time_mid; | |
| uint16_t time_hi_and_version; | |
| uint8_t clock_seq_hi_and_reserved; | |
| uint8_t clock_seq_low; | |
| uint8_t node[TARGET_UUID_NODE_LEN]; | |
| }; | |
| /* | |
| * from sys/procctl.h | |
| */ | |
| #define TARGET_PROC_SPROTECT 1 | |
| #define TARGET_PROC_REAP_ACQUIRE 2 | |
| #define TARGET_PROC_REAP_RELEASE 3 | |
| #define TARGET_PROC_REAP_STATUS 4 | |
| #define TARGET_PROC_REAP_GETPIDS 5 | |
| #define TARGET_PROC_REAP_KILL 6 | |
| struct target_procctl_reaper_status { | |
| uint32_t rs_flags; | |
| uint32_t rs_children; | |
| uint32_t rs_descendants; | |
| uint32_t rs_reaper; | |
| uint32_t rs_pid; | |
| uint32_t rs_pad0[15]; | |
| }; | |
| struct target_procctl_reaper_pidinfo { | |
| uint32_t pi_pid; | |
| uint32_t pi_subtree; | |
| uint32_t pi_flags; | |
| uint32_t pi_pad0[15]; | |
| }; | |
| struct target_procctl_reaper_pids { | |
| uint32_t rp_count; | |
| uint32_t rp_pad0[15]; | |
| abi_ulong rp_pids; | |
| }; | |
| struct target_procctl_reaper_kill { | |
| int32_t rk_sig; | |
| uint32_t rk_flags; | |
| uint32_t rk_subtree; | |
| uint32_t rk_killed; | |
| uint32_t rk_fpid; | |
| uint32_t rk_pad0[15]; | |
| }; | |
| #define safe_syscall0(type, name) \ | |
| type safe_##name(void) \ | |
| { \ | |
| return safe_syscall(SYS_##name); \ | |
| } | |
| #define safe_syscall1(type, name, type1, arg1) \ | |
| type safe_##name(type1 arg1) \ | |
| { \ | |
| return safe_syscall(SYS_##name, arg1); \ | |
| } | |
| #define safe_syscall2(type, name, type1, arg1, type2, arg2) \ | |
| type safe_##name(type1 arg1, type2 arg2) \ | |
| { \ | |
| return safe_syscall(SYS_##name, arg1, arg2); \ | |
| } | |
| #define safe_syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \ | |
| type safe_##name(type1 arg1, type2 arg2, type3 arg3) \ | |
| { \ | |
| return safe_syscall(SYS_##name, arg1, arg2, arg3); \ | |
| } | |
| #define safe_syscall4(type, name, type1, arg1, type2, arg2, type3, arg3, \ | |
| type4, arg4) \ | |
| type safe_##name(type1 arg1, type2 arg2, type3 arg3, type4 arg4) \ | |
| { \ | |
| return safe_syscall(SYS_##name, arg1, arg2, arg3, arg4); \ | |
| } | |
| #define safe_syscall5(type, name, type1, arg1, type2, arg2, type3, arg3, \ | |
| type4, arg4, type5, arg5) \ | |
| type safe_##name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ | |
| type5 arg5) \ | |
| { \ | |
| return safe_syscall(SYS_##name, arg1, arg2, arg3, arg4, arg5); \ | |
| } | |
| #define safe_syscall6(type, name, type1, arg1, type2, arg2, type3, arg3, \ | |
| type4, arg4, type5, arg5, type6, arg6) \ | |
| type safe_##name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ | |
| type5 arg5, type6 arg6) \ | |
| { \ | |
| return safe_syscall(SYS_##name, arg1, arg2, arg3, arg4, arg5, arg6); \ | |
| } | |
| #define safe_ioctl(...) safe_syscall(SYS_ioctl, __VA_ARGS__) | |
| #define safe_fcntl(...) safe_syscall(SYS_fcntl, __VA_ARGS__) | |
| struct target_pollfd { | |
| int32_t fd; /* file descriptor */ | |
| int16_t events; /* requested events */ | |
| int16_t revents; /* returned events */ | |
| }; | |
| /* So far all target and host bitmasks are the same */ | |
| #undef target_to_host_bitmask | |
| #define target_to_host_bitmask(x, tbl) (x) | |
| #undef host_to_target_bitmask | |
| #define host_to_target_bitmask(x, tbl) (x) | |
| #endif /* SYSCALL_DEFS_H */ |