From: Paul Floyd Date: Sun, 3 Oct 2021 17:02:04 +0000 (+0200) Subject: FreeBSD support, patch 3 X-Git-Tag: VALGRIND_3_18_0~41 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7774acbc9c9c4caac2e6e2400635ddde667af6c7;p=thirdparty%2Fvalgrind.git FreeBSD support, patch 3 include directory New FreeBSD specific headers SONAMES for FreeBSD libraries --- diff --git a/include/Makefile.am b/include/Makefile.am index 05cec97898..972d394b8f 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -47,9 +47,12 @@ nobase_pkginclude_HEADERS = \ pub_tool_xtmemory.h \ valgrind.h \ vki/vki-linux.h \ + vki/vki-freebsd.h \ vki/vki-darwin.h \ vki/vki-solaris.h \ vki/vki-solaris-repcache.h \ + vki/vki-machine-types-amd64-freebsd.h \ + vki/vki-machine-types-x86-freebsd.h \ vki/vki-posixtypes-amd64-linux.h \ vki/vki-posixtypes-arm64-linux.h \ vki/vki-posixtypes-ppc32-linux.h \ @@ -65,6 +68,8 @@ nobase_pkginclude_HEADERS = \ vki/vki-ppc32-linux.h \ vki/vki-ppc64-linux.h \ vki/vki-x86-linux.h \ + vki/vki-amd64-freebsd.h \ + vki/vki-x86-freebsd.h \ vki/vki-arm-linux.h \ vki/vki-s390x-linux.h \ vki/vki-mips32-linux.h \ @@ -75,6 +80,7 @@ nobase_pkginclude_HEADERS = \ vki/vki-scnums-ppc32-linux.h \ vki/vki-scnums-ppc64-linux.h \ vki/vki-scnums-x86-linux.h \ + vki/vki-scnums-freebsd.h \ vki/vki-scnums-arm-linux.h \ vki/vki-scnums-s390x-linux.h \ vki/vki-scnums-mips32-linux.h \ diff --git a/include/pub_tool_aspacemgr.h b/include/pub_tool_aspacemgr.h index ccd143bec8..4466345490 100644 --- a/include/pub_tool_aspacemgr.h +++ b/include/pub_tool_aspacemgr.h @@ -110,6 +110,9 @@ typedef Bool hasT; // True --> translations have (or MAY have) // been taken from this segment Bool isCH; // True --> is client heap (SkAnonC ONLY) +#if defined(VGO_freebsd) + Bool isFF; // True --> is a fixed file mapping +#endif } NSegment; diff --git a/include/pub_tool_basics.h b/include/pub_tool_basics.h index d1119e1efa..d22a425238 100644 --- a/include/pub_tool_basics.h +++ b/include/pub_tool_basics.h @@ -102,6 +102,8 @@ typedef Word PtrdiffT; // 32 64 // always a signed 64-bit int. So we defined our own Off64T as well. #if defined(VGO_linux) || defined(VGO_solaris) typedef Word OffT; // 32 64 +#elif defined(VGO_freebsd) +typedef Long OffT; // 64 64 #elif defined(VGO_darwin) typedef Long OffT; // 64 64 #else @@ -225,6 +227,19 @@ typedef SysResMode _mode; } SysRes; +#elif defined(VGO_freebsd) +typedef + struct { + UWord _val; + UWord _val2; + Bool _isError; +#if defined(VGP_amd64_freebsd) + char padding[7]; +#else + char padding[3]; +#endif + } + SysRes; #elif defined(VGO_solaris) typedef @@ -306,6 +321,27 @@ static inline Bool sr_EQ ( UInt sysno, SysRes sr1, SysRes sr2 ) { && sr1._isError == sr2._isError; } +#elif defined(VGO_freebsd) + +static inline Bool sr_isError ( SysRes sr ) { + return sr._isError; +} +static inline UWord sr_Res ( SysRes sr ) { + return sr._isError ? 0 : sr._val; +} +static inline UWord sr_ResHI ( SysRes sr ) { + return sr._isError ? 0 : sr._val2; +} +static inline UWord sr_Err ( SysRes sr ) { + return sr._isError ? sr._val : 0; +} +static inline Bool sr_EQ ( UInt sysno, SysRes sr1, SysRes sr2 ) { + return sr_Res(sr1) == sr_Res(sr2) + && sr_ResHI(sr1) == sr_ResHI(sr2) + && ((sr_isError(sr1) && sr_isError(sr2)) + || (!sr_isError(sr1) && !sr_isError(sr2))); +} + #elif defined(VGO_darwin) static inline Bool sr_isError ( SysRes sr ) { diff --git a/include/pub_tool_basics_asm.h b/include/pub_tool_basics_asm.h index 83ac2e4c79..894fd1f5f0 100644 --- a/include/pub_tool_basics_asm.h +++ b/include/pub_tool_basics_asm.h @@ -46,7 +46,7 @@ #define VGAPPEND(str1,str2) str1##str2 -#if defined(VGO_linux) || defined(VGO_solaris) +#if defined(VGO_linux) || defined(VGO_solaris) || defined(VGO_freebsd) # define VG_(str) VGAPPEND( vgPlain_, str) # define ML_(str) VGAPPEND( vgModuleLocal_, str) #elif defined(VGO_darwin) diff --git a/include/pub_tool_libcproc.h b/include/pub_tool_libcproc.h index 73d7eca68c..f5d48eae74 100644 --- a/include/pub_tool_libcproc.h +++ b/include/pub_tool_libcproc.h @@ -103,7 +103,7 @@ extern UInt VG_(read_millisecond_timer) ( void ); extern Int VG_(gettimeofday)(struct vki_timeval *tv, struct vki_timezone *tz); -# if defined(VGO_linux) || defined(VGO_solaris) +# if defined(VGO_linux) || defined(VGO_solaris) || defined(VGO_freebsd) /* Get the clock value as specified by clk_id. Asserts if unsuccesful. */ extern void VG_(clock_gettime)(struct vki_timespec *ts, vki_clockid_t clk_id); # elif defined(VGO_darwin) diff --git a/include/pub_tool_libcsetjmp.h b/include/pub_tool_libcsetjmp.h index 03da232e44..6b278d285b 100644 --- a/include/pub_tool_libcsetjmp.h +++ b/include/pub_tool_libcsetjmp.h @@ -90,7 +90,7 @@ void VG_MINIMAL_LONGJMP(VG_MINIMAL_JMP_BUF(_env)); #elif defined(VGP_amd64_linux) || defined(VGP_amd64_darwin) || \ - defined(VGP_amd64_solaris) + defined(VGP_amd64_solaris) || defined(VGP_amd64_freebsd) #define VG_MINIMAL_JMP_BUF(_name) ULong _name [16+1] __attribute__((returns_twice)) @@ -100,7 +100,7 @@ void VG_MINIMAL_LONGJMP(VG_MINIMAL_JMP_BUF(_env)); #elif defined(VGP_x86_linux) || defined(VGP_x86_darwin) || \ - defined(VGP_x86_solaris) + defined(VGP_x86_solaris) || defined(VGP_x86_freebsd) #define VG_MINIMAL_JMP_BUF(_name) UInt _name [8+1] __attribute__((returns_twice)) diff --git a/include/pub_tool_machine.h b/include/pub_tool_machine.h old mode 100644 new mode 100755 index 150b975f59..9bdd4f5143 --- a/include/pub_tool_machine.h +++ b/include/pub_tool_machine.h @@ -32,14 +32,14 @@ #include "pub_tool_basics.h" // ThreadID #include "libvex.h" // VexArchInfo -#if defined(VGP_x86_linux) || defined(VGP_x86_solaris) +#if defined(VGP_x86_linux) || defined(VGP_x86_solaris) || defined(VGP_x86_freebsd) # define VG_MIN_INSTR_SZB 1 // min length of native instruction # define VG_MAX_INSTR_SZB 16 // max length of native instruction # define VG_CLREQ_SZB 14 // length of a client request, may // be larger than VG_MAX_INSTR_SZB # define VG_STACK_REDZONE_SZB 0 // number of addressable bytes below %RSP -#elif defined(VGP_amd64_linux) || defined(VGP_amd64_solaris) +#elif defined(VGP_amd64_linux) || defined(VGP_amd64_solaris) || defined(VGP_amd64_freebsd) # define VG_MIN_INSTR_SZB 1 # define VG_MAX_INSTR_SZB 16 # define VG_CLREQ_SZB 19 diff --git a/include/pub_tool_options.h b/include/pub_tool_options.h index e2a896d675..1879226e80 100644 --- a/include/pub_tool_options.h +++ b/include/pub_tool_options.h @@ -163,7 +163,7 @@ extern void VG_(list_clo)(const HChar *qq_option); val, \ &(qq_var))) { \ VG_(fmsg_bad_option)(qq_arg, "%s is an invalid %s set\n", \ - val, qq_option+2); \ + val, &qq_option[2]); \ res = False; } \ res; })) diff --git a/include/pub_tool_redir.h b/include/pub_tool_redir.h index 2e0365438e..f88d3b571f 100644 --- a/include/pub_tool_redir.h +++ b/include/pub_tool_redir.h @@ -241,7 +241,7 @@ /* --- Soname of the standard C library. --- */ -#if defined(VGO_linux) || defined(VGO_solaris) +#if defined(VGO_linux) || defined(VGO_solaris) || defined(VGO_freebsd) # if defined(MUSL_LIBC) # define VG_Z_LIBC_SONAME libcZdZa // libc.* #else @@ -269,7 +269,7 @@ #endif -/* --- Soname of the GNU C++ library. --- */ +/* --- Sonames of the GNU C++ library. --- */ // Valid on all platforms(?) #define VG_Z_LIBSTDCXX_SONAME libstdcZpZpZa // libstdc++* @@ -283,6 +283,8 @@ #if defined(VGO_linux) # define VG_Z_LIBPTHREAD_SONAME libpthreadZdsoZd0 // libpthread.so.0 +#elif defined(VGO_freebsd) +# define VG_Z_LIBPTHREAD_SONAME libthrZdsoZa // libthr.so* #elif defined(VGO_darwin) # define VG_Z_LIBPTHREAD_SONAME libSystemZdZaZddylib // libSystem.*.dylib #elif defined(VGO_solaris) @@ -321,6 +323,18 @@ #endif +/* --- Sonames for FreeBSD ELF linkers, plus unencoded versions. --- */ + +#if defined(VGO_freebsd) + +#define VG_Z_LD_ELF_SO_1 ldZhelfZdsoZd1 // ld-elf.so.1 +#define VG_U_LD_ELF_SO_1 "ld-elf.so.1" + +#define VG_Z_LD_ELF32_SO_1 ldZhelf32ZdsoZd1 // ld-elf32.so.1 +#define VG_U_LD_ELF32_SO_1 "ld-elf32.so.1" + +#endif + /* --- Executable name for Darwin Mach-O linker. --- */ #if defined(VGO_darwin) @@ -391,7 +405,7 @@ Bool VG_(is_soname_ld_so) (const HChar *soname); // FreeBSD is b) pthread functions are lin libthr but semaphore // functions are lin libc -#if defined(VGO_darwin) +#if defined(VGO_darwin) || defined(VGO_freebsd) #define VG_WRAP_THREAD_FUNCTION_LIBPTHREAD_ONLY #elif defined(VGO_solaris) || (defined(VGO_linux) && defined(MUSL_LIBC)) #define VG_WRAP_THREAD_FUNCTION_LIBC_ONLY diff --git a/include/pub_tool_vki.h b/include/pub_tool_vki.h index 4aa36f388e..24f99cc09f 100644 --- a/include/pub_tool_vki.h +++ b/include/pub_tool_vki.h @@ -51,6 +51,8 @@ # include "vki/vki-darwin.h" #elif defined(VGO_solaris) # include "vki/vki-solaris.h" +#elif defined(VGO_freebsd) +# include "vki/vki-freebsd.h" #else # error Unknown Plat/OS #endif diff --git a/include/pub_tool_vkiscnums.h b/include/pub_tool_vkiscnums.h index cb5f957701..df766ecab9 100644 --- a/include/pub_tool_vkiscnums.h +++ b/include/pub_tool_vkiscnums.h @@ -44,7 +44,6 @@ extern const HChar *VG_(sysnum_string) (Word sysnum); // Macro provided for backward compatibility purposes. #define VG_SYSNUM_STRING(sysnum) VG_(sysnum_string)(sysnum) - #endif // __PUB_TOOL_VKISCNUMS_H /*--------------------------------------------------------------------*/ diff --git a/include/pub_tool_vkiscnums_asm.h b/include/pub_tool_vkiscnums_asm.h index 6ede6f90ef..14b483c4df 100644 --- a/include/pub_tool_vkiscnums_asm.h +++ b/include/pub_tool_vkiscnums_asm.h @@ -74,6 +74,9 @@ # include "vki/vki-scnums-shared-linux.h" # include "vki/vki-scnums-mips64-linux.h" +#elif defined(VGP_x86_freebsd) || defined(VGP_amd64_freebsd) +# include "vki/vki-scnums-freebsd.h" + #elif defined(VGP_x86_darwin) || defined(VGP_amd64_darwin) # include "vki/vki-scnums-darwin.h" diff --git a/include/valgrind.h b/include/valgrind.h index 04a747c7a8..ae04c0faa7 100644 --- a/include/valgrind.h +++ b/include/valgrind.h @@ -110,6 +110,8 @@ */ #undef PLAT_x86_darwin #undef PLAT_amd64_darwin +#undef PLAT_x86_freebsd +#undef PLAT_amd64_freebsd #undef PLAT_x86_win32 #undef PLAT_amd64_win64 #undef PLAT_x86_linux @@ -131,6 +133,10 @@ # define PLAT_x86_darwin 1 #elif defined(__APPLE__) && defined(__x86_64__) # define PLAT_amd64_darwin 1 +#elif defined(__FreeBSD__) && defined(__i386__) +# define PLAT_x86_freebsd 1 +#elif defined(__FreeBSD__) && defined(__amd64__) +# define PLAT_amd64_freebsd 1 #elif (defined(__MINGW32__) && defined(__i386__)) \ || defined(__CYGWIN32__) \ || (defined(_WIN32) && defined(_M_IX86)) @@ -258,7 +264,7 @@ #if defined(PLAT_x86_linux) || defined(PLAT_x86_darwin) \ || (defined(PLAT_x86_win32) && defined(__GNUC__)) \ - || defined(PLAT_x86_solaris) + || defined(PLAT_x86_solaris) || defined(PLAT_x86_freebsd) typedef struct { @@ -398,6 +404,7 @@ valgrind_do_client_request_expr(uintptr_t _zzq_default, uintptr_t _zzq_request, #if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin) \ || defined(PLAT_amd64_solaris) \ + || defined(PLAT_amd64_freebsd) \ || (defined(PLAT_amd64_win64) && defined(__GNUC__)) typedef @@ -1219,7 +1226,7 @@ typedef /* ----------------- x86-{linux,darwin,solaris} ---------------- */ #if defined(PLAT_x86_linux) || defined(PLAT_x86_darwin) \ - || defined(PLAT_x86_solaris) + || defined(PLAT_x86_solaris) || defined(PLAT_x86_freebsd) /* These regs are trashed by the hidden call. No need to mention eax as gcc can already see that, plus causes gcc to bomb. */ @@ -1651,7 +1658,7 @@ typedef /* ---------------- amd64-{linux,darwin,solaris} --------------- */ #if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin) \ - || defined(PLAT_amd64_solaris) + || defined(PLAT_amd64_solaris) || defined(PLAT_amd64_freebsd) /* ARGREGS: rdi rsi rdx rcx r8 r9 (the rest on stack in R-to-L order) */ diff --git a/include/vki/vki-amd64-freebsd.h b/include/vki/vki-amd64-freebsd.h new file mode 100644 index 0000000000..55409dbebd --- /dev/null +++ b/include/vki/vki-amd64-freebsd.h @@ -0,0 +1,220 @@ +/* + This file is part of Valgrind, a dynamic binary instrumentation + framework. + + Copyright (C) 2000-2005 Julian Seward + jseward@acm.org + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, see . + + The GNU General Public License is contained in the file COPYING. +*/ + +#ifndef VKI_AMD64_FREEBSD_H +#define VKI_AMD64_FREEBSD_H + +/* PAGE_SHIFT determines the page size. */ +#define VKI_PAGE_SHIFT 12 +#define VKI_PAGE_SIZE (1UL << VKI_PAGE_SHIFT) +#define VKI_MAX_PAGE_SHIFT VKI_PAGE_SHIFT +#define VKI_MAX_PAGE_SIZE VKI_PAGE_SIZE + +#define VKI_MINSIGSTKSZ 2048 + +//---------------------------------------------------------------------- +// sys/_sigset.h +//---------------------------------------------------------------------- +#define _VKI_NSIG 128 +#define _VKI_NSIG_WORDS 4 +#define _VKI_NSIG_BPW ((_VKI_NSIG) / (_VKI_NSIG_WORDS)) + +#include "vki-machine-types-amd64-freebsd.h" + +typedef struct { + vki_uint32_t sig[_VKI_NSIG_WORDS]; +} vki_sigset_t; + +struct _vki_fpstate { + unsigned short cwd; + unsigned short swd; + unsigned short twd; + unsigned short fop; + unsigned long rip; + unsigned long rdp; + unsigned int mxcsr; + unsigned int mxcsr_mask; + unsigned int st_space[32]; /* 8*16 bytes for each FP-reg */ + unsigned int xmm_space[64]; /* 16*16 bytes for each XMM-reg */ + unsigned int reserved2[24]; +}; + +struct vki_sigcontext { + vki_sigset_t mask; + long onstack; + long rdi; + long rsi; + long rdx; + long rcx; + long r8; + long r9; + long rax; + long rbx; + long rbp; + long r10; + long r11; + long r12; + long r13; + long r14; + long r15; + int trapno; + short fs; + short gs; + long addr; + int flags; + short es; + short ds; + long err; + long rip; + long cs; + long rflags; + long rsp; + long ss; + long len; /* sizeof(mcontext_t) */ + long fpformat; + long ownedfp; + struct _vki_fpstate fpstate; + + long fsbase; + long gsbase; + long xfpustate; + long xfpustate_len; + + long spare[4]; +}; + +/* + * Retrieved from src/sys/amd64/include/reg.h + * Note that on 8.x trapno and err are no-more meaningful, but we + * don't set them anyway. + */ + +struct vki_user_regs_struct { + vki_register_t r15; + vki_register_t r14; + vki_register_t r13; + vki_register_t r12; + vki_register_t r11; + vki_register_t r10; + vki_register_t r9; + vki_register_t r8; + vki_register_t rdi; + vki_register_t rsi; + vki_register_t rbp; + vki_register_t rbx; + vki_register_t rdx; + vki_register_t rcx; + vki_register_t rax; + vki_uint32_t trapno; + vki_uint16_t fs; + vki_uint16_t gs; + vki_uint32_t err; + vki_uint16_t es; + vki_uint16_t ds; + vki_register_t rip; + vki_register_t cs; + vki_register_t rflags; + vki_register_t rsp; + vki_register_t ss; +}; + +struct vki_fpreg { + unsigned long fpr_env[4]; + unsigned char fpr_acc[8][16]; + unsigned char fpr_xacc[16][16]; + unsigned long fpr_spare[12]; +}; + +struct vki_dbreg { + unsigned long dr[16]; +}; + +typedef vki_register_t vki_elf_greg_t; +typedef struct _vki_fpstate vki_elf_fpregset_t; + +#define VKI_AT_SYSINFO 32 +#define VKI_ELF_NGREG \ + (sizeof (struct vki_user_regs_struct) / sizeof(vki_elf_greg_t)) + +typedef vki_elf_greg_t vki_elf_gregset_t[VKI_ELF_NGREG]; + +struct vki_mcontext { + vki_register_t onstack; /* XXX - sigcontext compat. */ + vki_register_t rdi; /* machine state (struct trapframe) */ + vki_register_t rsi; + vki_register_t rdx; + vki_register_t rcx; + vki_register_t r8; + vki_register_t r9; + vki_register_t rax; + vki_register_t rbx; + vki_register_t rbp; + vki_register_t r10; + vki_register_t r11; + vki_register_t r12; + vki_register_t r13; + vki_register_t r14; + vki_register_t r15; + vki_uint32_t trapno; + vki_uint16_t fs; + vki_uint16_t gs; + vki_register_t addr; + vki_uint32_t flags; + vki_uint16_t es; + vki_uint16_t ds; + vki_register_t err; + vki_register_t rip; + vki_register_t cs; + vki_register_t rflags; + vki_register_t rsp; + vki_register_t ss; + + long len; + long fpformat; + long ownedfp; + struct _vki_fpstate fpstate;// __attribute__((aligned(16))); + vki_register_t fsbase; + vki_register_t gsbase; + + vki_register_t xfpustate; + vki_register_t xfpustate_len; + + long spare2[4]; +}; + +#define VKI_FPFMT_NODEV 0x10000 +#define VKI_FPFMT_XMM 0x10002 + +#define VKI_FPOWNED_NONE 0x20000 +#define VKI_FPOWNED_FPU 0x20001 +#define VKI_FPOWNED_PCB 0x20002 + +struct vki_sigaction_base { + void (*ksa_handler)(int); + int sa_flags; + vki_sigset_t sa_mask; /* mask last for extensibility */ +}; +typedef struct vki_sigaction_base vki_sigaction_toK_t; +typedef struct vki_sigaction_base vki_sigaction_fromK_t; + +#endif /* VKI_AMD64_FREEBSD_H */ diff --git a/include/vki/vki-freebsd.h b/include/vki/vki-freebsd.h new file mode 100644 index 0000000000..eaea7d74c2 --- /dev/null +++ b/include/vki/vki-freebsd.h @@ -0,0 +1,3077 @@ + +/*--------------------------------------------------------------------*/ +/*--- FreeBSD-specific kernel interface. vki-freebsd.h ---*/ +/*--------------------------------------------------------------------*/ + +/* + This file is part of Valgrind, a dynamic binary instrumentation + framework. + + Copyright (C) 2000-2005 Julian Seward + jseward@acm.org + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, see . + + The GNU General Public License is contained in the file COPYING. +*/ + +/* This file defines types and constants for the kernel interface, and to + make that clear everything is prefixed VKI_/vki_. + + All code is copied verbatim from kernel source files, except that: + - VKI_/vki_ prefixes are added + - some extra explanatory comments are included; they are all within + "[[ ]]" + - for some types, we only care about the size; for a few of them (big + ones that are painful to fully drag in here), a VKI_SIZEOF_* constant + is used. + + The files the code is taken from is indicated. + + Note especially that the types are not the glibc versions, many of which + are different to those in here. + + Also note that this file contains all the generic header info, ie. that + from linux/include/linux/ *.h. The arch-specific header info, eg. that + from linux/include/asm-i386/ *.h, is in vki-$PLATFORM.h and + vki_posixtypes-$PLATFORM.h. (Two files are required to avoid + circular dependencies between the generic VKI header and the + arch-specific VKI header. It's possible in the future, as more stuff + gets pulled in, that we might have to split files up some more to avoid + further circular dependencies.) + + Finally, note that it is assumed that __KERNEL__ is set for all these + definitions, which affects some of them. +*/ + +#ifndef VKI_FREEBSD_H +#define VKI_FREEBSD_H + +//---------------------------------------------------------------------- +// Arch-specific POSIX types +//---------------------------------------------------------------------- + +#if defined(VGA_x86) +# include "vki-machine-types-x86-freebsd.h" +#elif defined(VGA_amd64) +# include "vki-machine-types-amd64-freebsd.h" +#else +# error Unknown platform +#endif + +#include +#include + + +//---------------------------------------------------------------------- +// From sys/select.h +//---------------------------------------------------------------------- + +typedef unsigned long __vki_fd_mask; + +#undef __VKI_NFDBITS +#define __VKI_NFDBITS (8 * sizeof(__vki_fd_mask)) + +#undef __VKI_FD_SETSIZE +#define __VKI_FD_SETSIZE 1024U + +#undef __VKI_FDSET_LONGS +#define __VKI_FDSET_LONGS (__VKI_FD_SETSIZE/__VKI_NFDBITS) + +#undef __VKI_FDELT +#define __VKI_FDELT(d) ((d) / __VKI_NFDBITS) + +#undef __VKI_FDMASK +#define __VKI_FDMASK(d) (1UL << ((d) % __VKI_NFDBITS)) + +typedef struct { + unsigned long fds_bits [__VKI_FDSET_LONGS]; +} __vki_fd_set; + +//---------------------------------------------------------------------- +// sys/_types.h +//---------------------------------------------------------------------- +/* MD QQQ 32 on 64 */ +typedef long __vki_key_t; +typedef long __vki_suseconds_t; +typedef struct __timer *__vki_timer_t; +typedef struct __mq *__vki_mqd_t; + +/* MI */ +typedef vki_uint32_t __vki_blksize_t; +typedef vki_int64_t __vki_blkcnt_t; +typedef vki_int32_t __vki_clockid_t; +typedef vki_int32_t __vki_ct_rune_t; +typedef vki_uint32_t __vki_fflags_t; +typedef vki_uint64_t __vki_fsblkcnt_t; +typedef vki_uint64_t __vki_fsfilcnt_t; +typedef vki_uint32_t __vki_gid_t; +typedef vki_int64_t __vki_id_t; +typedef vki_uint32_t __vki_ino_t; +typedef vki_int32_t __vki_lwpid_t; +typedef vki_uint16_t __vki_mode_t; +typedef vki_uint16_t __vki_nlink_t; +typedef vki_int64_t __vki_off_t; +typedef vki_int32_t __vki_pid_t; +typedef vki_int64_t __vki_rlim_t; +typedef vki_uint8_t __vki_sa_family_t; +typedef vki_uint32_t __vki_socklen_t; +typedef vki_uint32_t __vki_uid_t; +typedef vki_int32_t __vki_useconds_t; +typedef __vki_ct_rune_t __vki_rune_t; +typedef __vki_ct_rune_t __vki_wchar_t; +typedef __vki_ct_rune_t __vki_wint_t; +typedef vki_uint32_t __vki_dev_t; +typedef vki_uint32_t __vki_fixpt_t; + + +//---------------------------------------------------------------------- +// sys/types.h +//---------------------------------------------------------------------- + +typedef vki_uint8_t vki_u_int8_t; +typedef vki_uint16_t vki_u_int16_t; +typedef vki_uint32_t vki_u_int32_t; +typedef vki_uint64_t vki_u_int64_t; + +typedef vki_uint64_t vki_u_quad_t; +typedef vki_int64_t vki_quad_t; +typedef __vki_caddr_t vki_caddr_t; +typedef __const __vki_caddr_t vki_c_caddr_t; +typedef __volatile __vki_caddr_t vki_v_caddr_t; + +typedef __vki_blksize_t vki_blksize_t; +typedef __vki_blkcnt_t vki_blkcnt_t; +typedef __vki_clock_t vki_clock_t; +typedef __vki_clockid_t vki_clockid_t; +typedef __vki_dev_t vki_dev_t; +typedef __vki_fflags_t vki_fflags_t; +typedef __vki_fixpt_t vki_fixpt_t; +typedef __vki_fsblkcnt_t vki_fsblkcnt_t; +typedef __vki_fsfilcnt_t vki_fsfilcnt_t; +typedef __vki_gid_t vki_gid_t; +typedef vki_uint32_t vki_in_addr_t; +typedef vki_uint16_t vki_in_port_t; +typedef __vki_id_t vki_id_t; +typedef __vki_ino_t vki_ino_t; +typedef __vki_key_t vki_key_t; +typedef __vki_lwpid_t vki_lwpid_t; +typedef __vki_mode_t vki_mode_t; +typedef __vki_nlink_t vki_nlink_t; +typedef __vki_off_t vki_off_t; +typedef __vki_pid_t vki_pid_t; +typedef __vki_register_t vki_register_t; +typedef __vki_rlim_t vki_rlim_t; +typedef __vki_segsz_t vki_segsz_t; +typedef __vki_size_t vki_size_t; +typedef __vki_ssize_t vki_ssize_t; +typedef __vki_suseconds_t vki_suseconds_t; +typedef __vki_time_t vki_time_t; +typedef __vki_timer_t vki_timer_t; +typedef __vki_mqd_t vki_mqd_t; +typedef __vki_u_register_t vki_u_register_t; +typedef __vki_uid_t vki_uid_t; +typedef __vki_useconds_t vki_useconds_t; +typedef int vki_cpuwhich_t; +typedef int vki_cpulevel_t; +typedef int vki_cpusetid_t; + + +typedef __vki_vm_offset_t vki_vm_offset_t; +typedef __vki_vm_ooffset_t vki_vm_ooffset_t; +typedef __vki_vm_paddr_t vki_vm_paddr_t; +typedef __vki_vm_pindex_t vki_vm_pindex_t; +typedef __vki_vm_size_t vki_vm_size_t; + +//---------------------------------------------------------------------- +// sys/select.h +//---------------------------------------------------------------------- + +typedef __vki_fd_set vki_fd_set; + +//---------------------------------------------------------------------- +// Now the rest of the arch-specific stuff +//---------------------------------------------------------------------- + +#if defined(VGA_x86) +# include "vki-x86-freebsd.h" +#elif defined(VGA_amd64) +# include "vki-amd64-freebsd.h" +#else +# error Unknown platform +#endif + +//---------------------------------------------------------------------- +// linux and freebsd version hacks +//---------------------------------------------------------------------- +#ifndef ELFMAG +#define ELFMAG "\177ELF" /* magic string */ +#endif +#ifndef SELFMAG +#define SELFMAG 4 /* magic string size */ +#endif + +// see http://bugs.freebsd.org/bugzilla/show_bug.cgi?id=239669 +#if !defined(ELF_NOTE_GNU) +#define ELF_NOTE_GNU "GNU" +#endif + +// This is not defined on FreeBSD 10.4 +#if !defined(NT_FREEBSD_ABI_TAG) +#define NT_FREEBSD_ABI_TAG 1 +#endif + +#define VKI_ELF_NOTE_ROUNDSIZE 4 + + +//---------------------------------------------------------------------- +// From sys/syslimits.h +//---------------------------------------------------------------------- + +#define VKI_PATH_MAX 1024 + + +//---------------------------------------------------------------------- +// From sys/timespec.h +//---------------------------------------------------------------------- + +struct vki_timespec { + vki_time_t tv_sec; /* seconds */ + long tv_nsec; /* nanoseconds */ +}; + +struct vki_itimerspec { + struct vki_timespec it_interval; /* timer period */ + struct vki_timespec it_value; /* timer expiration */ +}; + +//---------------------------------------------------------------------- +// From sys/_time.h +//---------------------------------------------------------------------- + +struct vki_timeval { + vki_time_t tv_sec; /* seconds */ + vki_suseconds_t tv_usec; /* microseconds */ +}; + +//---------------------------------------------------------------------- +// From sys/time.h +//---------------------------------------------------------------------- + +#define VKI_CLOCK_REALTIME 0 +#define VKI_CLOCK_MONOTONIC 1 +#define VKI_CLOCK_PROCESS_CPUTIME_ID 2 +#define VKI_CLOCK_THREAD_CPUTIME_ID 3 + +struct vki_timezone { + int tz_minuteswest; /* minutes west of Greenwich */ + int tz_dsttime; /* type of dst correction */ +}; + +struct vki_itimerval { + struct vki_timeval it_interval; /* timer interval */ + struct vki_timeval it_value; /* current value */ +}; + +//---------------------------------------------------------------------- +// From sys/timex.h +//---------------------------------------------------------------------- + +struct vki_ntptimeval { + struct vki_timespec time; + long maxerror; + long esterror; + long tai; + int time_state; +}; + +struct vki_timex { + unsigned int modes; /* mode selector */ + long offset; /* time offset (usec) */ + long freq; /* frequency offset (scaled ppm) */ + long maxerror; /* maximum error (usec) */ + long esterror; /* estimated error (usec) */ + int status; /* clock command/status */ + long constant; /* pll time constant */ + long precision; /* clock precision (usec) (read only) */ + long tolerance; /* clock frequency tolerance (ppm) + * (read only) + */ + long ppsfreq; /* pps frequency (scaled ppm) (ro) */ + long jitter; /* pps jitter (us) (ro) */ + int shift; /* interval duration (s) (shift) (ro) */ + long stabil; /* pps stability (scaled ppm) (ro) */ + long jitcnt; /* jitter limit exceeded (ro) */ + long calcnt; /* calibration intervals (ro) */ + long errcnt; /* calibration errors (ro) */ + long stbcnt; /* stability limit exceeded (ro) */ +}; + +#define MOD_OFFSET 0x0001 /* time offset */ +#define MOD_FREQUENCY 0x0002 /* frequency offset */ +#define MOD_MAXERROR 0x0004 /* maximum time error */ +#define MOD_ESTERROR 0x0008 /* estimated time error */ +#define MOD_STATUS 0x0010 /* clock status */ +#define MOD_TIMECONST 0x0020 /* pll time constant */ +#define MOD_PPSMAX 0x0040 +#define MOD_TAI 0x0080 +#define MOD_MICRO 0x1000 +#define MOD_NANO 0x2000 +#define MOD_CLKB 0x4000 +#define MOD_CLKA 0x8000 + +//---------------------------------------------------------------------- +// From sys/times.h +//---------------------------------------------------------------------- + +struct vki_tms { + vki_clock_t tms_utime; + vki_clock_t tms_stime; + vki_clock_t tms_cutime; + vki_clock_t tms_cstime; +}; + +//---------------------------------------------------------------------- +// From sys/stat.h +//---------------------------------------------------------------------- + +/* QQQ 4.x stat layout */ +struct vki_freebsd11_stat { + vki_dev_t st_dev; + vki_ino_t st_ino; + vki_mode_t st_mode; + vki_nlink_t st_nlink; + vki_uid_t st_uid; + vki_gid_t st_gid; + vki_dev_t st_rdev; +#if 0 + struct vki_timespec st_atimespec; + struct vki_timespec st_mtimespec; + struct vki_timespec st_ctimespec; +#else + vki_time_t st_atime; + long st_atime_nsec; + vki_time_t st_mtime; + long st_mtime_nsec; + vki_time_t st_ctime; + long st_ctime_nsec; +#endif + vki_off_t st_size; + vki_blkcnt_t st_blocks; + vki_blksize_t st_blksize; + vki_fflags_t st_flags; + vki_uint32_t st_gen; + vki_int32_t st_lspare; + struct vki_timespec st_birthtimespec; +unsigned int : + (8 / 2) * (16 - (int)sizeof(struct vki_timespec)); +unsigned int : + (8 / 2) * (16 - (int)sizeof(struct vki_timespec)); +}; + +#if defined(VGP_x86_freebsd) +#define VKI_STAT_TIME_T_EXT 1 +#endif + +/* + * FreeBSD 12 has two versions of the stat struct + * freebsd11_stat, which is the same as vki_stat above + * and just stat, which is the same as vki_stat below + * Since vki_stat is used by other OSes, it's best not to + * use the same naming + */ + +struct vki_stat { + //vki_dev_t st_dev; + vki_uint64_t st_dev; + //vki_ino_t st_ino; + vki_uint64_t st_ino; + //vki_nlink_t st_nlink; + vki_uint64_t st_nlink; + vki_mode_t st_mode; + vki_int16_t st_padding0; + vki_uid_t st_uid; + vki_gid_t st_gid; + vki_int32_t st_padding1; + //vki_dev_t st_rdev; + vki_uint64_t st_rdev; +#ifdef VKI_STAT_TIME_T_EXT + vki_int32_t st_atim_ext; +#endif + //struct vki_timespec st_atim; + vki_time_t st_atime; + long st_atime_nsec; +#ifdef VKI_STAT_TIME_T_EXT + vki_int32_t st_mtim_ext; +#endif + //struct vki_timespec st_mtim; + vki_time_t st_mtime; + long st_mtime_nsec; +#ifdef VKI_STAT_TIME_T_EXT + vki_int32_t st_ctim_ext; +#endif + //struct vki_timespec st_ctim; + vki_time_t st_ctime; + long st_ctime_nsec; +#ifdef VKI_STAT_TIME_T_EXT + vki_int32_t st_btim_ext; +#endif + //struct vki_timespec st_birthtim; + vki_time_t st_btime; + long st_btime_nsec; + vki_off_t st_size; + vki_blkcnt_t st_blocks; + vki_blksize_t st_blksize; + vki_fflags_t st_flags; + vki_uint64_t st_gen; + vki_uint64_t st_spare[10]; +}; + + + +//---------------------------------------------------------------------- +// From linux-2.6.8.1/include/linux/sched.h +//---------------------------------------------------------------------- + +struct vki_sched_param { + int sched_priority; +}; + +//---------------------------------------------------------------------- +// From sys/signal.h +//---------------------------------------------------------------------- + +#define VKI_SIG_BLOCK 1 /* block specified signal set */ +#define VKI_SIG_UNBLOCK 2 /* unblock specified signal set */ +#define VKI_SIG_SETMASK 3 /* set specified signal set */ + +#define VKI_SIG_DFL ((__vki_sighandler_t)0) +#define VKI_SIG_IGN ((__vki_sighandler_t)1) +#define VKI_SIG_ERR ((__vki_sighandler_t)-1) + +typedef void __vki_signalfn_t(int); +typedef __vki_signalfn_t *__vki_sighandler_t; + +#define VKI_SIGHUP 1 +#define VKI_SIGINT 2 +#define VKI_SIGQUIT 3 +#define VKI_SIGILL 4 +#define VKI_SIGTRAP 5 +#define VKI_SIGABRT 6 +#define VKI_SIGEMT 7 +#define VKI_SIGFPE 8 +#define VKI_SIGKILL 9 +#define VKI_SIGBUS 10 +#define VKI_SIGSEGV 11 +#define VKI_SIGSYS 12 +#define VKI_SIGPIPE 13 +#define VKI_SIGALRM 14 +#define VKI_SIGTERM 15 +#define VKI_SIGURG 16 +#define VKI_SIGSTOP 17 +#define VKI_SIGTSTP 18 +#define VKI_SIGCONT 19 +#define VKI_SIGCHLD 20 +#define VKI_SIGTTIN 21 +#define VKI_SIGTTOU 22 +#define VKI_SIGIO 23 +#define VKI_SIGXCPU 24 +#define VKI_SIGXFSZ 25 +#define VKI_SIGVTALRM 26 +#define VKI_SIGPROF 27 +#define VKI_SIGWINCH 28 +#define VKI_SIGINFO 29 +#define VKI_SIGUSR1 30 +#define VKI_SIGUSR2 31 +#define VKI_SIGTHR 32 + +#define VKI_SIGRTMIN 65 +#define VKI_SIGRTMAX 126 + +#define VKI_SA_ONSTACK 0x0001 +#define VKI_SA_RESTART 0x0002 +#define VKI_SA_RESETHAND 0x0004 +#define VKI_SA_NOCLDSTOP 0x0008 +#define VKI_SA_NODEFER 0x0010 +#define VKI_SA_NOCLDWAIT 0x0020 +#define VKI_SA_SIGINFO 0x0040 +#define VKI_SA_RESTORER 0 /* FreeBSD doesn't have this */ + +#define VKI_SS_ONSTACK 0x0001 +#define VKI_SS_DISABLE 0x0004 + +#define VKI_SA_ONESHOT VKI_SA_RESETHAND +#define VKI_SA_NOMASK VKI_SA_NODEFER + +struct vki_sigaction { + __vki_sighandler_t ksa_handler; + int sa_flags; + vki_sigset_t sa_mask; +}; + +typedef struct vki_sigaltstack { + void *ss_sp; + vki_size_t ss_size; + int ss_flags; +} vki_stack_t; + +typedef union vki_sigval { + int sival_int; + void *sival_ptr; +} vki_sigval_t; + +typedef struct vki_siginfo { + int si_signo; + int si_errno; + int si_code; + vki_pid_t si_pid; + vki_uid_t si_uid; + int si_status; + void *si_addr; + vki_sigval_t si_value; +// 666: not valid. switch to above def +#ifdef si_band +#undef si_band +#endif + long si_band; + int __spare__[7]; +} vki_siginfo_t; + +/* + * si_code values + */ +#define VKI_SI_USER 0x10001 /* sent by kill, sigsend, raise */ +#define VKI_SI_QUEUE 0x10002 +#define VKI_SI_TIMER 0x10003 +#define VKI_SI_ASYNCIO 0x10004 +#define VKI_SI_MESGQ 0x10005 +#define VKI_SI_KERNEL 0x10006 +#define VKI_SI_LWP 0x10007 +/* + * SIGILL si_codes + */ +#define VKI_ILL_ILLOPC 1 /* illegal opcode */ +#define VKI_ILL_ILLOPN 2 /* illegal operand */ +#define VKI_ILL_ILLADR 3 /* illegal addressing mode */ +#define VKI_ILL_ILLTRP 4 /* illegal trap */ +#define VKI_ILL_PRVOPC 5 /* privileged opcode */ +#define VKI_ILL_PRVREG 6 /* privileged register */ +#define VKI_ILL_COPROC 7 /* coprocessor error */ +#define VKI_ILL_BADSTK 8 /* internal stack error */ + +/* + * SIGFPE si_codes + */ +#define VKI_FPE_INTOVF 1 /* integer overflow */ +#define VKI_FPE_INTDIV 2 /* integer divide by zero */ +#define VKI_FPE_FLTDIV 3 /* floating point divide by zero */ +#define VKI_FPE_FLTOVF 4 /* floating point overflow */ +#define VKI_FPE_FLTUND 5 /* floating point underflow */ +#define VKI_FPE_FLTRES 6 /* floating point inexact result */ +#define VKI_FPE_FLTINV 7 /* floating point invalid operation */ +#define VKI_FPE_FLTSUB 8 /* subscript out of range */ + +/* + * SIGSEGV si_codes + */ +#define VKI_SEGV_MAPERR 1 /* address not mapped to object */ +#define VKI_SEGV_ACCERR 2 /* invalid permissions for mapped object */ +/* XXX i386 and amd64 specific */ +#define VKI_SEGV_PAGE_FAULT 12 + +/* + * SIGBUS si_codes + */ +#define VKI_BUS_ADRALN 1 /* invalid address alignment */ +#define VKI_BUS_ADRERR 2 /* non-existant physical address */ +#define VKI_BUS_OBJERR 3 /* object specific hardware error */ +#define VKI_BUS_OOMERR 100 /* Non-standard: No memory. */ + +/* + * SIGTRAP si_codes + */ +#define VKI_TRAP_BRKPT 1 /* process breakpoint */ +#define VKI_TRAP_TRACE 2 /* process trace trap */ +#define VKI_TRAP_DTRACE 3 /* DTrace induced trap. */ +#define VKI_TRAP_CAP 4 /* Capabilities protective trap. */ + +#if 0 /* freebsd-6 */ +typedef struct vki_sigevent { + int sigev_notify; + int sigev_signo; + vki_sigval_t sigev_value; + union { + int _threadid; + + struct { + void (*_function)(vki_sigval_t); + void *_attribute; /* really pthread_attr_t */ + } _sigev_thread; + long __spare__[8]; + } _sigev_un; +} vki_sigevent_t; +#endif + +struct vki_sigevent { + int sigev_notify; /* Notification type */ + union { + int __sigev_signo; /* Signal number */ + int __sigev_notify_kqueue; + } __sigev_u; + vki_sigval_t sigev_value; /* Signal value */ +}; +#if 0 +#define sigev_signo __sigev_u.__sigev_signo +#define sigev_notify_kqueue __sigev_u.__sigev_notify_kqueue +#endif + +//---------------------------------------------------------------------- +// From sys/_iovec.h +//---------------------------------------------------------------------- + +struct vki_iovec { + void *iov_base; + __vki_size_t iov_len; +}; + +//---------------------------------------------------------------------- +// From sys/socket.h +//---------------------------------------------------------------------- + +typedef __vki_sa_family_t vki_sa_family_t; +typedef __vki_socklen_t vki_socklen_t; + +struct vki_sockaddr { + vki_uint8_t sa_len; + vki_sa_family_t sa_family; /* address family, AF_xxx */ + char sa_data[14]; /* 14 bytes of protocol address */ +}; + +struct vki_msghdr { + void * msg_name; /* Socket name */ + vki_socklen_t msg_namelen; /* Length of name */ + struct vki_iovec * msg_iov; /* Data blocks */ + int msg_iovlen; /* Number of blocks */ + void * msg_control; /* Per protocol magic (eg BSD file descriptor passing) */ + vki_socklen_t msg_controllen; /* Length of cmsg list */ + int msg_flags; +}; + +struct vki_cmsghdr { + vki_socklen_t cmsg_len; /* data byte count, including hdr */ + int cmsg_level; /* originating protocol */ + int cmsg_type; /* protocol-specific type */ +}; + +#define __VKI_CMSG_NXTHDR(ctl, len, cmsg) __vki_cmsg_nxthdr((ctl),(len),(cmsg)) +#define VKI_CMSG_NXTHDR(mhdr, cmsg) vki_cmsg_nxthdr((mhdr), (cmsg)) + +#define VKI_CMSG_ALIGN(len) ( ((len)+sizeof(long)-1) & ~(sizeof(long)-1) ) + +#define VKI_CMSG_DATA(cmsg) ((void *)((char *)(cmsg) + VKI_CMSG_ALIGN(sizeof(struct vki_cmsghdr)))) + +#define __VKI_CMSG_FIRSTHDR(ctl,len) ((len) >= sizeof(struct vki_cmsghdr) ? \ + (struct vki_cmsghdr *)(ctl) : \ + (struct vki_cmsghdr *)NULL) +#define VKI_CMSG_FIRSTHDR(msg) __VKI_CMSG_FIRSTHDR((msg)->msg_control, (msg)->msg_controllen) + +// [[Urgh, this is revolting...] +// QQQ check +static __inline struct vki_cmsghdr * __vki_cmsg_nxthdr(void *__ctl, vki_socklen_t __size, + struct vki_cmsghdr *__cmsg) +{ + struct vki_cmsghdr * __ptr; + + __ptr = (struct vki_cmsghdr*)(((unsigned char *) __cmsg) + VKI_CMSG_ALIGN(__cmsg->cmsg_len)); + if ((unsigned long)((char*)(__ptr+1) - (char *) __ctl) > __size) + return (struct vki_cmsghdr *)0; + + return __ptr; +} + +static __inline struct vki_cmsghdr * vki_cmsg_nxthdr (struct vki_msghdr *__msg, struct vki_cmsghdr *__cmsg) +{ + return __vki_cmsg_nxthdr(__msg->msg_control, __msg->msg_controllen, __cmsg); +} + +#define VKI_SCM_RIGHTS 0x01 /* rw: access rights (array of int) */ + +#define VKI_AF_UNIX 1 /* Unix domain sockets */ +#define VKI_AF_INET 2 /* Internet IP Protocol */ +#define VKI_AF_INET6 28 /* IP version 6 */ + +#define VKI_MSG_NOSIGNAL 0x20000 /* Do not generate SIGPIPE */ + +#define VKI_SOL_SOCKET 0xffff + +#define VKI_SO_TYPE 0x1008 + +#define VKI_SOCK_STREAM 1 + +#include + +#define VKI_TCP_NODELAY TCP_NODELAY + +#include + +#define VKI_IPPROTO_TCP IPPROTO_TCP + +struct vki_sf_hdtr { + struct iovec *headers; + int hdr_cnt; + struct iovec *trailers; + int trl_cnt; +}; + + +//---------------------------------------------------------------------- +// From netinet/in.h +//---------------------------------------------------------------------- + +struct vki_in_addr { + vki_in_addr_t s_addr; +}; + +/* Structure describing an Internet (IP) socket address. */ +#define __VKI_SOCK_SIZE__ 16 /* sizeof(struct sockaddr) */ +struct vki_sockaddr_in { + vki_uint8_t sin_len; + vki_sa_family_t sin_family; /* Address family */ + vki_in_port_t sin_port; /* Port number */ + struct vki_in_addr sin_addr; /* Internet address */ + char sin_zero[8]; +}; + +//---------------------------------------------------------------------- +// From netinet6/in6.h +//---------------------------------------------------------------------- + +struct vki_in6_addr { + union { + vki_uint8_t u6_addr8[16]; + vki_uint16_t u6_addr16[8]; + vki_uint32_t u6_addr32[4]; + } vki_in6_u; +#define vki_s6_addr vki_in6_u.u6_addr8 +#define vki_s6_addr16 vki_in6_u.u6_addr16 +#define vki_s6_addr32 vki_in6_u.u6_addr32 +}; + +struct vki_sockaddr_in6 { + vki_uint8_t sin6_len; + vki_sa_family_t sin6_family; /* AF_INET6 */ + vki_uint16_t sin6_port; /* Transport layer port # */ + vki_uint32_t sin6_flowinfo; /* IPv6 flow information */ + struct vki_in6_addr sin6_addr; /* IPv6 address */ + vki_uint32_t sin6_scope_id; /* scope id (new in RFC2553) */ +}; + +//---------------------------------------------------------------------- +// From sys/un.h +//---------------------------------------------------------------------- + +#define VKI_UNIX_PATH_MAX 104 /* QQQ overridden by sun_len */ + +struct vki_sockaddr_un { + unsigned char sun_len; + vki_sa_family_t sun_family; /* AF_UNIX */ + char sun_path[VKI_UNIX_PATH_MAX]; /* pathname */ +}; + +//---------------------------------------------------------------------- +// From aio.h +//---------------------------------------------------------------------- + +struct vki___aiocb_private { + long status; + long error; + void *kernelinfo; +}; + +typedef struct vki_aiocb { + int aio_fildes; + vki_off_t aio_offset; + volatile void *aio_buf; + vki_size_t aio_nbytes; + int __spare__[2]; + void *__spare2__; + int aio_lio_opcode; + int aio_reqprio; + struct vki___aiocb_private _aiocb_private; + struct vki_sigevent aio_sigevent; +} aiocb_t; + +#define VKI_LIO_NOP 0x0 +#define VKI_LIO_WRITE 0x1 +#define VKI_LIO_READ 0x2 + +#define VKI_LIO_NOWAIT 0x0 +#define VKI_LIO_WAIT 0x1 + + +#define VKI_LIO_NOWAIT 0x0 + +//---------------------------------------------------------------------- +// From sys/mount.h +//---------------------------------------------------------------------- + +typedef struct vki_fsid { + vki_int32_t val[2]; +} vki_fsid_t; +#define VKI_OMFSNAMELEN 16 +#define VKI_OMNAMELEN (88 - 2 * sizeof(long)) +#define VKI_MFSNAMELEN 16 +#define VKI_FREEBSD11_MNAMELEN 88 + +struct vki_freebsd11_statfs { + vki_uint32_t f_version; + vki_uint32_t f_type; + vki_uint64_t f_flags; + vki_uint64_t f_bsize; + vki_uint64_t f_iosize; + vki_uint64_t f_blocks; + vki_uint64_t f_bfree; + vki_int64_t f_bavail; + vki_uint64_t f_files; + vki_int64_t f_ffree; + vki_uint64_t f_syncwrites; + vki_uint64_t f_asyncwrites; + vki_uint64_t f_syncreads; + vki_uint64_t f_asyncreads; + vki_uint64_t f_spare[10]; + vki_uint32_t f_namemax; + vki_uid_t f_owner; + vki_fsid_t f_fsid; + char f_charspare[80]; + char f_fstypename[VKI_OMFSNAMELEN]; + char f_mntfromname[VKI_FREEBSD11_MNAMELEN]; + char f_mntonname[VKI_FREEBSD11_MNAMELEN]; +}; + + +#define MAXFIDSZ 16 + +struct vki_fid { + vki_uint16_t fid_len; + vki_uint16_t fid_reserved; + char fid_data[MAXFIDSZ]; +}; + +struct vki_fhandle { + vki_fsid_t fh_fsid; + struct vki_fid fh_fid; +}; + + +#define VKI_MNAMELEN 1024 +struct vki_statfs { + vki_uint32_t f_version; + vki_uint32_t f_type; + vki_uint64_t f_flags; + vki_uint64_t f_bsize; + vki_uint64_t f_iosize; + vki_uint64_t f_blocks; + vki_uint64_t f_bfree; + vki_int64_t f_bavail; + vki_uint64_t f_files; + vki_int64_t f_ffree; + vki_uint64_t f_syncwrites; + vki_uint64_t f_asyncwrites; + vki_uint64_t f_syncreads; + vki_uint64_t f_asyncreads; + vki_uint64_t f_spare[10]; + vki_uint32_t f_namemax; + vki_uid_t f_owner; + vki_fsid_t f_fsid; + char f_charspare[80]; + char f_fstypename[VKI_MFSNAMELEN]; + char f_mntfromname[VKI_MNAMELEN]; + char f_mntonname[VKI_MNAMELEN]; +}; + +typedef struct vki_fhandle vki_fhandle_t; + +//---------------------------------------------------------------------- +// From sys/ttycom.h +//---------------------------------------------------------------------- + +struct vki_winsize { + unsigned short ws_row; + unsigned short ws_col; + unsigned short ws_xpixel; + unsigned short ws_ypixel; +}; + + +//---------------------------------------------------------------------- +// From sys/termios.h +//---------------------------------------------------------------------- + +typedef unsigned int vki_tcflag_t; +typedef unsigned char vki_cc_t; +typedef unsigned int vki_speed_t; + +#define VKI_NCCS 20 +struct vki_termios { + vki_tcflag_t c_iflag; /* input mode flags */ + vki_tcflag_t c_oflag; /* output mode flags */ + vki_tcflag_t c_cflag; /* control mode flags */ + vki_tcflag_t c_lflag; /* local mode flags */ + vki_cc_t c_cc[VKI_NCCS]; /* control characters */ + vki_speed_t c_ispeed; + vki_speed_t c_ospeed; +}; + +//---------------------------------------------------------------------- +// From sys/ioccom.h +//---------------------------------------------------------------------- + +/* QQQ keep linux's naming, but use our layout */ + +/* + * We actually have a 16 bit "base" ioctl, which may or may not be decoded + * into number/group + */ +#define _VKI_IOC_BASEBITS 16 +#define _VKI_IOC_NRBITS 8 /* "num" on freebsd */ +#define _VKI_IOC_TYPEBITS 8 /* "group" on freebsd */ + +#define _VKI_IOC_SIZEBITS 13 +#define _VKI_IOC_DIRBITS 3 + +#define _VKI_IOC_BASEMASK ((1ul << _VKI_IOC_BASEBITS)-1) +#define _VKI_IOC_NRMASK ((1ul << _VKI_IOC_NRBITS)-1) +#define _VKI_IOC_TYPEMASK ((1ul << _VKI_IOC_TYPEBITS)-1) +#define _VKI_IOC_SIZEMASK ((1ul << _VKI_IOC_SIZEBITS)-1) +#define _VKI_IOC_DIRMASK ((1ul << _VKI_IOC_DIRBITS)-1) + +#define _VKI_IOC_BASESHIFT 0 +#define _VKI_IOC_NRSHIFT 0 +#define _VKI_IOC_TYPESHIFT (_VKI_IOC_NRSHIFT+_VKI_IOC_NRBITS) +#define _VKI_IOC_SIZESHIFT (_VKI_IOC_TYPESHIFT+_VKI_IOC_TYPEBITS) +#define _VKI_IOC_DIRSHIFT (_VKI_IOC_SIZESHIFT+_VKI_IOC_SIZEBITS) + +#define _VKI_IOC_NONE 1U /* "void" on freebsd, as a specific mode */ +#define _VKI_IOC_READ 2U /* "out", copyout in reversed linux terminology */ +#define _VKI_IOC_WRITE 4U /* "in", copyin in reversed linux terminology */ +#define _VKI_IOC_RDWR 6U /* "inout", copyin and copyout */ + +#define _VKI_IOC(dir,type,nr,size) \ + (((dir) << _VKI_IOC_DIRSHIFT) | \ + ((type) << _VKI_IOC_TYPESHIFT) | \ + ((nr) << _VKI_IOC_NRSHIFT) | \ + ((size) << _VKI_IOC_SIZESHIFT)) + +/* provoke compile error for invalid uses of size argument */ +extern unsigned int __vki_invalid_size_argument_for_IOC; +#define _VKI_IOC_TYPECHECK(t) \ + ((sizeof(t) == sizeof(t[1]) && \ + sizeof(t) < (1 << _VKI_IOC_SIZEBITS)) ? \ + sizeof(t) : __vki_invalid_size_argument_for_IOC) + +/* used to create numbers */ +#define _VKI_IO(type,nr) _VKI_IOC(_VKI_IOC_NONE,(type),(nr),0) +#define _VKI_IOR(type,nr,size) _VKI_IOC(_VKI_IOC_READ,(type),(nr),(_VKI_IOC_TYPECHECK(size))) +#define _VKI_IOW(type,nr,size) _VKI_IOC(_VKI_IOC_WRITE,(type),(nr),(_VKI_IOC_TYPECHECK(size))) +#define _VKI_IOWR(type,nr,size) _VKI_IOC(_VKI_IOC_READ|_VKI_IOC_WRITE,(type),(nr),(_VKI_IOC_TYPECHECK(size))) + +/* used to decode ioctl numbers.. */ +#define _VKI_IOC_DIR(nr) (((nr) >> _VKI_IOC_DIRSHIFT) & _VKI_IOC_DIRMASK) +#define _VKI_IOC_TYPE(nr) (((nr) >> _VKI_IOC_TYPESHIFT) & _VKI_IOC_TYPEMASK) +#define _VKI_IOC_NR(nr) (((nr) >> _VKI_IOC_NRSHIFT) & _VKI_IOC_NRMASK) +#define _VKI_IOC_SIZE(nr) (((nr) >> _VKI_IOC_SIZESHIFT) & _VKI_IOC_SIZEMASK) +#define _VKI_IOC_BASE(nr) (((nr) >> _VKI_IOC_BASESHIFT) & _VKI_IOC_BASEMASK) + +//---------------------------------------------------------------------- +// From sys/random.h +//---------------------------------------------------------------------- + +#define VKI_GRND_NONBLOCK 0x1 + +//---------------------------------------------------------------------- +// From sys/termios.h +//---------------------------------------------------------------------- + +#if 0 +#define VKI_TCGETS 0x5401 +#define VKI_TCSETS 0x5402 /* Clashes with SNDCTL_TMR_START sound ioctl */ +#define VKI_TCSETSW 0x5403 +#define VKI_TCSETSF 0x5404 +#define VKI_TCGETA 0x5405 y +#define VKI_TCSETA 0x5406 y +#define VKI_TCSETAW 0x5407 y +#define VKI_TCSETAF 0x5408 y +#define VKI_TCSBRK 0x5409 +#define VKI_TCXONC 0x540A +#define VKI_TCFLSH 0x540B y +#define VKI_TIOCSCTTY 0x540E +#define VKI_TIOCGPGRP 0x540F y +#define VKI_TIOCSPGRP 0x5410 y +#define VKI_TIOCOUTQ 0x5411 +#define VKI_TIOCGWINSZ 0x5413 y +#define VKI_TIOCSWINSZ 0x5414 y +#define VKI_TIOCMGET 0x5415 y +#define VKI_TIOCMBIS 0x5416 y +#define VKI_TIOCMBIC 0x5417 y +#define VKI_TIOCMSET 0x5418 y +#define VKI_FIONREAD 0x541B +#define VKI_TIOCLINUX 0x541C +#define VKI_FIONBIO 0x5421 +#define VKI_TCSBRKP 0x5425 /* Needed for POSIX tcsendbreak() */ +#define VKI_TIOCGPTN _VKI_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */ +#define VKI_TIOCSPTLCK _VKI_IOW('T',0x31, int) /* Lock/unlock Pty */ + +#define VKI_FIOASYNC 0x5452 +#define VKI_TIOCSERGETLSR 0x5459 /* Get line status register */ + +#define VKI_TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */ +#endif + +#define VKI_TIOCFLUSH _VKI_IOW('t', 16, int); +#define VKI_TIOCGETA _VKI_IOR('t', 19, struct vki_termios) /* get termios */ +#define VKI_TIOCSETA _VKI_IOR('t', 20, struct vki_termios) /* set termios */ +#define VKI_TIOCSETAW _VKI_IOR('t', 21, struct vki_termios) /* drain,set */ +#define VKI_TIOCSETAF _VKI_IOR('t', 22, struct vki_termios) /* flush,set */ + +#define _VKI_TIOCPTMASTER _VKI_IO('t', 28) /* pts master validation */ + +#define VKI_TIOCSWINSZ _VKI_IOW('t', 103, struct vki_winsize) /* set window size */ +#define VKI_TIOCGWINSZ _VKI_IOR('t', 104, struct vki_winsize) /* get window size */ + +#define VKI_TIOCMGET _VKI_IOR('t', 106, int) /* get all modem bits */ +#define VKI_TIOCMBIC _VKI_IOW('t', 107, int) /* bic modem bits */ +#define VKI_TIOCMBIS _VKI_IOW('t', 108, int) /* bis modem bits */ +#define VKI_TIOCMSET _VKI_IOW('t', 109, int) /* set all modem bits */ +#define VKI_TIOCSTART _VKI_IO('t', 110) /* start output, like ^Q */ +#define VKI_TIOCSTOP _VKI_IO('t', 111) /* stop output, like ^S */ +#define VKI_TIOCPKT _VKI_IOW('t', 112, int) /* pty: set/clear packet mode */ + +#define VKI_TIOCSPGRP _VKI_IOW('t', 118, int) /* set pgrp */ +#define VKI_TIOCGPGRP _VKI_IOR('t', 119, int) /* get pgrp */ +#define VKI_TIOCCBRK _VKI_IO('t', 122) +#define VKI_TIOCSBRK _VKI_IO('t', 123) + + +//---------------------------------------------------------------------- +// From sys/filio.h +//---------------------------------------------------------------------- + +#define VKI_FIOCLEX _VKI_IO('f', 1) /* close on exec */ +#define VKI_FIONCLEX _VKI_IO('f', 2) /* no close on exec */ +#define VKI_FIONREAD _VKI_IOR('f', 127, int) +#define VKI_FIONBIO _VKI_IOW('f', 126, int) +#define VKI_FIOASYNC _VKI_IOW('f', 125, int) +#define VKI_FIOSETOWN _VKI_IOW('f', 124, int) +#define VKI_FIOGETOWN _VKI_IOW('f', 123, int) + +// See syswrap-freebsd.c PRE/POST(sys_ioctl) +#if 0 +//---------------------------------------------------------------------- +// From net/if.h +//---------------------------------------------------------------------- +#define VKI_IFNAMSIZ 16 + +struct vki_ifmediareq { + char ifm_name[VKI_IFNAMSIZ]; + int ifm_current; + int ifm_mask; + int ifm_status; + int ifm_active; + int ifm_count; + int *ifm_ulist; +}; + + +//---------------------------------------------------------------------- +// From sys/sockio.h +//---------------------------------------------------------------------- +#define VKI_SIOCGIFMEDIA _VKI_IOWR('i', 56, struct vki_ifmediareq) +#endif + +//---------------------------------------------------------------------- +// From sys/poll.h +//---------------------------------------------------------------------- + +#define VKI_POLLIN 0x0001 + +struct vki_pollfd { + int fd; + short events; + short revents; +}; + +//---------------------------------------------------------------------- +// From sys/event.h +//---------------------------------------------------------------------- +struct vki_kevent_freebsd11 { + vki_uintptr_t ident; + vki_int16_t filter; + vki_uint16_t flags; + vki_uint32_t fflags; + vki_intptr_t data; + void *udata; +}; + +struct vki_kevent { + vki_uintptr_t ident; + vki_int16_t filter; + vki_uint16_t flags; + vki_uint32_t fflags; + vki_int64_t data; + void *udata; + vki_uint64_t ext[4]; +}; + + +// QQQ sort + +//---------------------------------------------------------------------- +// From sys/resource.h +//---------------------------------------------------------------------- + +#define VKI_RUSAGE_SELF 0 +#define VKI_RUSAGE_CHILDREN -1 +#define VKI_RUSAGE_THREAD 1 + +struct vki_rusage { + struct vki_timeval ru_utime; /* user time used */ + struct vki_timeval ru_stime; /* system time used */ + long ru_maxrss; /* maximum resident set size */ + long ru_ixrss; /* integral shared memory size */ + long ru_idrss; /* integral unshared data size */ + long ru_isrss; /* integral unshared stack size */ + long ru_minflt; /* page reclaims */ + long ru_majflt; /* page faults */ + long ru_nswap; /* swaps */ + long ru_inblock; /* block input operations */ + long ru_oublock; /* block output operations */ + long ru_msgsnd; /* messages sent */ + long ru_msgrcv; /* messages received */ + long ru_nsignals; /* signals received */ + long ru_nvcsw; /* voluntary context switches */ + long ru_nivcsw; /* involuntary " */ +}; + +struct vki_rlimit { + vki_rlim_t rlim_cur; + vki_rlim_t rlim_max; +}; + +#define VKI_RLIMIT_DATA 2 /* max data size */ +#define VKI_RLIMIT_STACK 3 /* max stack size */ +#define VKI_RLIMIT_CORE 4 /* max core file size */ +#define VKI_RLIMIT_NOFILE 8 /* max number of open files */ + +struct vki___wrusage { + struct vki_rusage wru_self; + struct vki_rusage wru_children; +}; + + +//---------------------------------------------------------------------- +// From sys/procfs.h +//---------------------------------------------------------------------- + +#define VKI_PRSTATUS_VERSION 1 +struct vki_elf_prstatus { + int pr_version; /* version of struct - PRSTATUS_VERSION */ + vki_size_t pr_statussz; + vki_size_t pr_gregsetsz; + vki_size_t pr_fpregsetsz; + int pr_osreldate; + int pr_cursig; /* Current signal */ + vki_pid_t pr_pid; + vki_elf_gregset_t pr_reg; /* GP registers */ +}; + +#define VKI_ELF_PRARGSZ (80) /* Number of chars for args */ +#define VKI_MAXCOMLEN (16) + +#define VKI_PRPSINFO_VERSION 1 +struct vki_elf_prpsinfo { + int pr_version; /* version of struct - PRPSINFO_VERSION */ + vki_size_t pr_psinfosz; + char pr_fname[VKI_MAXCOMLEN+1]; /* filename of executable */ + char pr_psargs[VKI_ELF_PRARGSZ]; /* initial part of arg list */ +}; + +//---------------------------------------------------------------------- +// From posix4/mqueue.h +//---------------------------------------------------------------------- + +struct vki_mq_attr { + long mq_flags; /* message queue flags */ + long mq_maxmsg; /* maximum number of messages */ + long mq_msgsize; /* maximum message size */ + long mq_curmsgs; /* number of messages currently queued */ +}; + +//---------------------------------------------------------------------- +// From sys/ucontext.h +//---------------------------------------------------------------------- + +#define VKI_UCF_SWAPPED 1 + +struct vki_ucontext { + vki_sigset_t uc_sigmask; + struct vki_mcontext uc_mcontext; + struct vki_ucontext *uc_link; + vki_stack_t uc_stack; + int uc_flags; + unsigned int __spare__[4]; +}; + +//---------------------------------------------------------------------- +// From sys/utsname.h +//---------------------------------------------------------------------- + +#define VKI_SYS_NMLN 32 + +struct vki_utsname { + char sysname[VKI_SYS_NMLN]; /* Name of this OS. */ + char nodename[VKI_SYS_NMLN]; /* Name of this network node. */ + char release[VKI_SYS_NMLN]; /* Release level. */ + char version[VKI_SYS_NMLN]; /* Version level. */ + char machine[VKI_SYS_NMLN]; /* Hardware type. */ +}; + +#define VKI_IPC_CREAT 00001000 /* create if key is nonexistent */ +#define VKI_IPC_EXCL 00002000 /* fail if key exists */ +#define VKI_IPC_NOWAIT 00004000 /* return error on wait */ + +#define VKI_IPC_RMID 0 /* remove resource */ +#define VKI_IPC_SET 1 /* set ipc_perm options */ +#define VKI_IPC_STAT 2 /* get ipc_perm options */ +#define VKI_IPC_INFO 3 /* see ipcs */ + +//---------------------------------------------------------------------- +// From sys/ipc.h +//---------------------------------------------------------------------- + +struct vki_ipc_perm_old { + unsigned short cuid; + unsigned short cgid; + unsigned short uid; + unsigned short gid; + unsigned short mode; + unsigned short seq; + vki_key_t key; +}; + +struct vki_ipc_perm { + vki_uid_t cuid; + vki_gid_t cgid; + vki_uid_t uid; + vki_gid_t gid; + vki_mode_t mode; + unsigned short seq; + vki_key_t key; +}; + +//---------------------------------------------------------------------- +// From sys/sem.h +//---------------------------------------------------------------------- + +#define VKI_GETALL 6 /* get all semval's */ +#define VKI_SETVAL 8 /* set semval */ +#define VKI_SETALL 9 /* set all semval's */ +#define VKI_SEM_STAT 10 +#define VKI_SEM_INFO 11 + +struct vki_semid_ds_old { + struct vki_ipc_perm_old sem_perm; + struct sem *__sem_base; + unsigned short sem_nsems; + vki_time_t sem_otime; + long sem_pad1; + vki_time_t sem_ctime; + long sem_pad2; + long sem_pad3[4]; +}; + + +/* Obsolete, used only for backwards compatibility and libc5 compiles */ +struct vki_semid_ds { + struct vki_ipc_perm sem_perm; /* permissions .. see ipc.h */ + // [[Use void* to avoid excess header copying]] + void/*struct sem */*sem_base; /* ptr to first semaphore in array */ + unsigned short sem_nsems; /* no. of semaphores in array */ + vki_time_t sem_otime; /* last semop time */ + vki_time_t sem_ctime; /* last change time */ + long sem_pad2; + long sem_pad3[4]; +}; + +struct vki_sembuf { + vki_uint16_t sem_num; /* semaphore index in array */ + vki_int16_t sem_op; /* semaphore operation */ + vki_int16_t sem_flg; /* operation flags */ +}; + +union vki_semun { + int val; /* value for SETVAL */ + struct vki_semid_ds *buf; /* buffer for IPC_STAT & IPC_SET */ + vki_uint16_t *array; /* array for GETALL & SETALL */ +}; + + +//---------------------------------------------------------------------- +// From sys/errno.h +//---------------------------------------------------------------------- + +#define VKI_ERESTART -1 +#define VKI_EPERM 1 /* Operation not permitted */ +#define VKI_ENOENT 2 /* No such file or directory */ +#define VKI_ESRCH 3 /* No such process */ +#define VKI_EINTR 4 /* Interrupted system call */ +#define VKI_EIO 5 /* Input/output error */ +#define VKI_ENXIO 6 /* Device not configured */ +#define VKI_E2BIG 7 /* Argument list too long */ +#define VKI_ENOEXEC 8 /* Exec format error */ +#define VKI_EBADF 9 /* Bad file descriptor */ +#define VKI_ECHILD 10 /* No child processes */ +#define VKI_EDEADLK 11 /* Resource deadlock avoided */ +#define VKI_ENOMEM 12 /* Cannot allocate memory */ +#define VKI_EACCES 13 /* Permission denied */ +#define VKI_EFAULT 14 /* Bad address */ +#define VKI_ENOTBLK 15 /* Block device required */ +#define VKI_EBUSY 16 /* Device busy */ +#define VKI_EEXIST 17 /* File exists */ +#define VKI_EXDEV 18 /* Cross-device link */ +#define VKI_ENODEV 19 /* Operation not supported by device */ +#define VKI_ENOTDIR 20 /* Not a directory */ +#define VKI_EISDIR 21 /* Is a directory */ +#define VKI_EINVAL 22 /* Invalid argument */ +#define VKI_ENFILE 23 /* Too many open files in system */ +#define VKI_EMFILE 24 /* Too many open files */ +#define VKI_ENOTTY 25 /* Inappropriate ioctl for device */ +#define VKI_ETXTBSY 26 /* Text file busy */ +#define VKI_EFBIG 27 /* File too large */ +#define VKI_ENOSPC 28 /* No space left on device */ +#define VKI_ESPIPE 29 /* Illegal seek */ +#define VKI_EROFS 30 /* Read-only filesystem */ +#define VKI_EMLINK 31 /* Too many links */ +#define VKI_EPIPE 32 /* Broken pipe */ +#define VKI_EDOM 33 /* Numerical argument out of domain */ +#define VKI_ERANGE 34 /* Result too large */ +#define VKI_EAGAIN 35 /* Resource temporarily unavailable */ +#define VKI_EWOULDBLOCK VKI_EAGAIN /* Operation would block */ +#define VKI_EINPROGRESS 36 /* Operation now in progress */ +#define VKI_EALREADY 37 /* Operation already in progress */ +#define VKI_ENOTSOCK 38 /* Socket operation on non-socket */ +#define VKI_EDESTADDRREQ 39 /* Destination address required */ +#define VKI_EMSGSIZE 40 /* Message too long */ +#define VKI_EPROTOTYPE 41 /* Protocol wrong type for socket */ +#define VKI_ENOPROTOOPT 42 /* Protocol not available */ +#define VKI_EPROTONOSUPPORT 43 /* Protocol not supported */ +#define VKI_ESOCKTNOSUPPORT 44 /* Socket type not supported */ +#define VKI_EOPNOTSUPP 45 /* Operation not supported */ +#define VKI_ENOTSUP VKI_EOPNOTSUPP /* Operation not supported */ +#define VKI_EPFNOSUPPORT 46 /* Protocol family not supported */ +#define VKI_EAFNOSUPPORT 47 /* Address family not supported by protocol family */ +#define VKI_EADDRINUSE 48 /* Address already in use */ +#define VKI_EADDRNOTAVAIL 49 +#define VKI_ENETDOWN 50 /* Network is down */ +#define VKI_ENETUNREACH 51 /* Network is unreachable */ +#define VKI_ENETRESET 52 /* Network dropped connection on reset */ +#define VKI_ECONNABORTED 53 /* Software caused connection abort */ +#define VKI_ECONNRESET 54 /* Connection reset by peer */ +#define VKI_ENOBUFS 55 /* No buffer space available */ +#define VKI_EISCONN 56 /* Socket is already connected */ +#define VKI_ENOTCONN 57 /* Socket is not connected */ +#define VKI_ESHUTDOWN 58 /* Can't send after socket shutdown */ +#define VKI_ETOOMANYREFS 59 /* Too many references: can't splice */ +#define VKI_ETIMEDOUT 60 /* Operation timed out */ +#define VKI_ECONNREFUSED 61 /* Connection refused */ +#define VKI_ELOOP 62 /* Too many levels of symbolic links */ +#define VKI_ENAMETOOLONG 63 /* File name too long */ +#define VKI_EHOSTDOWN 64 /* Host is down */ +#define VKI_EHOSTUNREACH 65 /* No route to host */ +#define VKI_ENOTEMPTY 66 /* Directory not empty */ +#define VKI_EPROCLIM 67 /* Too many processes */ +#define VKI_EUSERS 68 /* Too many users */ +#define VKI_EDQUOT 69 /* Disc quota exceeded */ +#define VKI_ESTALE 70 /* Stale NFS file handle */ +#define VKI_EREMOTE 71 /* Too many levels of remote in path */ +#define VKI_EBADRPC 72 /* RPC struct is bad */ +#define VKI_ERPCMISMATCH 73 /* RPC version wrong */ +#define VKI_EPROGUNAVAIL 74 /* RPC prog. not avail */ +#define VKI_EPROGMISMATCH 75 /* Program version wrong */ +#define VKI_EPROCUNAVAIL 76 /* Bad procedure for program */ +#define VKI_ENOLCK 77 /* No locks available */ +#define VKI_ENOSYS 78 /* Function not implemented */ +#define VKI_EFTYPE 79 /* Inappropriate file type or format */ +#define VKI_EAUTH 80 /* Authentication error */ +#define VKI_ENEEDAUTH 81 /* Need authenticator */ +#define VKI_EIDRM 82 /* Identifier removed */ +#define VKI_ENOMSG 83 /* No message of desired type */ +#define VKI_EOVERFLOW 84 /* Value too large to be stored in data type */ +#define VKI_ECANCELED 85 /* Operation canceled */ +#define VKI_EILSEQ 86 /* Illegal byte sequence */ +#define VKI_ENOATTR 87 /* Attribute not found */ +#define VKI_EDOOFUS 88 /* Programming error */ +#define VKI_EBADMSG 89 /* Bad message */ +#define VKI_EMULTIHOP 90 /* Multihop attempted */ +#define VKI_ENOLINK 91 /* Link has been severed */ +#define VKI_EPROTO 92 /* Protocol error */ +#define VKI_ENOTCAPABLE 93 /* Capabilities insufficient */ +#define VKI_ECAPMODE 94 /* Not permitted in capability mode */ + +//---------------------------------------------------------------------- +// From sys/wait.h +//---------------------------------------------------------------------- + +#define VKI_WNOHANG 0x00000001 + +typedef enum vki_idtype { + P_PID, + P_PPID, + P_PGID, + P_SID, + P_CID, + P_UID, + P_GID, + P_ALL, + P_LWPID, + P_TASKID, + P_PROJID, + P_POOLID, + P_JAILID, + P_CTID, + P_CPUID, + P_PSETID +} vki_idtype_t; + +//---------------------------------------------------------------------- +// From sys/mman.h +//---------------------------------------------------------------------- + +#define VKI_PROT_NONE 0x00 /* No page permissions */ +#define VKI_PROT_READ 0x01 /* page can be read */ +#define VKI_PROT_WRITE 0x02 /* page can be written */ +#define VKI_PROT_EXEC 0x04 /* page can be executed */ + +#define VKI_MAP_SHARED 0x01 /* Share changes */ +#define VKI_MAP_PRIVATE 0x02 /* Changes are private */ +#define VKI_MAP_FIXED 0x10 /* Interpret addr exactly */ +#define VKI_MAP_NORESERVE 0x0040 /* don't check for reservations */ +#define VKI_MAP_STACK 0x400 +#define VKI_MAP_ANON 0x1000 /* don't use a file */ +#define VKI_MAP_ANONYMOUS VKI_MAP_ANON + +//---------------------------------------------------------------------- +// From sys/stat.h +//---------------------------------------------------------------------- + +#define VKI_S_IFMT 00170000 + +#define VKI_S_IFWHT 0160000 +#define VKI_S_IFSOCK 0140000 +#define VKI_S_IFLNK 0120000 +#define VKI_S_IFREG 0100000 +#define VKI_S_IFBLK 0060000 +#define VKI_S_IFDIR 0040000 +#define VKI_S_IFCHR 0020000 +#define VKI_S_IFIFO 0010000 +#define VKI_S_ISUID 0004000 +#define VKI_S_ISGID 0002000 +#define VKI_S_ISTXT 0001000 + +#define VKI_S_ISLNK(m) (((m) & VKI_S_IFMT) == VKI_S_IFLNK) +#define VKI_S_ISREG(m) (((m) & VKI_S_IFMT) == VKI_S_IFREG) +#define VKI_S_ISDIR(m) (((m) & VKI_S_IFMT) == VKI_S_IFDIR) +#define VKI_S_ISCHR(m) (((m) & VKI_S_IFMT) == VKI_S_IFCHR) +#define VKI_S_ISBLK(m) (((m) & VKI_S_IFMT) == VKI_S_IFBLK) +#define VKI_S_ISFIFO(m) (((m) & VKI_S_IFMT) == VKI_S_IFIFO) +#define VKI_S_ISSOCK(m) (((m) & VKI_S_IFMT) == VKI_S_IFSOCK) +#define VKI_S_ISWHT(m) (((m) & VKI_S_IFMT) == VKI_S_IFWHT) + +#define VKI_S_IRWXU 00700 +#define VKI_S_IRUSR 00400 +#define VKI_S_IWUSR 00200 +#define VKI_S_IXUSR 00100 + +#define VKI_S_IRWXG 00070 +#define VKI_S_IRGRP 00040 +#define VKI_S_IWGRP 00020 +#define VKI_S_IXGRP 00010 + +#define VKI_S_IRWXO 00007 +#define VKI_S_IROTH 00004 +#define VKI_S_IWOTH 00002 +#define VKI_S_IXOTH 00001 + + +//---------------------------------------------------------------------- +// From sys/dirent.h +//---------------------------------------------------------------------- + +struct vki_dirent { + vki_uint32_t d_fileno; + vki_uint16_t d_reclen; + vki_uint8_t d_type; + vki_uint8_t d_namelen; + char d_name[256]; /* We must not include limits.h! */ +}; + +//---------------------------------------------------------------------- +// From sys/fcntl.h +//---------------------------------------------------------------------- + +#define VKI_O_RDONLY O_RDONLY +#define VKI_O_WRONLY O_WRONLY +#define VKI_O_RDWR O_RDWR + +#define VKI_O_NONBLOCK O_NONBLOCK +#define VKI_O_APPEND O_APPEND +#define VKI_O_CREAT O_CREAT +#define VKI_O_TRUNC O_TRUNC +#define VKI_O_EXCL O_EXCL + +#define VKI_AT_FDCWD AT_FDCWD + +#define VKI_F_DUPFD 0 /* dup */ +#define VKI_F_GETFD 1 /* get close_on_exec */ +#define VKI_F_SETFD 2 /* set/clear close_on_exec */ +#define VKI_F_GETFL 3 /* get file->f_flags */ +#define VKI_F_SETFL 4 /* set file->f_flags */ +#define VKI_F_SETOWN 5 /* for sockets. */ +#define VKI_F_GETOWN 6 /* for sockets. */ +#define VKI_F_OGETLK 7 /* get record locking information */ +#define VKI_F_OSETLK 8 /* set record locking information */ +#define VKI_F_OSETLKW 9 /* F_SETLK; wait if blocked */ +#define VKI_F_DUP2FD 10 /* duplicate file descriptor to arg */ +#define VKI_F_GETLK 11 /* get record locking information */ +#define VKI_F_SETLK 12 /* set record locking information */ +#define VKI_F_SETLKW 13 /* F_SETLK; wait if blocked */ +#define VKI_F_SETLK_REMOTE 14 /* debugging support for remote locks */ +#define VKI_F_READAHEAD 15 /* read ahead */ +#define VKI_F_RDAHEAD 16 /* Darwin compatible read ahead */ +#define VKI_F_DUPFD_CLOEXEC 17 /* dup close_on_exec */ +#define VKI_F_DUP2FD_CLOEXEC 18 /* Like F_DUP2FD, but FD_CLOEXEC is set */ +#define VKI_F_ADD_SEALS 19 /* apply seals to underlying file */ +#define VKI_F_GET_SEALS 20 /* get seals to underlying file */ +#define VKI_F_ISUNIONSTACK 21 /* kludge for libc (part of a union stack?) */ + +/* for F_[GET|SET]FL */ +#define VKI_FD_CLOEXEC 1 /* actually anything with low bit set goes */ + +/* for F_[ADD|GET]_SEALS */ +#define VKI_F_SEAL_SEAL 0x0001 +#define VKI_F_SEAL_SHRINK 0x0002 +#define VKI_F_SEAL_GROW 0x0004 +#define VKI_F_SEAL_WRITE 0x0008 + +//---------------------------------------------------------------------- +// From sys/unistd.h +//---------------------------------------------------------------------- + +#define VKI_SEEK_SET 0 +#define VKI_SEEK_CUR 1 +#define VKI_SEEK_END 2 + +#define VKI_F_OK 0 /* test for existence of file */ +#define VKI_X_OK 0x01 /* test for execute or search permission */ +#define VKI_W_OK 0x02 /* test for write permission */ +#define VKI_R_OK 0x04 /* test for read permission */ + +//---------------------------------------------------------------------- +// From sys/msg.h +//---------------------------------------------------------------------- + +#if 0 /* not in freebsd */ +#define VKI_MSGSND 11 +#define VKI_MSGRCV 12 +#define VKI_MSGGET 13 +#define VKI_MSGCTL 14 +#endif + +typedef unsigned long vki_msglen_t; +typedef unsigned long vki_msgqnum_t; + +struct vki_msqid_ds_old { + struct vki_ipc_perm_old msg_perm; + struct vki_msg *msg_first; + struct vki_msg *msg_last; + vki_msglen_t msg_cbytes; + vki_msgqnum_t msg_qnum; + vki_msglen_t msg_qbytes; + vki_pid_t msg_lspid; + vki_pid_t msg_lrpid; + vki_time_t msg_stime; + vki_uint32_t msg_pad1; + vki_time_t msg_rtime; + vki_uint32_t msg_pad2; + vki_time_t msg_ctime; + vki_uint32_t msg_pad3; + vki_uint32_t msg_pad4[4]; +}; + +struct vki_msqid_ds { + struct vki_ipc_perm msg_perm; + struct vki_msg *msg_first; + struct vki_msg *msg_last; + vki_msglen_t msg_cbytes; + vki_msgqnum_t msg_qnum; + vki_msglen_t msg_qbytes; + vki_pid_t msg_lspid; + vki_pid_t msg_lrpid; + vki_time_t msg_stime; + vki_time_t msg_rtime; + vki_time_t msg_ctime; +}; + + +struct vki_msgbuf { + long mtype; /* type of message */ + char mtext[1]; /* message text */ +}; + + +//---------------------------------------------------------------------- +// From sys/shm.h +//---------------------------------------------------------------------- + +struct vki_shmid_ds_old { + struct vki_ipc_perm_old shm_perm; /* operation perms */ + int shm_segsz; /* size of segment (bytes) */ + vki_pid_t shm_lpid; /* pid of last operator */ + vki_pid_t shm_cpid; /* pid of creator */ + short shm_nattch; /* no. of current attaches */ + vki_time_t shm_atime; /* last attach time */ + vki_time_t shm_dtime; /* last detach time */ + vki_time_t shm_ctime; /* last change time */ + void *shm_internal; /* sysv stupidity */ +}; + + +struct vki_shmid_ds { + struct vki_ipc_perm shm_perm; /* operation perms */ + vki_size_t shm_segsz; /* size of segment (bytes) */ + vki_pid_t shm_lpid; /* pid of last operator */ + vki_pid_t shm_cpid; /* pid of creator */ + int shm_nattch; /* no. of current attaches */ + vki_time_t shm_atime; /* last attach time */ + vki_time_t shm_dtime; /* last detach time */ + vki_time_t shm_ctime; /* last change time */ +}; + +#define VKI_SHMLBA VKI_PAGE_SIZE +#define VKI_SHM_RDONLY 010000 /* read-only access */ +#define VKI_SHM_ANON (1UL) + +#if 0 /* not in freebsd abi */ +#define VKI_SHMAT 21 +#define VKI_SHMDT 22 +#define VKI_SHMGET 23 +#define VKI_SHMCTL 24 +#endif + +#if 0 +//---------------------------------------------------------------------- +// From linux-2.6.8.1/include/linux/sockios.h +//---------------------------------------------------------------------- + +#define VKI_SIOCOUTQ VKI_TIOCOUTQ + +#define VKI_SIOCADDRT 0x890B /* add routing table entry */ +#define VKI_SIOCDELRT 0x890C /* delete routing table entry */ + +#define VKI_SIOCGIFNAME 0x8910 /* get iface name */ +#define VKI_SIOCGIFCONF 0x8912 /* get iface list */ +#define VKI_SIOCGIFFLAGS 0x8913 /* get flags */ +#define VKI_SIOCSIFFLAGS 0x8914 /* set flags */ +#define VKI_SIOCGIFADDR 0x8915 /* get PA address */ +#define VKI_SIOCSIFADDR 0x8916 /* set PA address */ +#define VKI_SIOCGIFDSTADDR 0x8917 /* get remote PA address */ +#define VKI_SIOCSIFDSTADDR 0x8918 /* set remote PA address */ +#define VKI_SIOCGIFBRDADDR 0x8919 /* get broadcast PA address */ +#define VKI_SIOCSIFBRDADDR 0x891a /* set broadcast PA address */ +#define VKI_SIOCGIFNETMASK 0x891b /* get network PA mask */ +#define VKI_SIOCSIFNETMASK 0x891c /* set network PA mask */ +#define VKI_SIOCGIFMETRIC 0x891d /* get metric */ +#define VKI_SIOCSIFMETRIC 0x891e /* set metric */ +#define VKI_SIOCGIFMTU 0x8921 /* get MTU size */ +#define VKI_SIOCSIFMTU 0x8922 /* set MTU size */ +#define VKI_SIOCSIFHWADDR 0x8924 /* set hardware address */ +#define VKI_SIOCGIFHWADDR 0x8927 /* Get hardware address */ +#define VKI_SIOCGIFINDEX 0x8933 /* name -> if_index mapping */ + +#define VKI_SIOCGIFTXQLEN 0x8942 /* Get the tx queue length */ +#define VKI_SIOCSIFTXQLEN 0x8943 /* Set the tx queue length */ + +#define VKI_SIOCGMIIPHY 0x8947 /* Get address of MII PHY in use. */ +#define VKI_SIOCGMIIREG 0x8948 /* Read MII PHY register. */ +#define VKI_SIOCSMIIREG 0x8949 /* Write MII PHY register. */ + +#define VKI_SIOCDARP 0x8953 /* delete ARP table entry */ +#define VKI_SIOCGARP 0x8954 /* get ARP table entry */ +#define VKI_SIOCSARP 0x8955 /* set ARP table entry */ + +#define VKI_SIOCDRARP 0x8960 /* delete RARP table entry */ +#define VKI_SIOCGRARP 0x8961 /* get RARP table entry */ +#define VKI_SIOCSRARP 0x8962 /* set RARP table entry */ + +#define VKI_SIOCGIFMAP 0x8970 /* Get device parameters */ +#define VKI_SIOCSIFMAP 0x8971 /* Set device parameters */ + +//---------------------------------------------------------------------- +// From linux-2.6.9/include/linux/kb.h +//---------------------------------------------------------------------- + +#define VKI_GIO_FONT 0x4B60 /* gets font in expanded form */ +#define VKI_PIO_FONT 0x4B61 /* use font in expanded form */ + +#define VKI_GIO_FONTX 0x4B6B /* get font using struct consolefontdesc */ +#define VKI_PIO_FONTX 0x4B6C /* set font using struct consolefontdesc */ +struct vki_consolefontdesc { + unsigned short charcount; /* characters in font (256 or 512) */ + unsigned short charheight; /* scan lines per character (1-32) */ + char __user *chardata; /* font data in expanded form */ +}; + +#define VKI_PIO_FONTRESET 0x4B6D /* reset to default font */ + +#define VKI_GIO_CMAP 0x4B70 /* gets colour palette on VGA+ */ +#define VKI_PIO_CMAP 0x4B71 /* sets colour palette on VGA+ */ + +#define VKI_KIOCSOUND 0x4B2F /* start sound generation (0 for off) */ +#define VKI_KDMKTONE 0x4B30 /* generate tone */ + +#define VKI_KDGETLED 0x4B31 /* return current led state */ +#define VKI_KDSETLED 0x4B32 /* set led state [lights, not flags] */ + +#define VKI_KDGKBTYPE 0x4B33 /* get keyboard type */ + +#define VKI_KDADDIO 0x4B34 /* add i/o port as valid */ +#define VKI_KDDELIO 0x4B35 /* del i/o port as valid */ +#define VKI_KDENABIO 0x4B36 /* enable i/o to video board */ +#define VKI_KDDISABIO 0x4B37 /* disable i/o to video board */ + +#define VKI_KDSETMODE 0x4B3A /* set text/graphics mode */ +#define VKI_KDGETMODE 0x4B3B /* get current mode */ + +#define VKI_KDMAPDISP 0x4B3C /* map display into address space */ +#define VKI_KDUNMAPDISP 0x4B3D /* unmap display from address space */ + +#define VKI_E_TABSZ 256 +#define VKI_GIO_SCRNMAP 0x4B40 /* get screen mapping from kernel */ +#define VKI_PIO_SCRNMAP 0x4B41 /* put screen mapping table in kernel */ +#define VKI_GIO_UNISCRNMAP 0x4B69 /* get full Unicode screen mapping */ +#define VKI_PIO_UNISCRNMAP 0x4B6A /* set full Unicode screen mapping */ + +#define VKI_GIO_UNIMAP 0x4B66 /* get unicode-to-font mapping from kernel */ +#define VKI_PIO_UNIMAP 0x4B67 /* put unicode-to-font mapping in kernel */ +#define VKI_PIO_UNIMAPCLR 0x4B68 /* clear table, possibly advise hash algorithm */ + +#define VKI_KDGKBMODE 0x4B44 /* gets current keyboard mode */ +#define VKI_KDSKBMODE 0x4B45 /* sets current keyboard mode */ + +#define VKI_KDGKBMETA 0x4B62 /* gets meta key handling mode */ +#define VKI_KDSKBMETA 0x4B63 /* sets meta key handling mode */ + +#define VKI_KDGKBLED 0x4B64 /* get led flags (not lights) */ +#define VKI_KDSKBLED 0x4B65 /* set led flags (not lights) */ + +struct vki_kbentry { + unsigned char kb_table; + unsigned char kb_index; + unsigned short kb_value; +}; +#define VKI_KDGKBENT 0x4B46 /* gets one entry in translation table */ +#define VKI_KDSKBENT 0x4B47 /* sets one entry in translation table */ + +struct vki_kbsentry { + unsigned char kb_func; + unsigned char kb_string[512]; +}; +#define VKI_KDGKBSENT 0x4B48 /* gets one function key string entry */ +#define VKI_KDSKBSENT 0x4B49 /* sets one function key string entry */ + +struct vki_kbdiacr { + unsigned char diacr, base, result; +}; +struct vki_kbdiacrs { + unsigned int kb_cnt; /* number of entries in following array */ + struct vki_kbdiacr kbdiacr[256]; /* MAX_DIACR from keyboard.h */ +}; +#define VKI_KDGKBDIACR 0x4B4A /* read kernel accent table */ +#define VKI_KDSKBDIACR 0x4B4B /* write kernel accent table */ + +struct vki_kbkeycode { + unsigned int scancode, keycode; +}; +#define VKI_KDGETKEYCODE 0x4B4C /* read kernel keycode table entry */ +#define VKI_KDSETKEYCODE 0x4B4D /* write kernel keycode table entry */ + +#define VKI_KDSIGACCEPT 0x4B4E /* accept kbd generated signals */ + +struct vki_kbd_repeat { + int delay; /* in msec; <= 0: don't change */ + int period; /* in msec; <= 0: don't change */ + /* earlier this field was misnamed "rate" */ +}; +#define VKI_KDKBDREP 0x4B52 /* set keyboard delay/repeat rate; + * actually used values are returned */ + +#define VKI_KDFONTOP 0x4B72 /* font operations */ + +//---------------------------------------------------------------------- +// From linux-2.6.9/include/linux/kb.h +//---------------------------------------------------------------------- + +typedef __vki_kernel_uid32_t vki_qid_t; /* Type in which we store ids in memory */ + +#endif + +//---------------------------------------------------------------------- +// From sys/ptrace.h +//---------------------------------------------------------------------- + +#define VKI_PTRACE_TRACEME 0 +#define VKI_PTRACE_READ_I 1 +#define VKI_PTRACE_READ_D 2 +/* 3 - read user struct */ +#define VKI_PTRACE_WRITE_I 4 +#define VKI_PTRACE_WRITE_D 5 +/* 6 - write user struct */ +#define VKI_PTRACE_CONTINUE 7 +#define VKI_PTRACE_KILL 8 +#define VKI_PTRACE_STEP 9 +#define VKI_PTRACE_ATTACH 10 +#define VKI_PTRACE_DETACH 11 +#define VKI_PTRACE_IO 12 +#define VKI_PTRACE_LWPINFO 13 +#define VKI_PTRACE_GETNUMLWPS 14 +#define VKI_PTRACE_GETLWPLIST 15 +#define VKI_PTRACE_CLEARSTEP 16 +#define VKI_PTRACE_SETSTEP 17 +#define VKI_PTRACE_SUSPEND 18 +#define VKI_PTRACE_RESUME 19 +#define VKI_PTRACE_TO_SCE 20 +#define VKI_PTRACE_TO_SCX 21 +#define VKI_PTRACE_SYSCALL 22 +/* md */ +#define VKI_PTRACE_GETREGS 33 +#define VKI_PTRACE_SETREGS 34 +#define VKI_PTRACE_GETFPREGS 35 +#define VKI_PTRACE_SETFPREGS 36 +#define VKI_PTRACE_GETDBREGS 37 +#define VKI_PTRACE_SETDBREGS 38 + +#define VKI_PTRACE_VM_TIMESTAMP 40 +#define VKI_PTRACE_VM_ENTRY 41 + +#define VKI_PTRACE_FIRSTMACH 64 + +struct vki_ptrace_io_desc { + int piod_op; + void * piod_offs; + void * piod_addr; + vki_size_t piod_len; +}; +#define VKI_PIOD_READ_D 1 +#define VKI_PIOD_WRITE_D 2 +#define VKI_PIOD_READ_I 3 +#define VKI_PIOD_WRITE_I 4 + +struct vki_ptrace_lwpinfo { + vki_lwpid_t pl_lwpid; + int pl_event; +#define VKI_PL_EVENT_NONE 0 +#define VKI_PL_EVENT_SIGNAL 1 + int pl_flags; +#define VKI_FLAG_SA 0x01 +#define VKI_FLAG_BOUND 0x02 + vki_sigset_t pl_sigmask; + vki_sigset_t pl_siglist; +}; + +struct vki_ptrace_vm_entry { + int pve_entry; /* Entry number used for iteration. */ + int pve_timestamp; /* Generation number of VM map. */ + unsigned long pve_start; /* Start VA of range. */ + unsigned long pve_end; /* End VA of range (incl). */ + unsigned long pve_offset; /* Offset in backing object. */ + unsigned int pve_prot; /* Protection of memory range. */ + unsigned int pve_pathlen; /* Size of path. */ + long pve_fileid; /* File ID. */ + vki_uint32_t pve_fsid; /* File system ID. */ + char *pve_path; /* Path name of object. */ +}; + +#endif // __VKI_FREEBSD_H + +//---------------------------------------------------------------------- +// From x86/sysarch.h +//---------------------------------------------------------------------- + +// @todo PJF missing VKI_I386_VM86 VKI_I386_SET_PKRU VKI_I386_CLEAR_PKRU VKI_AMD64_SET_PKRU VKI_AMD64_CLEAR_PKRU +#define VKI_I386_GET_FSBASE 7 +#define VKI_I386_SET_FSBASE 8 +#define VKI_I386_GET_GSBASE 9 +#define VKI_I386_SET_GSBASE 10 +#define VKI_I386_GET_XFPUSTATE 11 + +#define VKI_AMD64_GET_FSBASE 128 +#define VKI_AMD64_SET_FSBASE 129 +#define VKI_AMD64_GET_GSBASE 130 +#define VKI_AMD64_SET_GSBASE 131 +#define VKI_AMD64_GET_XFPUSTATE 132 + +//---------------------------------------------------------------------- +// From sys/module.h +//---------------------------------------------------------------------- + +#define VKI_MAXMODNAME 32 + +typedef union vki_modspecific { + vki_int32_t intval; + vki_uint32_t u_intval; +#if defined(VGP_x86_freebsd) + vki_int32_t longval; + vki_uint32_t u_longval; +#elif defined(VGP_amd64_freebsd) + vki_int64_t longval; + vki_uint64_t u_longval; +#else +#error Unknown platform +#endif +} vki_modspecific_t; + +struct vki_module_stat { + int version; + char name[VKI_MAXMODNAME]; + int refs; + int id; + vki_modspecific_t data; +}; + +//---------------------------------------------------------------------- +// From sys/rtprio.h +//---------------------------------------------------------------------- + +struct vki_rtprio { + vki_uint16_t type; + vki_uint16_t prio; +}; + +#define VKI_RTP_LOOKUP 0 +#define VKI_RTP_SET 1 + +//---------------------------------------------------------------------- +// From sys/umtx.h +//---------------------------------------------------------------------- + +struct vki_umtx { + unsigned long u_owner; +}; + +struct vki_umutex { + vki_lwpid_t m_owner; + vki_uint32_t m_flags; + vki_uint32_t m_ceilings[2]; + vki_uint32_t m_spare[4]; +}; + +struct vki_ucond { + vki_uint32_t c_has_waiters; + vki_uint32_t c_flags; + vki_uint32_t c_spare[2]; +}; + +struct vki_urwlock { + vki_uint32_t rw_state; + vki_uint32_t rw_flags; + vki_uint32_t rw_blocked_readers; + vki_uint32_t rw_blocked_writers; + vki_uint32_t rw_spare[4]; +}; + +struct vki_usem { + vki_uint32_t has_waiters; + vki_uint32_t count; + vki_uint32_t flags; +}; + +struct vki_umtx_time { + struct vki_timespec timeout; + vki_uint32_t flags; + vki_uint32_t clockid; +}; + +struct vki_usem2 { + vki_uint32_t count; + vki_uint32_t flags; +}; + +struct vki_umtx_robust_lists_params { + vki_uintptr_t robust_list_offset; + vki_uintptr_t robust_priv_list_offset; + vki_uintptr_t robust_inact_offset; +}; + +#define VKI_UMTX_OP_LOCK 0 +#define VKI_UMTX_OP_UNLOCK 1 +#define VKI_UMTX_OP_WAIT 2 +#define VKI_UMTX_OP_WAKE 3 +#define VKI_UMTX_OP_MUTEX_TRYLOCK 4 +#define VKI_UMTX_OP_MUTEX_LOCK 5 +#define VKI_UMTX_OP_MUTEX_UNLOCK 6 +#define VKI_UMTX_OP_SET_CEILING 7 +#define VKI_UMTX_OP_CV_WAIT 8 +#define VKI_UMTX_OP_CV_SIGNAL 9 +#define VKI_UMTX_OP_CV_BROADCAST 10 +#define VKI_UMTX_OP_WAIT_UINT 11 +#define VKI_UMTX_OP_RW_RDLOCK 12 +#define VKI_UMTX_OP_RW_WRLOCK 13 +#define VKI_UMTX_OP_RW_UNLOCK 14 +#define VKI_UMTX_OP_WAIT_UINT_PRIVATE 15 +#define VKI_UMTX_OP_WAKE_PRIVATE 16 +#define VKI_UMTX_OP_MUTEX_WAIT 17 +#define VKI_UMTX_OP_MUTEX_WAKE 18 /* deprecated */ +#define VKI_UMTX_OP_SEM_WAIT 19 +#define VKI_UMTX_OP_SEM_WAKE 20 +#define VKI_UMTX_OP_NWAKE_PRIVATE 21 +#define VKI_UMTX_OP_MUTEX_WAKE2 22 +#define VKI_UMTX_OP_SEM2_WAIT 23 +#define VKI_UMTX_OP_SEM2_WAKE 24 +#define VKI_UMTX_OP_SHM 25 +#define VKI_UMTX_OP_ROBUST_LISTS 26 +#define VKI_UMTX_OP_MAX 27 + + +//---------------------------------------------------------------------- +// From sys/acl.h +//---------------------------------------------------------------------- + +struct vki_acl_entry { + int ae_tag; + vki_uid_t ae_uid; + vki_mode_t ae_perm; +}; + +#define VKI_ACL_MAX_ENTRIES 32 +struct vki_acl { + int acl_cnt; + struct vki_acl_entry acl_entry[VKI_ACL_MAX_ENTRIES]; +}; + + +//---------------------------------------------------------------------- +// From sys/uuid.h +//---------------------------------------------------------------------- + +struct vki_uuid { + vki_uint32_t time_low; + vki_uint16_t time_mid; + vki_uint16_t time_hi_and_version; + vki_uint8_t clock_seq_hi_and_reserved; + vki_uint8_t clock_seq_low; + vki_uint8_t node[6]; +}; + +//---------------------------------------------------------------------- +// From sys/user.h +//---------------------------------------------------------------------- + +#define VKI_KVME_TYPE_NONE 0 +#define VKI_KVME_TYPE_DEFAULT 1 +#define VKI_KVME_TYPE_VNODE 2 +#define VKI_KVME_TYPE_SWAP 3 +#define VKI_KVME_TYPE_DEVICE 4 +#define VKI_KVME_TYPE_PHYS 5 +#define VKI_KVME_TYPE_DEAD 6 +#define VKI_KVME_TYPE_UNKNOWN 255 + +#define VKI_KVME_PROT_READ 0x00000001 +#define VKI_KVME_PROT_WRITE 0x00000002 +#define VKI_KVME_PROT_EXEC 0x00000004 + +#define VKI_KVME_FLAG_COW 0x00000001 +#define VKI_KVME_FLAG_NEEDS_COPY 0x00000002 + +struct vki_kinfo_vmentry { + int kve_structsize; + int kve_type; + ULong kve_start; + ULong kve_end; + Off64T kve_offset; + ULong kve_fileid; + UInt kve_fsid; + int kve_flags; + int kve_resident; + int kve_private_resident; + int kve_protection; + int kve_ref_count; + int kve_shadow_count; + int _kve_pad0; + int kve_ispare[16]; + char kve_path[VKI_PATH_MAX]; +}; + +struct vki_kinfo_file { + int kf_structsize; /* Variable size of record. */ + int kf_type; /* Descriptor type. */ + int kf_fd; /* Array index. */ + int kf_ref_count; /* Reference count. */ + int kf_flags; /* Flags. */ + int _kf_pad0; /* Round to 64 bit alignment */ + Off64T kf_offset; /* Seek location. */ + int kf_vnode_type; /* Vnode type. */ + int kf_sock_domain; /* Socket domain. */ + int kf_sock_type; /* Socket type. */ + int kf_sock_protocol; /* Socket protocol. */ + char kf_sa_local[128]; /* Socket address. */ + char kf_sa_peer[128]; /* Peer address. */ + int _kf_ispare[16]; /* Space for more stuff. */ + /* Truncated before copyout in sysctl */ + char kf_path[VKI_PATH_MAX]; /* Path to file, if any. */ +}; + +//---------------------------------------------------------------------- +// From sys/kenv.h +//---------------------------------------------------------------------- +#define VKI_KENV_GET 0 +#define VKI_KENV_SET 1 +#define VKI_KENV_UNSET 2 +#define VKI_KENV_DUMP 3 + +//---------------------------------------------------------------------- +// From sys/sysctl.h (and related) +//---------------------------------------------------------------------- + +#include +#include + +#define VKI_CTL_KERN CTL_KERN +#define VKI_CTL_HW CTL_HW +#define VKI_KERN_PROC KERN_PROC +#define VKI_KERN_PROC_VMMAP KERN_PROC_VMMAP +#define VKI_KERN_PROC_FILEDESC KERN_PROC_FILEDESC +#define VKI_HW_MACHINE HW_MACHINE + +//---------------------------------------------------------------------- +// From sys/thr.h +//---------------------------------------------------------------------- + +struct vki_thr_param { + void (*start_func)(void *); + void *arg; + char *stack_base; + vki_size_t stack_size; + char *tls_base; + vki_size_t tls_size; + long *child_tid; + long *parent_tid; + int flags; + struct vki_rtprio *rtp; + void *spare[3]; +}; + +//---------------------------------------------------------------------- +// From sys/linker.h +//---------------------------------------------------------------------- + +struct vki_kld_file_stat { + int version; /* set to sizeof(struct kld_file_stat) */ + char name[MAXPATHLEN]; + int refs; + int id; + vki_caddr_t address; /* load address */ + vki_size_t size; /* size in bytes */ + char pathname[MAXPATHLEN]; +}; + + +struct vki_kld_sym_lookup { + int version; /* set to sizeof(struct kld_sym_lookup) */ + char *symname; /* Symbol name we are looking up */ + unsigned long symvalue; + vki_size_t symsize; +}; + +#if !defined(VKI_INIT_ARCH_ELF_STATE) +/* This structure is used to preserve architecture specific data during + the loading of an ELF file, throughout the checking of architecture + specific ELF headers & through to the point where the ELF load is + known to be proceeding. This implementation is a dummy for + architectures which require no specific state. */ +struct vki_arch_elf_state { +}; + +# define VKI_INIT_ARCH_ELF_STATE { } + +#endif + +//---------------------------------------------------------------------- +// From sys/caprights.h +//---------------------------------------------------------------------- + +#define VKI_CAP_RIGHTS_VERSION_00 0 +#define VKI_CAP_RIGHTS_VERSION VKI_CAP_RIGHTS_VERSION_00 + +struct vki_cap_rights { + vki_uint64_t cr_rights[VKI_CAP_RIGHTS_VERSION + 2]; +}; + +typedef struct vki_cap_rights vki_cap_rights_t; + +//---------------------------------------------------------------------- +// From ufs/ufs/quota.h +//---------------------------------------------------------------------- + +#define VKI_Q_QUOTAON 0x0100 +#define VKI_Q_QUOTAOFF 0x0200 +#define VKI_Q_GETQUOTA32 0x0300 +#define VKI_Q_SETQUOTA32 0x0400 +#define VKI_Q_SETUSE32 0x0500 +#define VKI_Q_SYNC 0x0600 +#define VKI_Q_GETQUOTA 0x0700 +#define VKI_Q_SETQUOTA 0x0800 +#define VKI_Q_SETUSE 0x0900 +#define VKI_Q_GETQUOTASIZE 0x0A00 + +//---------------------------------------------------------------------- +// From sys/_bitset.h +//---------------------------------------------------------------------- + +#define VKI_BITSET_BITS (sizeof(long) * 8) + +#define vki__howmany(x, y) (((x) + ((y) - 1)) / (y)) + +#define vki__bitset_words(_s) (vki__howmany(_s, VKI_BITSET_BITS)) + +#define VKI_BITSET_DEFINE(t, _s) \ +struct t { \ + long __bits[vki__bitset_words((_s))]; \ +} + +//---------------------------------------------------------------------- +// From sys/_domainset.h +//---------------------------------------------------------------------- + +#define VKI_DOMAINSET_MAXSIZE 256 + +#ifndef VKI_DOMAINSET_SETSIZE +#define VKI_DOMAINSET_SETSIZE VKI_DOMAINSET_MAXSIZE +#endif + +VKI_BITSET_DEFINE(vki_domainset, VKI_DOMAINSET_SETSIZE); + +typedef struct vki_domainset vki_domainset_t; + +//---------------------------------------------------------------------- +// From sys/procctl.h +//---------------------------------------------------------------------- + +#define PROC_SPROTECT 1 +#define PROC_REAP_ACQUIRE 2 +#define PROC_REAP_RELEASE 3 +#define PROC_REAP_STATUS 4 +#define PROC_REAP_GETPIDS 5 +#define PROC_REAP_KILL 6 +#define PROC_TRACE_CTL 7 +#define PROC_TRACE_STATUS 8 +#define PROC_TRAPCAP_CTL 9 +#define PROC_TRAPCAP_STATUS 10 +#define PROC_PDEATHSIG_CTL 11 +#define PROC_PDEATHSIG_STATUS 12 +#define PROC_ASLR_CTL 13 +#define PROC_ASLR_STATUS 14 +#define PROC_STACKGAP_CTL 17 +#define PROC_STACKGAP_STATUS 18 + + +struct vki_procctl_reaper_status { + u_int rs_flags; + u_int rs_children; + u_int rs_descendants; + vki_pid_t rs_reaper; + vki_pid_t rs_pid; + u_int rs_pad0[15]; +}; + +struct vki_procctl_reaper_pidinfo; + +struct vki_procctl_reaper_pids { + u_int rp_count; + u_int rp_pad0[15]; + struct vki_procctl_reaper_pidinfo *rp_pids; +}; + +struct vki_procctl_reaper_kill { + int rk_sig; + u_int rk_flags; + vki_pid_t rk_subtree; + u_int rk_killed; + vki_pid_t rk_fpid; + u_int rk_pad0[15]; +}; + +//---------------------------------------------------------------------- +// From sys/jail.h +//---------------------------------------------------------------------- + +struct vki_jail { + uint32_t version; + char *path; + char *hostname; + char *jailname; + uint32_t ip4s; + uint32_t ip6s; + struct in_addr *ip4; + struct in6_addr *ip6; +}; + + + +// See syswrap-freebsd.c PRE/POST(sys_ioctl) +#if 0 + +//---------------------------------------------------------------------- +// From sys/pciio.h +//---------------------------------------------------------------------- + +typedef unsigned long vki_u_long; +typedef unsigned int vki_u_int; +#define VKI_PCI_MAXNAMELEN 16 + +typedef enum { + VKI_PCI_GETCONF_LAST_DEVICE, + VKI_PCI_GETCONF_LIST_CHANGED, + VKI_PCI_GETCONF_MORE_DEVS, + VKI_PCI_GETCONF_ERROR +} vki_pci_getconf_status; + +typedef enum { + VKI_PCI_GETCONF_NO_MATCH = 0x0000, + VKI_PCI_GETCONF_MATCH_DOMAIN = 0x0001, + VKI_PCI_GETCONF_MATCH_BUS = 0x0002, + VKI_PCI_GETCONF_MATCH_DEV = 0x0004, + VKI_PCI_GETCONF_MATCH_FUNC = 0x0008, + VKI_PCI_GETCONF_MATCH_NAME = 0x0010, + VKI_PCI_GETCONF_MATCH_UNIT = 0x0020, + VKI_PCI_GETCONF_MATCH_VENDOR = 0x0040, + VKI_PCI_GETCONF_MATCH_DEVICE = 0x0080, + VKI_PCI_GETCONF_MATCH_CLASS = 0x0100 +} vki_pci_getconf_flags; + +struct vki_pcisel { + vki_uint32_t pc_domain; /* domain number */ + vki_uint8_t pc_bus; /* bus number */ + vki_uint8_t pc_dev; /* device on this bus */ + vki_uint8_t pc_func; /* function on this device */ +}; + +struct vki_pci_conf { + struct vki_pcisel pc_sel; /* domain+bus+slot+function */ + vki_uint8_t pc_hdr; /* PCI header type */ + vki_uint16_t pc_subvendor; /* card vendor ID */ + vki_uint16_t pc_subdevice; /* card device ID, assigned by + card vendor */ + vki_uint16_t pc_vendor; /* chip vendor ID */ + vki_uint16_t pc_device; /* chip device ID, assigned by + chip vendor */ + vki_uint8_t pc_class; /* chip PCI class */ + vki_uint8_t pc_subclass; /* chip PCI subclass */ + vki_uint8_t pc_progif; /* chip PCI programming interface */ + vki_uint8_t pc_revid; /* chip revision ID */ + char pd_name[VKI_PCI_MAXNAMELEN + 1]; /* device name */ + vki_u_long pd_unit; /* device unit number */ +}; + +struct vki_pci_match_conf { + struct vki_pcisel pc_sel; /* domain+bus+slot+function */ + char pd_name[VKI_PCI_MAXNAMELEN + 1]; /* device name */ + vki_u_long pd_unit; /* Unit number */ + vki_uint16_t pc_vendor; /* PCI Vendor ID */ + vki_uint16_t pc_device; /* PCI Device ID */ + vki_uint8_t pc_class; /* PCI class */ + vki_pci_getconf_flags flags; /* Matching expression */ +}; + +struct vki_pci_conf_io { + vki_uint32_t pat_buf_len; /* pattern buffer length */ + vki_uint32_t num_patterns; /* number of patterns */ + struct vki_pci_match_conf *patterns; /* pattern buffer */ + vki_uint32_t match_buf_len; /* match buffer length */ + vki_uint32_t num_matches; /* number of matches returned */ + struct vki_pci_conf *matches; /* match buffer */ + vki_uint32_t offset; /* offset into device list */ + vki_uint32_t generation; /* device list generation */ + vki_pci_getconf_status status; /* request status */ +}; + +#define VKI_PCIOCGETCONF _VKI_IOWR('p', 5, struct vki_pci_conf_io) + +//---------------------------------------------------------------------- +// From cam/cam.h +//---------------------------------------------------------------------- + +#define VKI_CAM_MAX_CDBLEN 16 + +typedef unsigned int vki_path_id_t; +typedef unsigned int vki_target_id_t; +typedef unsigned int vki_lun_id_t; + +typedef struct { + vki_uint32_t priority; + vki_uint32_t generation; + int index; +} vki_cam_pinfo; + + +//---------------------------------------------------------------------- +// From sys/ata.h +//---------------------------------------------------------------------- + +struct vki_ata_params { + /*000*/ vki_u_int16_t config; /* configuration info */ + /*001*/ vki_u_int16_t cylinders; /* # of cylinders */ + /*002*/ vki_u_int16_t specconf; /* specific configuration */ + /*003*/ vki_u_int16_t heads; /* # heads */ + vki_u_int16_t obsolete4; + vki_u_int16_t obsolete5; + /*006*/ vki_u_int16_t sectors; /* # sectors/track */ + /*007*/ vki_u_int16_t vendor7[3]; + /*010*/ vki_u_int8_t serial[20]; /* serial number */ + /*020*/ vki_u_int16_t retired20; + vki_u_int16_t retired21; + vki_u_int16_t obsolete22; + /*023*/ vki_u_int8_t revision[8]; /* firmware revision */ + /*027*/ vki_u_int8_t model[40]; /* model name */ + /*047*/ vki_u_int16_t sectors_intr; /* sectors per interrupt */ + /*048*/ vki_u_int16_t usedmovsd; /* double word read/write? */ + /*049*/ vki_u_int16_t capabilities1; + /*050*/ vki_u_int16_t capabilities2; + /*051*/ vki_u_int16_t retired_piomode; /* PIO modes 0-2 */ + /*052*/ vki_u_int16_t retired_dmamode; /* DMA modes */ + /*053*/ vki_u_int16_t atavalid; /* fields valid */ + /*054*/ vki_u_int16_t current_cylinders; + /*055*/ vki_u_int16_t current_heads; + /*056*/ vki_u_int16_t current_sectors; + /*057*/ vki_u_int16_t current_size_1; + /*058*/ vki_u_int16_t current_size_2; + /*059*/ vki_u_int16_t multi; + /*060*/ vki_u_int16_t lba_size_1; + vki_u_int16_t lba_size_2; + vki_u_int16_t obsolete62; + /*063*/ vki_u_int16_t mwdmamodes; /* multiword DMA modes */ + /*064*/ vki_u_int16_t apiomodes; /* advanced PIO modes */ + + /*065*/ vki_u_int16_t mwdmamin; /* min. M/W DMA time/word ns */ + /*066*/ vki_u_int16_t mwdmarec; /* rec. M/W DMA time ns */ + /*067*/ vki_u_int16_t pioblind; /* min. PIO cycle w/o flow */ + /*068*/ vki_u_int16_t pioiordy; /* min. PIO cycle IORDY flow */ + /*069*/ vki_u_int16_t support3; + vki_u_int16_t reserved70; + /*071*/ vki_u_int16_t rlsovlap; /* rel time (us) for overlap */ + /*072*/ vki_u_int16_t rlsservice; /* rel time (us) for service */ + vki_u_int16_t reserved73; + vki_u_int16_t reserved74; + /*075*/ vki_u_int16_t queue; + /*76*/ vki_u_int16_t satacapabilities; + /*77*/ vki_u_int16_t satacapabilities2; + /*78*/ vki_u_int16_t satasupport; + /*79*/ vki_u_int16_t sataenabled; + /*080*/ vki_u_int16_t version_major; + /*081*/ vki_u_int16_t version_minor; + + struct { + /*082/085*/ vki_u_int16_t command1; + /*083/086*/ vki_u_int16_t command2; + /*084/087*/ vki_u_int16_t extension; + } __packed support, enabled; + + /*088*/ vki_u_int16_t udmamodes; /* UltraDMA modes */ + /*089*/ vki_u_int16_t erase_time; + /*090*/ vki_u_int16_t enhanced_erase_time; + /*091*/ vki_u_int16_t apm_value; + /*092*/ vki_u_int16_t master_passwd_revision; + /*093*/ vki_u_int16_t hwres; + /*094*/ vki_u_int16_t acoustic; + /*095*/ vki_u_int16_t stream_min_req_size; + /*096*/ vki_u_int16_t stream_transfer_time; + /*097*/ vki_u_int16_t stream_access_latency; + /*098*/ vki_u_int32_t stream_granularity; + /*100*/ vki_u_int16_t lba_size48_1; + vki_u_int16_t lba_size48_2; + vki_u_int16_t lba_size48_3; + vki_u_int16_t lba_size48_4; + vki_u_int16_t reserved104; + /*105*/ vki_u_int16_t max_dsm_blocks; + /*106*/ vki_u_int16_t pss; + /*107*/ vki_u_int16_t isd; + /*108*/ vki_u_int16_t wwn[4]; + vki_u_int16_t reserved112[5]; + /*117*/ vki_u_int16_t lss_1; + /*118*/ vki_u_int16_t lss_2; + /*119*/ vki_u_int16_t support2; + /*120*/ vki_u_int16_t enabled2; + vki_u_int16_t reserved121[6]; + /*127*/ vki_u_int16_t removable_status; + /*128*/ vki_u_int16_t security_status; + vki_u_int16_t reserved129[31]; + /*160*/ vki_u_int16_t cfa_powermode1; + vki_u_int16_t reserved161; + /*162*/ vki_u_int16_t cfa_kms_support; + /*163*/ vki_u_int16_t cfa_trueide_modes; + /*164*/ vki_u_int16_t cfa_memory_modes; + vki_u_int16_t reserved165[4]; + /*169*/ vki_u_int16_t support_dsm; + vki_u_int16_t reserved170[6]; + /*176*/ vki_u_int8_t media_serial[60]; + /*206*/ vki_u_int16_t sct; + vki_u_int16_t reserved206[2]; + /*209*/ vki_u_int16_t lsalign; + /*210*/ vki_u_int16_t wrv_sectors_m3_1; + vki_u_int16_t wrv_sectors_m3_2; + /*212*/ vki_u_int16_t wrv_sectors_m2_1; + vki_u_int16_t wrv_sectors_m2_2; + /*214*/ vki_u_int16_t nv_cache_caps; + /*215*/ vki_u_int16_t nv_cache_size_1; + vki_u_int16_t nv_cache_size_2; + /*217*/ vki_u_int16_t media_rotation_rate; + vki_u_int16_t reserved218; + /*219*/ vki_u_int16_t nv_cache_opt; + /*220*/ vki_u_int16_t wrv_mode; + vki_u_int16_t reserved221; + /*222*/ vki_u_int16_t transport_major; + /*223*/ vki_u_int16_t transport_minor; + vki_u_int16_t reserved224[31]; + /*255*/ vki_u_int16_t integrity; +} __packed; + +//---------------------------------------------------------------------- +// From sys/callout.h +//---------------------------------------------------------------------- + +struct vki_callout_handle { + struct vki_callout *callout; +}; + + +//---------------------------------------------------------------------- +// From cam/scsi/scsi_all.h +//---------------------------------------------------------------------- + +struct vki_scsi_sense_data { + vki_u_int8_t error_code; + vki_u_int8_t segment; + vki_u_int8_t flags; + vki_u_int8_t info[4]; + vki_u_int8_t extra_len; + vki_u_int8_t cmd_spec_info[4]; + vki_u_int8_t add_sense_code; + vki_u_int8_t add_sense_code_qual; + vki_u_int8_t fru; + vki_u_int8_t sense_key_spec[3]; + vki_u_int8_t extra_bytes[14]; +#define VKI_SSD_FULL_SIZE sizeof(struct vki_scsi_sense_data) +}; + +struct vki_scsi_inquiry_data { + vki_uint8_t device; + vki_uint8_t dev_qual2; + vki_uint8_t version; + vki_uint8_t response_format; + vki_uint8_t additional_length; + vki_uint8_t spc3_flags; + vki_uint8_t spc2_flags; + vki_uint8_t flags; +#define VKI_SID_VENDOR_SIZE 8 + char vendor[VKI_SID_VENDOR_SIZE]; +#define VKI_SID_PRODUCT_SIZE 16 + char product[VKI_SID_PRODUCT_SIZE]; +#define VKI_SID_REVISION_SIZE 4 + char revision[VKI_SID_REVISION_SIZE]; +#define VKI_SID_VENDOR_SPECIFIC_0_SIZE 20 + vki_uint8_t vendor_specific0[VKI_SID_VENDOR_SPECIFIC_0_SIZE]; + vki_uint8_t spi3data; + vki_uint8_t reserved2; + /* + * Version Descriptors, stored 2 byte values. + */ + vki_uint8_t version1[2]; + vki_uint8_t version2[2]; + vki_uint8_t version3[2]; + vki_uint8_t version4[2]; + vki_uint8_t version5[2]; + vki_uint8_t version6[2]; + vki_uint8_t version7[2]; + vki_uint8_t version8[2]; + + vki_uint8_t reserved3[22]; + +#define VKI_SID_VENDOR_SPECIFIC_1_SIZE 160 + vki_uint8_t vendor_specific1[VKI_SID_VENDOR_SPECIFIC_1_SIZE]; +}; + +//---------------------------------------------------------------------- +// From sys/queue.h +//---------------------------------------------------------------------- + +#define SLIST_ENTRY(type) \ +struct { \ + struct type *sle_next; /* next element */ \ +} + +#define LIST_ENTRY(type) \ +struct { \ + struct type *le_next; /* next element */ \ + struct type **le_prev; /* address of previous next element */ \ +} + +#define STAILQ_ENTRY(type) \ +struct { \ + struct type *stqe_next; /* next element */ \ +} + +struct qm_trace { + unsigned long lastline; + unsigned long prevline; + const char *lastfile; + const char *prevfile; +}; + +#define TRACEBUF struct qm_trace trace; + +#define TAILQ_ENTRY(type) \ +struct { \ + struct type *tqe_next; /* next element */ \ + struct type **tqe_prev; /* address of previous next element */ \ + TRACEBUF \ +} + + +//---------------------------------------------------------------------- +// From cam/cam_ccb.h +//---------------------------------------------------------------------- + +#define VKI_CAM_VERSION 0x15 /* Hex value for current version */ + +typedef union { + LIST_ENTRY(vki_ccb_hdr) le; + SLIST_ENTRY(vki_ccb_hdr) sle; + TAILQ_ENTRY(vki_ccb_hdr) tqe; + STAILQ_ENTRY(vki_ccb_hdr) stqe; +} vki_camq_entry; + +typedef enum { + /* Function code flags are bits greater than 0xff */ + VKI_XPT_FC_QUEUED = 0x100, + /* Non-immediate function code */ + VKI_XPT_FC_USER_CCB = 0x200, + VKI_XPT_FC_XPT_ONLY = 0x400, + /* Only for the transport layer device */ + VKI_XPT_FC_DEV_QUEUED = 0x800 | VKI_XPT_FC_QUEUED, + /* Passes through the device queues */ + /* Common function commands: 0x00->0x0F */ + VKI_XPT_NOOP = 0x00, + /* Execute Nothing */ + VKI_XPT_SCSI_IO = 0x01 | VKI_XPT_FC_DEV_QUEUED, + /* Execute the requested I/O operation */ + VKI_XPT_GDEV_TYPE = 0x02, + /* Get type information for specified device */ + VKI_XPT_GDEVLIST = 0x03, + /* Get a list of peripheral devices */ + VKI_XPT_PATH_INQ = 0x04, + /* Path routing inquiry */ + VKI_XPT_REL_SIMQ = 0x05, + /* Release a frozen device queue */ + VKI_XPT_SASYNC_CB = 0x06, + /* Set Asynchronous Callback Parameters */ + VKI_XPT_SDEV_TYPE = 0x07, + /* Set device type information */ + VKI_XPT_SCAN_BUS = 0x08 | VKI_XPT_FC_QUEUED | VKI_XPT_FC_USER_CCB + | VKI_XPT_FC_XPT_ONLY, + /* (Re)Scan the SCSI Bus */ + VKI_XPT_DEV_MATCH = 0x09 | VKI_XPT_FC_XPT_ONLY, + /* Get EDT entries matching the given pattern */ + VKI_XPT_DEBUG = 0x0a, + /* Turn on debugging for a bus, target or lun */ + VKI_XPT_PATH_STATS = 0x0b, + /* Path statistics (error counts, etc.) */ + VKI_XPT_GDEV_STATS = 0x0c, + /* Device statistics (error counts, etc.) */ + VKI_XPT_FREEZE_QUEUE = 0x0d, + /* Freeze device queue */ + /* SCSI Control Functions: 0x10->0x1F */ + VKI_XPT_ABORT = 0x10, + /* Abort the specified CCB */ + VKI_XPT_RESET_BUS = 0x11 | VKI_XPT_FC_XPT_ONLY, + /* Reset the specified SCSI bus */ + VKI_XPT_RESET_DEV = 0x12 | VKI_XPT_FC_DEV_QUEUED, + /* Bus Device Reset the specified SCSI device */ + VKI_XPT_TERM_IO = 0x13, + /* Terminate the I/O process */ + VKI_XPT_SCAN_LUN = 0x14 | VKI_XPT_FC_QUEUED | VKI_XPT_FC_USER_CCB + | VKI_XPT_FC_XPT_ONLY, + /* Scan Logical Unit */ + VKI_XPT_GET_TRAN_SETTINGS = 0x15, + /* + * Get default/user transfer settings + * for the target + */ + VKI_XPT_SET_TRAN_SETTINGS = 0x16, + /* + * Set transfer rate/width + * negotiation settings + */ + VKI_XPT_CALC_GEOMETRY = 0x17, + /* + * Calculate the geometry parameters for + * a device give the sector size and + * volume size. + */ + VKI_XPT_ATA_IO = 0x18 | VKI_XPT_FC_DEV_QUEUED, + /* Execute the requested ATA I/O operation */ + VKI_XPT_GET_SIM_KNOB = 0x18, + /* + * Get SIM specific knob values. + */ + + VKI_XPT_SET_SIM_KNOB = 0x19, + /* + * Set SIM specific knob values. + */ + /* HBA engine commands 0x20->0x2F */ + VKI_XPT_ENG_INQ = 0x20 | VKI_XPT_FC_XPT_ONLY, + /* HBA engine feature inquiry */ + VKI_XPT_ENG_EXEC = 0x21 | VKI_XPT_FC_DEV_QUEUED, + /* HBA execute engine request */ + + /* Target mode commands: 0x30->0x3F */ + VKI_XPT_EN_LUN = 0x30, + /* Enable LUN as a target */ + VKI_XPT_TARGET_IO = 0x31 | VKI_XPT_FC_DEV_QUEUED, + /* Execute target I/O request */ + VKI_XPT_ACCEPT_TARGET_IO = 0x32 | VKI_XPT_FC_QUEUED | VKI_XPT_FC_USER_CCB, + /* Accept Host Target Mode CDB */ + VKI_XPT_CONT_TARGET_IO = 0x33 | VKI_XPT_FC_DEV_QUEUED, + /* Continue Host Target I/O Connection */ + VKI_XPT_IMMED_NOTIFY = 0x34 | VKI_XPT_FC_QUEUED | VKI_XPT_FC_USER_CCB, + /* Notify Host Target driver of event (obsolete) */ + VKI_XPT_NOTIFY_ACK = 0x35, + /* Acknowledgement of event (obsolete) */ + VKI_XPT_IMMEDIATE_NOTIFY = 0x36 | VKI_XPT_FC_QUEUED | VKI_XPT_FC_USER_CCB, + /* Notify Host Target driver of event */ + VKI_XPT_NOTIFY_ACKNOWLEDGE = 0x37 | VKI_XPT_FC_QUEUED | VKI_XPT_FC_USER_CCB, + /* Acknowledgement of event */ + + /* Vendor Unique codes: 0x80->0x8F */ + VKI_XPT_VUNIQUE = 0x80 +} vki_xpt_opcode; + + +/* CAM CCB flags */ +typedef enum { + VKI_CAM_CDB_POINTER = 0x00000001,/* The CDB field is a pointer */ + VKI_CAM_QUEUE_ENABLE = 0x00000002,/* SIM queue actions are enabled */ + VKI_CAM_CDB_LINKED = 0x00000004,/* CCB contains a linked CDB */ + VKI_CAM_NEGOTIATE = 0x00000008,/* + * Perform transport negotiation + * with this command. + */ + VKI_CAM_SCATTER_VALID = 0x00000010,/* Scatter/gather list is valid */ + VKI_CAM_DIS_AUTOSENSE = 0x00000020,/* Disable autosense feature */ + VKI_CAM_DIR_RESV = 0x00000000,/* Data direction (00:reserved) */ + VKI_CAM_DIR_IN = 0x00000040,/* Data direction (01:DATA IN) */ + VKI_CAM_DIR_OUT = 0x00000080,/* Data direction (10:DATA OUT) */ + VKI_CAM_DIR_NONE = 0x000000C0,/* Data direction (11:no data) */ + VKI_CAM_DIR_MASK = 0x000000C0,/* Data direction Mask */ + VKI_CAM_SOFT_RST_OP = 0x00000100,/* Use Soft reset alternative */ + VKI_CAM_ENG_SYNC = 0x00000200,/* Flush resid bytes on complete */ + VKI_CAM_DEV_QFRZDIS = 0x00000400,/* Disable DEV Q freezing */ + VKI_CAM_DEV_QFREEZE = 0x00000800,/* Freeze DEV Q on execution */ + VKI_CAM_HIGH_POWER = 0x00001000,/* Command takes a lot of power */ + VKI_CAM_SENSE_PTR = 0x00002000,/* Sense data is a pointer */ + VKI_CAM_SENSE_PHYS = 0x00004000,/* Sense pointer is physical addr*/ + VKI_CAM_TAG_ACTION_VALID = 0x00008000,/* Use the tag action in this ccb*/ + VKI_CAM_PASS_ERR_RECOVER = 0x00010000,/* Pass driver does err. recovery*/ + VKI_CAM_DIS_DISCONNECT = 0x00020000,/* Disable disconnect */ + VKI_CAM_SG_LIST_PHYS = 0x00040000,/* SG list has physical addrs. */ + VKI_CAM_MSG_BUF_PHYS = 0x00080000,/* Message buffer ptr is physical*/ + VKI_CAM_SNS_BUF_PHYS = 0x00100000,/* Autosense data ptr is physical*/ + VKI_CAM_DATA_PHYS = 0x00200000,/* SG/Buffer data ptrs are phys. */ + VKI_CAM_CDB_PHYS = 0x00400000,/* CDB poiner is physical */ + VKI_CAM_ENG_SGLIST = 0x00800000,/* SG list is for the HBA engine */ + + /* Phase cognizant mode flags */ + VKI_CAM_DIS_AUTOSRP = 0x01000000,/* Disable autosave/restore ptrs */ + VKI_CAM_DIS_AUTODISC = 0x02000000,/* Disable auto disconnect */ + VKI_CAM_TGT_CCB_AVAIL = 0x04000000,/* Target CCB available */ + VKI_CAM_TGT_PHASE_MODE = 0x08000000,/* The SIM runs in phase mode */ + VKI_CAM_MSGB_VALID = 0x10000000,/* Message buffer valid */ + VKI_CAM_STATUS_VALID = 0x20000000,/* Status buffer valid */ + VKI_CAM_DATAB_VALID = 0x40000000,/* Data buffer valid */ + + /* Host target Mode flags */ + VKI_CAM_SEND_SENSE = 0x08000000,/* Send sense data with status */ + VKI_CAM_TERM_IO = 0x10000000,/* Terminate I/O Message sup. */ + VKI_CAM_DISCONNECT = 0x20000000,/* Disconnects are mandatory */ + VKI_CAM_SEND_STATUS = 0x40000000 /* Send status after data phase */ +} vki_ccb_flags; + +typedef union { + void *ptr; + vki_u_long field; + vki_uint8_t bytes[sizeof(vki_uintptr_t)]; +} vki_ccb_priv_entry; + +#define VKI_IOCDBLEN VKI_CAM_MAX_CDBLEN /* Space for CDB bytes/pointer */ +#define VKI_CCB_PERIPH_PRIV_SIZE 2 /* size of peripheral private area */ +#define VKI_CCB_SIM_PRIV_SIZE 2 /* size of sim private area */ + +typedef union { + vki_ccb_priv_entry entries[VKI_CCB_PERIPH_PRIV_SIZE]; + vki_uint8_t bytes[VKI_CCB_PERIPH_PRIV_SIZE * sizeof(vki_ccb_priv_entry)]; +} vki_ccb_ppriv_area; + +typedef union { + vki_ccb_priv_entry entries[VKI_CCB_SIM_PRIV_SIZE]; + vki_uint8_t bytes[VKI_CCB_SIM_PRIV_SIZE * sizeof(vki_ccb_priv_entry)]; +} vki_ccb_spriv_area; + +union vki_ccb; +struct vki_cam_periph; + +struct vki_ccb_hdr { + vki_cam_pinfo pinfo; /* Info for priority scheduling */ + vki_camq_entry xpt_links; /* For chaining in the XPT layer */ + vki_camq_entry sim_links; /* For chaining in the SIM layer */ + vki_camq_entry periph_links; /* For chaining in the type driver */ + vki_uint32_t retry_count; + void (*cbfcnp)(struct vki_cam_periph *, union vki_ccb *); + /* Callback on completion function */ + vki_xpt_opcode func_code; /* XPT function code */ + vki_uint32_t status; /* Status returned by CAM subsystem */ + struct vki_cam_path *path; /* Compiled path for this ccb */ + vki_path_id_t path_id; /* Path ID for the request */ + vki_target_id_t target_id; /* Target device ID */ + vki_lun_id_t target_lun; /* Target LUN number */ + vki_uint32_t flags; /* ccb_flags */ + vki_ccb_ppriv_area periph_priv; + vki_ccb_spriv_area sim_priv; + vki_uint32_t timeout; /* Timeout value */ + + /* + * Deprecated, only for use by non-MPSAFE SIMs. All others must + * allocate and initialize their own callout storage. + */ + struct vki_callout_handle timeout_ch; +}; + +typedef union { + vki_u_int8_t *cdb_ptr; /* Pointer to the CDB bytes to send */ + /* Area for the CDB send */ + vki_u_int8_t cdb_bytes[VKI_IOCDBLEN]; +} vki_cdb_t; + + +/* + * SCSI I/O Request CCB used for the XPT_SCSI_IO and XPT_CONT_TARGET_IO + * function codes. + */ +struct vki_ccb_scsiio { + struct vki_ccb_hdr ccb_h; + union vki_ccb *next_ccb; /* Ptr for next CCB for action */ + vki_u_int8_t *req_map; /* Ptr to mapping info */ + vki_u_int8_t *data_ptr; /* Ptr to the data buf/SG list */ + vki_u_int32_t dxfer_len; /* Data transfer length */ + /* Autosense storage */ + struct vki_scsi_sense_data sense_data; + vki_u_int8_t sense_len; /* Number of bytes to autosense */ + vki_u_int8_t cdb_len; /* Number of bytes for the CDB */ + vki_u_int16_t sglist_cnt; /* Number of SG list entries */ + vki_u_int8_t scsi_status; /* Returned SCSI status */ + vki_u_int8_t sense_resid; /* Autosense resid length: 2's comp */ + vki_u_int32_t resid; /* Transfer residual length: 2's comp */ + vki_cdb_t cdb_io; /* Union for CDB bytes/pointer */ + vki_u_int8_t *msg_ptr; /* Pointer to the message buffer */ + vki_u_int16_t msg_len; /* Number of bytes for the Message */ + vki_u_int8_t tag_action; /* What to do for tag queueing */ + /* + * The tag action should be either the define below (to send a + * non-tagged transaction) or one of the defined scsi tag messages + * from scsi_message.h. + */ + vki_u_int tag_id; /* tag id from initator (target mode) */ + vki_u_int init_id; /* initiator id of who selected */ +}; + +typedef enum { + VKI_CAM_DEV_MATCH_LAST, + VKI_CAM_DEV_MATCH_MORE, + VKI_CAM_DEV_MATCH_LIST_CHANGED, + VKI_CAM_DEV_MATCH_SIZE_ERROR, + VKI_CAM_DEV_MATCH_ERROR +} vki_ccb_dev_match_status; + + +struct vki_dev_match_pattern; + +typedef enum { + VKI_DEV_MATCH_PERIPH, + VKI_DEV_MATCH_DEVICE, + VKI_DEV_MATCH_BUS +} vki_dev_match_type; + +#define VKI_DEV_IDLEN 16 /* ASCII string len for device names */ + +struct vki_periph_match_result { + char periph_name[VKI_DEV_IDLEN]; + vki_uint32_t unit_number; + vki_path_id_t path_id; + vki_target_id_t target_id; + vki_lun_id_t target_lun; +}; + +typedef enum { + VKI_PROTO_UNKNOWN, + VKI_PROTO_UNSPECIFIED, + VKI_PROTO_SCSI, /* Small Computer System Interface */ + VKI_PROTO_ATA, /* AT Attachment */ + VKI_PROTO_ATAPI, /* AT Attachment Packetized Interface */ + VKI_PROTO_SATAPM, /* SATA Port Multiplier */ +} vki_cam_proto; + +typedef enum { + VKI_DEV_RESULT_NOFLAG = 0x00, + VKI_DEV_RESULT_UNCONFIGURED = 0x01 +} vki_dev_result_flags; + + +struct vki_device_match_result { + vki_path_id_t path_id; + vki_target_id_t target_id; + vki_lun_id_t target_lun; + vki_cam_proto protocol; + struct vki_scsi_inquiry_data inq_data; + struct vki_ata_params ident_data; + vki_dev_result_flags flags; +}; + +struct vki_bus_match_result { + vki_path_id_t path_id; + char dev_name[VKI_DEV_IDLEN]; + vki_uint32_t unit_number; + vki_uint32_t bus_id; +}; + +union vki_match_result { + struct vki_periph_match_result periph_result; + struct vki_device_match_result device_result; + struct vki_bus_match_result bus_result; +}; + +struct vki_dev_match_result { + vki_dev_match_type type; + union vki_match_result result; +}; + +typedef enum { + VKI_CAM_DEV_POS_NONE = 0x000, + VKI_CAM_DEV_POS_BUS = 0x001, + VKI_CAM_DEV_POS_TARGET = 0x002, + VKI_CAM_DEV_POS_DEVICE = 0x004, + VKI_CAM_DEV_POS_PERIPH = 0x008, + VKI_CAM_DEV_POS_PDPTR = 0x010, + VKI_CAM_DEV_POS_TYPEMASK = 0xf00, + VKI_CAM_DEV_POS_EDT = 0x100, + VKI_CAM_DEV_POS_PDRV = 0x200 +} vki_dev_pos_type; + +struct vki_ccb_dm_cookie { + void *bus; + void *target; + void *device; + void *periph; + void *pdrv; +}; + +struct vki_ccb_dev_position { + vki_u_int generations[4]; +#define VKI_CAM_BUS_GENERATION 0x00 +#define VKI_CAM_TARGET_GENERATION 0x01 +#define VKI_CAM_DEV_GENERATION 0x02 +#define VKI_CAM_PERIPH_GENERATION 0x03 + vki_dev_pos_type position_type; + struct vki_ccb_dm_cookie cookie; +}; + +struct vki_ccb_dev_match { + struct vki_ccb_hdr ccb_h; + vki_ccb_dev_match_status status; + vki_uint32_t num_patterns; + vki_uint32_t pattern_buf_len; + struct vki_dev_match_pattern *patterns; + vki_uint32_t num_matches; + vki_uint32_t match_buf_len; + struct vki_dev_match_result *matches; + struct vki_ccb_dev_position pos; +}; + +/* + * Union of all CCB types for kernel space allocation. This union should + * never be used for manipulating CCBs - its only use is for the allocation + * and deallocation of raw CCB space and is the return type of xpt_ccb_alloc + * and the argument to xpt_ccb_free. + */ +union vki_ccb { + /* Only letting out ones currently handled */ + struct vki_ccb_hdr ccb_h; /* For convenience */ + struct vki_ccb_scsiio csio; +#if 0 + struct ccb_getdev cgd; + struct ccb_getdevlist cgdl; + struct ccb_pathinq cpi; + struct ccb_relsim crs; + struct ccb_setasync csa; + struct ccb_setdev csd; + struct ccb_pathstats cpis; + struct ccb_getdevstats cgds; +#endif + struct vki_ccb_dev_match cdm; +#if 0 + struct ccb_trans_settings cts; + struct ccb_calc_geometry ccg; + struct ccb_sim_knob knob; + struct ccb_abort cab; + struct ccb_resetbus crb; + struct ccb_resetdev crd; + struct ccb_termio tio; + struct ccb_accept_tio atio; + struct ccb_scsiio ctio; + struct ccb_en_lun cel; + struct ccb_immed_notify cin; + struct ccb_notify_ack cna; + struct ccb_immediate_notify cin1; + struct ccb_notify_acknowledge cna2; + struct ccb_eng_inq cei; + struct ccb_eng_exec cee; + struct ccb_rescan crcn; + struct ccb_debug cdbg; + struct ccb_ataio ataio; +#endif + char make_union_right_size[0x4A8]; +}; + +#define VKI_CAMIOCOMMAND _VKI_IOWR(VKI_CAM_VERSION, 2, union vki_ccb) + +#endif +/*--------------------------------------------------------------------*/ +/*--- end ---*/ +/*--------------------------------------------------------------------*/ diff --git a/include/vki/vki-machine-types-amd64-freebsd.h b/include/vki/vki-machine-types-amd64-freebsd.h new file mode 100644 index 0000000000..db408de703 --- /dev/null +++ b/include/vki/vki-machine-types-amd64-freebsd.h @@ -0,0 +1,75 @@ + +/*--------------------------------------------------------------------*/ +/*--- x86/FreeBSD-specific kernel interface: posix types. ---*/ +/*--- vki_posixtypes-x86-freebsd.h ---*/ +/*--------------------------------------------------------------------*/ + +/* + This file is part of Valgrind, a dynamic binary instrumentation + framework. + + Copyright (C) 2000-2005 Julian Seward + jseward@acm.org + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, see . + + The GNU General Public License is contained in the file COPYING. +*/ + +#ifndef VKI_MACHINE_TYPES_AMD64_FREEBSD_H +#define VKI_MACHINE_TYPES_AMD64_FREEBSD_H + +//---------------------------------------------------------------------- +// From sys/i386/include/_types.h +//---------------------------------------------------------------------- + +typedef __signed char vki_int8_t; +typedef unsigned char vki_uint8_t; +typedef short vki_int16_t; +typedef unsigned short vki_uint16_t; +typedef int vki_int32_t; +typedef unsigned int vki_uint32_t; +typedef long vki_int64_t; +typedef unsigned long vki_uint64_t; +typedef unsigned long vki_uintptr_t; +typedef long vki_intptr_t; + + +typedef unsigned int __vki_clock_t; +typedef unsigned int __vki_cpumask_t; +typedef char * __vki_caddr_t; /* QQQ 32 on 64 */ +typedef double __vki_double_t; +typedef double __vki_float_t; +typedef vki_int64_t __vki_intfptr_t; +typedef vki_int64_t __vki_intmax_t; +typedef vki_int64_t __vki_ptrdiff_t; +typedef vki_int64_t __vki_register_t; +typedef vki_int64_t __vki_segsz_t; +typedef vki_uint64_t __vki_size_t; +typedef vki_int64_t __vki_ssize_t; +typedef vki_int64_t __vki_time_t; +typedef vki_uint64_t __vki_uintfptr_t; +typedef vki_uint64_t __vki_uintmax_t; +typedef vki_uint64_t __vki_u_register_t; +typedef vki_uint64_t __vki_vm_offset_t; +typedef vki_int64_t __vki_vm_ooffset_t; +typedef vki_uint64_t __vki_vm_paddr_t; /* QQQ int64 for PAE */ +typedef vki_uint64_t __vki_vm_pindex_t; +typedef vki_uint64_t __vki_vm_size_t; + +#endif // VKI_MACHINE_TYPES_AMD64_FREEBSD_H + +/*--------------------------------------------------------------------*/ +/*--- end ---*/ +/*--------------------------------------------------------------------*/ diff --git a/include/vki/vki-machine-types-x86-freebsd.h b/include/vki/vki-machine-types-x86-freebsd.h new file mode 100644 index 0000000000..4906be7210 --- /dev/null +++ b/include/vki/vki-machine-types-x86-freebsd.h @@ -0,0 +1,75 @@ + +/*--------------------------------------------------------------------*/ +/*--- x86/FreeBSD-specific kernel interface: posix types. ---*/ +/*--- vki_posixtypes-x86-freebsd.h ---*/ +/*--------------------------------------------------------------------*/ + +/* + This file is part of Valgrind, a dynamic binary instrumentation + framework. + + Copyright (C) 2000-2005 Julian Seward + jseward@acm.org + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, see . + + The GNU General Public License is contained in the file COPYING. +*/ + +#ifndef __VKI_MACHINE_TYPES_X86_FREEBSD_H +#define __VKI_MACHINE_TYPES_X86_FREEBSD_H + +//---------------------------------------------------------------------- +// From sys/i386/include/_types.h +//---------------------------------------------------------------------- + +typedef __signed char vki_int8_t; +typedef unsigned char vki_uint8_t; +typedef short vki_int16_t; +typedef unsigned short vki_uint16_t; +typedef int vki_int32_t; +typedef unsigned int vki_uint32_t; +typedef long long vki_int64_t; +typedef unsigned long long vki_uint64_t; +typedef unsigned int vki_uintptr_t; +typedef int vki_intptr_t; + + +typedef unsigned long __vki_clock_t; +typedef unsigned int __vki_cpumask_t; +typedef char * __vki_caddr_t; /* QQQ 32 on 64 */ +typedef double __vki_double_t; +typedef double __vki_float_t; +typedef vki_int32_t __vki_intfptr_t; +typedef vki_int64_t __vki_intmax_t; +typedef vki_int32_t __vki_ptrdiff_t; +typedef vki_int32_t __vki_register_t; +typedef vki_int32_t __vki_segsz_t; +typedef vki_uint32_t __vki_size_t; +typedef vki_int32_t __vki_ssize_t; +typedef vki_int32_t __vki_time_t; +typedef vki_uint32_t __vki_uintfptr_t; +typedef vki_uint64_t __vki_uintmax_t; +typedef vki_uint32_t __vki_u_register_t; +typedef vki_uint32_t __vki_vm_offset_t; +typedef vki_int64_t __vki_vm_ooffset_t; +typedef vki_uint32_t __vki_vm_paddr_t; /* QQQ int64 for PAE */ +typedef vki_uint64_t __vki_vm_pindex_t; +typedef vki_uint32_t __vki_vm_size_t; + +#endif // __VKI_MACHINE_TYPES_X86_FREEBSD_H + +/*--------------------------------------------------------------------*/ +/*--- end ---*/ +/*--------------------------------------------------------------------*/ diff --git a/include/vki/vki-scnums-freebsd.h b/include/vki/vki-scnums-freebsd.h new file mode 100644 index 0000000000..cac88ba8c1 --- /dev/null +++ b/include/vki/vki-scnums-freebsd.h @@ -0,0 +1,657 @@ + +/* + This file is part of Valgrind, a dynamic binary instrumentation + framework. + + Copyright (C) 2000-2005 Julian Seward + jseward@acm.org + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, see . + + The GNU General Public License is contained in the file COPYING. +*/ + +#ifndef VKI_UNISTD_FREEBSD_H +#define VKI_UNISTD_FREEBSD_H + +#include "config.h" + +#define VG_FREEBSD_SYSCALL_STD 0 +#define VG_FREEBSD_SYSCALL0 1 +#define VG_FREEBSD_SYSCALL198 2 + +// From sys/syscall.h + +// @todo PJF ugly leading double underscores +// and why use the Linux style when FreeBSD uses SYS_[name]? +// I suppose that makes the generic code easier + +#define __NR_syscall 0 +#define __NR_exit 1 +#define __NR_fork 2 +#define __NR_read 3 +#define __NR_write 4 +#define __NR_open 5 +#define __NR_close 6 +#define __NR_wait4 7 +/* old creat 8 */ +#define __NR_link 9 +#define __NR_unlink 10 +/* obs execv 11 */ +#define __NR_chdir 12 +#define __NR_fchdir 13 +#define __NR_freebsd11_mknod 14 +#define __NR_chmod 15 +#define __NR_chown 16 +#define __NR_break 17 +/* freebsd4 getfsstat 18 */ +/* old lseek 19 */ +#define __NR_getpid 20 +#define __NR_mount 21 +#define __NR_unmount 22 +#define __NR_setuid 23 +#define __NR_getuid 24 +#define __NR_geteuid 25 +#define __NR_ptrace 26 +#define __NR_recvmsg 27 +#define __NR_sendmsg 28 +#define __NR_recvfrom 29 +#define __NR_accept 30 +#define __NR_getpeername 31 +#define __NR_getsockname 32 +#define __NR_access 33 +#define __NR_chflags 34 +#define __NR_fchflags 35 +#define __NR_sync 36 +#define __NR_kill 37 +/* old stat 38 */ +#define __NR_getppid 39 +/* old lstat 40 */ +#define __NR_dup 41 +#define __NR_freebsd10_pipe 42 +#define __NR_getegid 43 +#define __NR_profil 44 +#define __NR_ktrace 45 +/* old sigaction 46 */ +#define __NR_getgid 47 +/* old sigprocmask 48 */ +#define __NR_getlogin 49 +#define __NR_setlogin 50 +#define __NR_acct 51 +/* old sigpending 52 */ +#define __NR_sigaltstack 53 +#define __NR_ioctl 54 +#define __NR_reboot 55 +#define __NR_revoke 56 +#define __NR_symlink 57 +#define __NR_readlink 58 +#define __NR_execve 59 +#define __NR_umask 60 +#define __NR_chroot 61 +/* old fstat 62 */ +/* old getkerninfo 63 */ +/* old getpagesize 64 */ +#define __NR_msync 65 +#define __NR_vfork 66 +/* obs vread 67 */ +/* obs vwrite 68 */ +#define __NR_sbrk 69 +#define __NR_sstk 70 +/* old mmap 71 */ +#define __NR_vadvise 72 +#define __NR_munmap 73 +#define __NR_mprotect 74 +#define __NR_madvise 75 +/* obs vhangup 76 */ +/* obs vlimit 77 */ +#define __NR_mincore 78 +#define __NR_getgroups 79 +#define __NR_setgroups 80 +#define __NR_getpgrp 81 +#define __NR_setpgid 82 +#define __NR_setitimer 83 +#define __NR_swapon 85 +#define __NR_getitimer 86 +/* old gethostname 87 */ +/* old sethostname 88 */ +#define __NR_getdtablesize 89 +#define __NR_dup2 90 +#define __NR_fcntl 92 +#define __NR_select 93 +#define __NR_fsync 95 +#define __NR_setpriority 96 +#define __NR_socket 97 +#define __NR_connect 98 +/* old accept 99 */ +#define __NR_getpriority 100 +/* old send 101 */ +/* old recv 102 */ +/* old sigreturn 103 */ +#define __NR_bind 104 +#define __NR_setsockopt 105 +#define __NR_listen 106 +/* obs vtimes 107 */ +/* old sigvec 108 */ +/* old sigblock 109 */ +/* old sigsetmask 110 */ +/* old sigsuspend 111 */ +/* old sigstack 112 */ +/* old recvmsg 113 */ +/* old sendmsg 114 */ +/* obs vtrace 115 */ +#define __NR_gettimeofday 116 +#define __NR_getrusage 117 +#define __NR_getsockopt 118 +#define __NR_readv 120 +#define __NR_writev 121 +#define __NR_settimeofday 122 +#define __NR_fchown 123 +#define __NR_fchmod 124 +#define __NR_setreuid 126 +#define __NR_setregid 127 +#define __NR_rename 128 +#define __NR_flock 131 +#define __NR_mkfifo 132 +#define __NR_sendto 133 +#define __NR_shutdown 134 +#define __NR_socketpair 135 +#define __NR_mkdir 136 +#define __NR_rmdir 137 +#define __NR_utimes 138 +/* obs freebsd sigreturn 139 */ +#define __NR_adjtime 140 +/* old getpeername 141 */ +/* old gethostid 142 */ +/* old sethostid 143 */ +/* old getrlimit 144 */ +/* old setrlimit 145 */ +/* old killpg 146 */ +#define __NR_setsid 147 +#define __NR_quotactl 148 +/* old quota 149 */ +/* old getsockname 150 */ +#define __NR_nlm_syscall 154 +#define __NR_nfssvc 155 +/* old getdirentries 156 */ + +#if (FREEBSD_VERS <= FREEBSD_10) +// these were removed in FreeBSD 11 +#define __NR_freebsd4_statfs 157 +#define __NR_freebsd4_fstatfs 158 +#endif +#define __NR_lgetfh 160 +#define __NR_getfh 161 + +#if (FREEBSD_VERS <= FREEBSD_10) +#define __NR_freebsd4_getdomainname 162 +#define __NR_freebsd4_setdomainname 163 +#define __NR_freebsd4_uname 164 +#endif + +#define __NR_sysarch 165 +#define __NR_rtprio 166 +#define __NR_semsys 169 +#define __NR_msgsys 170 +#define __NR_shmsys 171 +#if (FREEBSD_VERS <= FREEBSD_10) +#define __NR_freebsd6_pread 173 +#define __NR_freebsd6_pwrite 174 +#endif +#define __NR_setfib 175 +#define __NR_ntp_adjtime 176 +#define __NR_setgid 181 +#define __NR_setegid 182 +#define __NR_seteuid 183 + +#if (FREEBSD_VERS >= FREEBSD_12) +#define __NR_freebsd11_stat 188 +#define __NR_freebsd11_fstat 189 +#define __NR_freebsd11_lstat 190 +#else +#define __NR_stat 188 +#define __NR_fstat 189 +#define __NR_lstat 190 +#endif + +#define __NR_pathconf 191 +#define __NR_fpathconf 192 +#define __NR_getrlimit 194 +#define __NR_setrlimit 195 + +#if (FREEBSD_VERS >= FREEBSD_12) +#define __NR_freebsd11_getdirentries 196 +#else +#define __NR_getdirentries 196 +#endif +#if (FREEBSD_VERS <= FREEBSD_10) +#define __NR_freebsd6_mmap 197 +#endif +#define __NR___syscall 198 +#if (FREEBSD_VERS <= FREEBSD_10) +#define __NR_freebsd6_lseek 199 +#define __NR_freebsd6_truncate 200 +#define __NR_freebsd6_ftruncate 201 +#endif +#define __NR___sysctl 202 +#define __NR_mlock 203 +#define __NR_munlock 204 +#define __NR_undelete 205 +#define __NR_futimes 206 +#define __NR_getpgid 207 +#define __NR_poll 209 +#define __NR_freebsd7___semctl 220 +#define __NR_semget 221 +#define __NR_semop 222 +/* obs semconfig 223 */ +#define __NR_freebsd7_msgctl 224 +#define __NR_msgget 225 +#define __NR_msgsnd 226 +#define __NR_msgrcv 227 +#define __NR_shmat 228 +#define __NR_freebsd7_shmctl 229 +#define __NR_shmdt 230 +#define __NR_shmget 231 +#define __NR_clock_gettime 232 +#define __NR_clock_settime 233 +#define __NR_clock_getres 234 +#define __NR_ktimer_create 235 +#define __NR_ktimer_delete 236 +#define __NR_ktimer_settime 237 +#define __NR_ktimer_gettime 238 +#define __NR_ktimer_getoverrun 239 +#define __NR_nanosleep 240 +#define __NR_ffclock_getcounter 241 +#define __NR_ffclock_setestimate 242 +#define __NR_ffclock_getestimate 243 +#define __NR_clock_nanosleep 244 +#define __NR_clock_getcpuclockid2 247 +#define __NR_ntp_gettime 248 + +#define __NR_minherit 250 +#define __NR_rfork 251 +/* ons openbsd_poll 252 */ +#define __NR_issetugid 253 +#define __NR_lchown 254 +#define __NR_aio_read 255 +#define __NR_aio_write 256 +#define __NR_lio_listio 257 +#define __NR_freebsd11_getdents 272 +#define __NR_lchmod 274 +/* obs netbsd_lchown 275 */ +#define __NR_lutimes 276 +/* obs netbsd_msync 277 */ + +#if (FREEBSD_VERS >= FREEBSD_12) +#define __NR_freebsd11_nstat 278 +#define __NR_freebsd11_nfstat 279 +#define __NR_freebsd11_nlstat 280 +#else +#define __NR_nstat 278 +#define __NR_nfstat 279 +#define __NR_nlstat 280 +#endif +#define __NR_preadv 289 +#define __NR_pwritev 290 + +#if (FREEBSD_VERS <= FREEBSD_10) +#define __NR_freebsd4_fhstatfs 297 +#endif + +#define __NR_fhopen 298 + +#if (FREEBSD_VERS >= FREEBSD_12) +#define __NR_freebsd11_fhstat 299 +#else +#define __NR_fhstat 299 +#endif + +#define __NR_modnext 300 +#define __NR_modstat 301 +#define __NR_modfnext 302 +#define __NR_modfind 303 +#define __NR_kldload 304 +#define __NR_kldunload 305 +#define __NR_kldfind 306 +#define __NR_kldnext 307 +#define __NR_kldstat 308 +#define __NR_kldfirstmod 309 +#define __NR_getsid 310 +#define __NR_setresuid 311 +#define __NR_setresgid 312 +/* obs signanosleep 313 */ +#define __NR_aio_return 314 +#define __NR_aio_suspend 315 +#define __NR_aio_cancel 316 +#define __NR_aio_error 317 +#if (FREEBSD_VERS <= FREEBSD_10) +#define __NR_oaio_read 318 +#define __NR_oaio_write 319 +#define __NR_olio_listio 320 +#endif +#define __NR_yield 321 +/* obs thr_sleep 323 */ +/* obs thr_wakeup 324 */ +#define __NR_mlockall 324 +#define __NR_munlockall 325 +#define __NR___getcwd 326 +#define __NR_sched_setparam 327 +#define __NR_sched_getparam 328 +#define __NR_sched_setscheduler 329 +#define __NR_sched_getscheduler 330 +#define __NR_sched_yield 331 +#define __NR_sched_get_priority_max 332 +#define __NR_sched_get_priority_min 333 +#define __NR_sched_rr_get_interval 334 +#define __NR_utrace 335 +#if (FREEBSD_VERS <= FREEBSD_10) +#define __NR_freebsd4_sendfile 342 +#endif +#define __NR_kldsym 337 +#define __NR_jail 338 +#define __NR_sigprocmask 340 +#define __NR_sigsuspend 341 +#if (FREEBSD_VERS <= FREEBSD_10) +#define __NR_freebsd4_sigaction 342 +#endif +#define __NR_sigpending 343 +#if (FREEBSD_VERS <= FREEBSD_10) +#define __NR_freebsd4_sigreturn 344 +#endif +#define __NR_sigtimedwait 345 +#define __NR_sigwaitinfo 346 +#define __NR___acl_get_file 347 +#define __NR___acl_set_file 348 +#define __NR___acl_get_fd 349 +#define __NR___acl_set_fd 350 +#define __NR___acl_delete_file 351 +#define __NR___acl_delete_fd 352 +#define __NR___acl_aclcheck_file 353 +#define __NR___acl_aclcheck_fd 354 +#define __NR_extattrctl 355 +#define __NR_extattr_set_file 356 +#define __NR_extattr_get_file 357 +#define __NR_extattr_delete_file 358 +#define __NR_aio_waitcomplete 359 +#define __NR_getresuid 360 +#define __NR_getresgid 361 +#define __NR_kqueue 362 + +#if (FREEBSD_VERS >= FREEBSD_12) +#define __NR_freebsd11_kevent 363 +#else +#define __NR_kevent 363 +#endif +/* obs __cap_get_proc 364 */ +/* obs __cap_set_proc 365 */ +/* obs __cap_get_fd 366 */ +/* obs __cap_get_file 367 */ +/* obs __cap_set_fd 368 */ +/* obs __cap_set_file 369 */ + +#define __NR_extattr_set_fd 371 +#define __NR_extattr_get_fd 372 +#define __NR_extattr_delete_fd 373 +#define __NR___setugid 374 +/* obs nfsclnt 375 */ +#define __NR_eaccess 376 +#define __NR_nmount 378 +/* obs kse_exit 379 */ +/* obs kse_wakeup 380 */ +/* obs kse_create 381 */ +/* obs kse_thr_interrupt 382 */ +/* obs kse_release 383 */ +#define __NR___mac_get_proc 384 +#define __NR___mac_set_proc 385 +#define __NR___mac_get_fd 386 +#define __NR___mac_get_file 387 +#define __NR___mac_set_fd 388 +#define __NR___mac_set_file 389 +#define __NR_kenv 390 +#define __NR_lchflags 391 +#define __NR_uuidgen 392 +#define __NR_sendfile 393 +#define __NR_mac_syscall 394 + +#if (FREEBSD_VERS >= FREEBSD_12) +#define __NR_freebsd11_getfsstat 395 +#define __NR_freebsd11_statfs 396 +#define __NR_freebsd11_fstatfs 397 +#define __NR_freebsd11_fhstatfs 398 +#else +#define __NR_getfsstat 395 +#define __NR_statfs 396 +#define __NR_fstatfs 397 +#define __NR_fhstatfs 398 +#endif + +#define __NR_ksem_close 400 +#define __NR_ksem_post 401 +#define __NR_ksem_wait 402 +#define __NR_ksem_trywait 403 +#define __NR_ksem_init 404 +#define __NR_ksem_open 405 +#define __NR_ksem_unlink 406 +#define __NR_ksem_getvalue 407 +#define __NR_ksem_destroy 408 +#define __NR___mac_get_pid 409 +#define __NR___mac_get_link 410 +#define __NR___mac_set_link 411 +#define __NR_extattr_set_link 412 +#define __NR_extattr_get_link 413 +#define __NR_extattr_delete_link 414 +#define __NR___mac_execve 415 +#define __NR_sigaction 416 +#define __NR_sigreturn 417 +#define __NR_getcontext 421 +#define __NR_setcontext 422 +#define __NR_swapcontext 423 +#define __NR_swapoff 424 +#define __NR___acl_get_link 425 +#define __NR___acl_set_link 426 +#define __NR___acl_delete_link 427 +#define __NR___acl_aclcheck_link 428 +#define __NR_sigwait 429 +#define __NR_thr_create 430 +#define __NR_thr_exit 431 +#define __NR_thr_self 432 +#define __NR_thr_kill 433 +#define __NR__umtx_lock 434 +#define __NR__umtx_unlock 435 +#define __NR_jail_attach 436 +#define __NR_extattr_list_fd 437 +#define __NR_extattr_list_file 438 +#define __NR_extattr_list_link 439 +/* obs kse_switchin 440 */ +#define __NR_ksem_timedwait 441 +#define __NR_thr_suspend 442 +#define __NR_thr_wake 443 +#define __NR_kldunloadf 444 +#define __NR_audit 445 +#define __NR_auditon 446 +#define __NR_getauid 447 +#define __NR_setauid 448 +#define __NR_getaudit 449 +#define __NR_setaudit 450 +#define __NR_getaudit_addr 451 +#define __NR_setaudit_addr 452 +#define __NR_auditctl 453 +#define __NR__umtx_op 454 +#define __NR_thr_new 455 +#define __NR_sigqueue 456 +#define __NR_kmq_open 457 +#define __NR_kmq_setattr 458 +#define __NR_kmq_timedreceive 459 +#define __NR_kmq_timedsend 460 +#define __NR_kmq_notify 461 +#define __NR_kmq_unlink 462 +#define __NR_abort2 463 +#define __NR_thr_set_name 464 +#define __NR_aio_fsync 465 +#define __NR_rtprio_thread 466 +#define __NR_nosys467 467 +#define __NR_nosys468 468 +#define __NR___getpath_fromfd 469 +#define __NR___getpath_fromaddr 470 +#define __NR_sctp_peeloff 471 +#define __NR_sctp_generic_sendmsg 472 +#define __NR_sctp_generic_sendmsg_iov 473 +#define __NR_sctp_generic_recvmsg 474 +#define __NR_pread 475 +#define __NR_pwrite 476 +#define __NR_mmap 477 +#define __NR_lseek 478 +#define __NR_truncate 479 +#define __NR_ftruncate 480 +#define __NR_thr_kill2 481 + +// __NR_freebsd12_shm_open from FreeBSD 13 +#define __NR_shm_open 482 +#define __NR_shm_unlink 483 +#define __NR_cpuset 484 +#define __NR_cpuset_setid 485 +#define __NR_cpuset_getid 486 +#define __NR_cpuset_getaffinity 487 +#define __NR_cpuset_setaffinity 488 +#define __NR_faccessat 489 +#define __NR_fchmodat 490 +#define __NR_fchownat 491 +#define __NR_fexecve 492 + +#if (FREEBSD_VERS >= FREEBSD_12) +#define __NR_freebsd11_fstatat 493 +#else +#define __NR_fstatat 493 +#endif + +#define __NR_futimesat 494 +#define __NR_linkat 495 +#define __NR_mkdirat 496 +#define __NR_mkfifoat 497 + +#if (FREEBSD_VERS >= FREEBSD_12) +#define __NR_freebsd11_mknodat 498 +#else +#define __NR_mknodat 498 +#endif + +#define __NR_openat 499 +#define __NR_readlinkat 500 +#define __NR_renameat 501 +#define __NR_symlinkat 502 +#define __NR_unlinkat 503 +#define __NR_posix_openpt 504 +#define __NR_jail_get 506 +#define __NR_jail_set 507 +#define __NR_jail_remove 508 + +// __NR_freebsd12_closefrom from FreeBSD 13 +#define __NR_closefrom 509 +#define __NR___semctl 510 +#define __NR_msgctl 511 +#define __NR_shmctl 512 +#define __NR_lpathconf 513 +/* obs cap_new 514 */ +#define __NR___cap_rights_get 515 +#define __NR_cap_enter 516 +#define __NR_cap_getmode 517 +#define __NR_pdfork 518 +#define __NR_pdkill 519 +#define __NR_pdgetpid 520 +#define __NR_pselect 522 +#define __NR_getloginclass 523 +#define __NR_setloginclass 524 +#define __NR_rctl_get_racct 525 +#define __NR_rctl_get_rules 526 +#define __NR_rctl_get_limits 527 +#define __NR_rctl_add_rule 528 +#define __NR_rctl_remove_rule 529 +#define __NR_posix_fallocate 530 +#define __NR_posix_fadvise 531 +#define __NR_wait6 532 +#define __NR_cap_rights_limit 533 +#define __NR_cap_ioctls_limit 534 +#define __NR_cap_ioctls_get 535 +#define __NR_cap_fcntls_limit 536 +#define __NR_cap_fcntls_get 537 +#define __NR_bindat 538 +#define __NR_connectat 539 +#define __NR_chflagsat 540 +#define __NR_accept4 541 +#define __NR_pipe2 542 +#define __NR_aio_mlock 543 +#define __NR_procctl 544 +#define __NR_ppoll 545 +#define __NR_futimens 546 +#define __NR_utimensat 547 + +/* obs numa_getaffinity 548 */ +/* obs numa_setaffinity 549 */ +#if (FREEBSD_VERS >= FREEBSD_11) + +#define __NR_fdatasync 550 + +#endif // (FREEBSD_VERS >= FREEBSD_11) + +#if (FREEBSD_VERS >= FREEBSD_12) + +#define __NR_fstat 551 +#define __NR_fstatat 552 +#define __NR_fhstat 553 +#define __NR_getdirentries 554 +#define __NR_statfs 555 +#define __NR_fstatfs 556 +#define __NR_getfsstat 557 +#define __NR_fhstatfs 558 +#define __NR_mknodat 559 +#define __NR_kevent 560 +#define __NR_cpuset_getdomain 561 +#define __NR_cpuset_setdomain 562 +#define __NR_getrandom 563 +#define __NR_getfhat 564 +#define __NR_fhlink 565 +#define __NR_fhlinkat 566 +#define __NR_fhreadlink 567 + +#endif // (FREEBSD_VERS >= FREEBSD_12) + +#if (FREEBSD_VERS >= FREEBSD_12_2) + +#define __NR_funlinkat 568 +#define __NR_copy_file_range 569 +#define __NR___sysctlbyname 570 +#define __NR_shm_open2 571 +#define __NR_shm_rename 572 +#define __NR_sigfastblock 573 +#define __NR___realpathat 574 +#define __NR_close_range 575 + +#endif + +#if (FREEBSD_VERS >= FREEBSD_13) + +#define __NR_rpctls_syscall 576 + +#endif + +#if (FREEBSD_VERS >= FREEBSD_14) + +#define __NR___specialfd 577 +#define __NR_aio_writev 578 +#define __NR_aio_readv 579 + +#endif + +#define __NR_fake_sigreturn 1000 + +#endif /* VKI_UNISTD_FREEBSD_H */ diff --git a/include/vki/vki-x86-freebsd.h b/include/vki/vki-x86-freebsd.h new file mode 100644 index 0000000000..13cc279cfc --- /dev/null +++ b/include/vki/vki-x86-freebsd.h @@ -0,0 +1,247 @@ + +/*--------------------------------------------------------------------*/ +/*--- x86/FreeBSD-specific kernel interface. vki-x86-freebsd.h ---*/ +/*--------------------------------------------------------------------*/ + +/* + This file is part of Valgrind, a dynamic binary instrumentation + framework. + + Copyright (C) 2009 Stanislav Sedov + Copyright (C) 2000-2005 Julian Seward + jseward@acm.org + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, see . + + The GNU General Public License is contained in the file COPYING. +*/ + +#ifndef VKI_X86_FREEBSD_H +#define VKI_X86_FREEBSD_H + +//---------------------------------------------------------------------- +// From somewhere +//---------------------------------------------------------------------- + +/* PAGE_SHIFT determines the page size */ +#define VKI_PAGE_SHIFT 12 +#define VKI_PAGE_SIZE (1UL << VKI_PAGE_SHIFT) +#define VKI_MAX_PAGE_SHIFT VKI_PAGE_SHIFT +#define VKI_MAX_PAGE_SIZE VKI_PAGE_SIZE + +//---------------------------------------------------------------------- +// From sys/i386/include/_limits.h and sys/sys/_sigset.h +//---------------------------------------------------------------------- + +#define VKI_MINSIGSTKSZ (512 * 4) + +#define _VKI_NSIG 128 +#define _VKI_NSIG_WORDS 4 +#define _VKI_NSIG_BPW ((_VKI_NSIG) / (_VKI_NSIG_WORDS)) + +typedef struct { + vki_uint32_t sig[_VKI_NSIG_WORDS]; +} vki_sigset_t; + + +//---------------------------------------------------------------------- +// From sys/i386/include/npx.h +//---------------------------------------------------------------------- + +struct _vki_env87 { + long en_cw; + long en_sw; + long en_tw; + long en_fip; + unsigned short en_fcs; + unsigned short en_opcode; + long en_foo; + long en_fos; +}; + +struct _vki_fpacc87 { + unsigned char fp_bytes[10]; +}; + +struct _vki_save87 { + struct _vki_env87 sv_env; + struct _vki_fpacc87 sv_ac[8]; + unsigned char sv_pad0[4]; + unsigned char sv_pad[64]; +}; + +struct _vki_xmmacc { + unsigned char xmm_bytes[16]; +}; + +struct _vki_envxmm { + unsigned short en_cw; + unsigned short en_sw; + unsigned short en_tw; + unsigned short en_opcode; + unsigned int en_fip; + unsigned short en_fcs; + unsigned short en_pad0; + unsigned int en_foo; + unsigned short en_fos; + unsigned short en_pad1; + unsigned int en_mxcsr; + unsigned int en_mxcsr_mask; +}; + +struct _vki_savexmm { + struct _vki_envxmm sv_env; + struct { + struct _vki_fpacc87 fp_acc; + unsigned char fp_pad[6]; + } sv_fp[8]; + struct _vki_xmmacc sv_xmm[8]; + unsigned char sv_pad[224]; +}; + +struct _vki_fpstate { + union { + struct _vki_save87 sv_87; + struct _vki_savexmm sv_xmm; + }; +}; + +struct vki_sigcontext { + vki_sigset_t sc_mask; + int onstack; + int gs; + int fs; + int es; + int ds; + int edi; + int esi; + int ebp; + int isp; + int ebx; + int edx; + int ecx; + int eax; + int trapno; + int err; + int eip; + int cs; + int eflags; + int esp; + int ss; + int len; + int fpformat; + int ownedfp; + int spare1[1]; + struct _vki_fpstate fpstate __attribute__((aligned(16))); + int fsbase; + int gsbase; + int spare2[6]; +}; + +struct vki_user_regs_struct { + unsigned int fs; + unsigned int es; + unsigned int ds; + unsigned int edi; + unsigned int esi; + unsigned int ebp; + unsigned int isp; + unsigned int ebx; + unsigned int edx; + unsigned int ecx; + unsigned int eax; + unsigned int trapno; + unsigned int err; + unsigned int eip; + unsigned int cs; + unsigned int eflags; + unsigned int esp; + unsigned int ss; + unsigned int gs; +}; + +struct vki_fpreg { + unsigned long fpr_env[7]; + unsigned char fpr_acc[8][10]; + unsigned long fpr_ex_sw; + unsigned char fpr_pad[64]; +}; + +struct vki_dbreg { + unsigned int dr[8]; +}; + +typedef unsigned int vki_elf_greg_t; +typedef struct _vki_fpstate vki_elf_fpregset_t; +typedef struct _vki_fpstate vki_elf_fpxregset_t; + +#define VKI_AT_SYSINFO 32 +#define VKI_ELF_NGREG (sizeof (struct vki_user_regs_struct) / sizeof(vki_elf_greg_t)) +typedef vki_elf_greg_t vki_elf_gregset_t[VKI_ELF_NGREG]; + +#define VKI_FPFMT_NODEV 0x10000 +#define VKI_FPFMT_387 0x10001 +#define VKI_FPFMT_XMM 0x10002 + +#define VKI_FPOWNED_NONE 0x20000 +#define VKI_FPOWNED_FPU 0x20001 +#define VKI_FPOWNED_PCB 0x20002 + +struct vki_mcontext { + int onstack; + int gs; + int fs; + int es; + int ds; + int edi; + int esi; + int ebp; + int isp; + int ebx; + int edx; + int ecx; + int eax; + int trapno; + int err; + int eip; + int cs; + int eflags; + int esp; + int ss; + + int len; + int fpformat; + int ownedfp; + int flags; + struct _vki_fpstate fpstate __attribute__((aligned(16))); + int fsbase; + int gsbase; + int xfpustate; + int xfpustate_len; + int spare2[4]; +}; + +struct vki_sigaction_base { + void (*ksa_handler)(int); + int sa_flags; + vki_sigset_t sa_mask; /* mask last for extensibility */ +}; +typedef struct vki_sigaction_base vki_sigaction_toK_t; +typedef struct vki_sigaction_base vki_sigaction_fromK_t; + +#endif // VKI_X86_FREEBSD_H + +/*--------------------------------------------------------------------*/ +/*--- end ---*/ +/*--------------------------------------------------------------------*/