File: //opt/alt/luajit/share/lua/syscall/netbsd/ffitypes.lua
-- This is types for NetBSD and rump kernel, which are the same bar names.
local require, error, assert, tonumber, tostring,
setmetatable, pairs, ipairs, unpack, rawget, rawset,
pcall, type, table, string =
require, error, assert, tonumber, tostring,
setmetatable, pairs, ipairs, unpack, rawget, rawset,
pcall, type, table, string
local abi = require "syscall.abi"
local ffi = require "ffi"
require "syscall.ffitypes"
local helpers = require "syscall.helpers"
local version = require "syscall.netbsd.version".version
local defs = {}
local function append(str) defs[#defs + 1] = str end
-- these are the same, could just define as uint
if abi.abi64 then
append [[
typedef unsigned int _netbsd_clock_t;
]]
else
append [[
typedef unsigned long _netbsd_clock_t;
]]
end
-- register_t varies by arch
local register_t = {
x86 = "int",
x64 = "long int",
mips = "int32_t",
mips64 = "int64_t",
sparc = "unsigned long int",
sparc64 = "unsigned long int",
ia64 = "long int",
alpha = "long int",
ppc = "long int",
ppc64 = "long int",
arm = "int",
sh3 = "int",
m68k = "int",
hppa = "int",
vax = "int",
}
append("typedef " .. register_t[abi.arch] .. " _netbsd_register_t;")
append [[
typedef uint32_t _netbsd_mode_t;
typedef uint8_t _netbsd_sa_family_t;
typedef uint64_t _netbsd_dev_t;
typedef uint32_t _netbsd_nlink_t;
typedef uint64_t _netbsd_ino_t;
typedef int64_t _netbsd_time_t;
typedef int64_t _netbsd_daddr_t;
typedef uint64_t _netbsd_blkcnt_t;
typedef uint64_t _netbsd_fsblkcnt_t;
typedef uint64_t _netbsd_fsfilcnt_t;
typedef uint32_t _netbsd_blksize_t;
typedef int _netbsd_clockid_t;
typedef int _netbsd_timer_t;
typedef int _netbsd_suseconds_t;
typedef unsigned int _netbsd_nfds_t;
typedef uint32_t _netbsd_id_t;
typedef unsigned int _netbsd_tcflag_t;
typedef unsigned int _netbsd_speed_t;
typedef int32_t _netbsd_lwpid_t;
typedef uint32_t _netbsd_fixpt_t;
typedef unsigned short u_short;
typedef unsigned char u_char;
typedef uint64_t u_quad_t;
/* these are not used in Linux so not renamed */
typedef unsigned int useconds_t;
typedef int32_t lwpid_t;
typedef struct { int32_t __fsid_val[2]; } _netbsd_fsid_t;
typedef uint32_t _netbsd_fd_mask;
typedef struct {
_netbsd_fd_mask fds_bits[8]; /* kernel can cope with more */
} _netbsd_fd_set;
struct _netbsd_cmsghdr {
size_t cmsg_len;
int cmsg_level;
int cmsg_type;
char cmsg_data[?];
};
struct _netbsd_msghdr {
void *msg_name;
socklen_t msg_namelen;
struct iovec *msg_iov;
int msg_iovlen;
void *msg_control;
socklen_t msg_controllen;
int msg_flags;
};
struct _netbsd_mmsghdr {
struct _netbsd_msghdr msg_hdr;
unsigned int msg_len;
};
struct _netbsd_timespec {
_netbsd_time_t tv_sec;
long tv_nsec;
};
struct _netbsd_timeval {
_netbsd_time_t tv_sec;
_netbsd_suseconds_t tv_usec;
};
struct _netbsd_itimerspec {
struct _netbsd_timespec it_interval;
struct _netbsd_timespec it_value;
};
struct _netbsd_itimerval {
struct _netbsd_timeval it_interval;
struct _netbsd_timeval it_value;
};
typedef struct {
uint32_t sig[4]; // note renamed to match Linux
} _netbsd_sigset_t;
struct _netbsd_sockaddr {
uint8_t sa_len;
_netbsd_sa_family_t sa_family;
char sa_data[14];
};
struct _netbsd_sockaddr_storage {
uint8_t ss_len;
_netbsd_sa_family_t ss_family;
char __ss_pad1[6];
int64_t __ss_align;
char __ss_pad2[128 - 2 - 8 - 6];
};
struct _netbsd_sockaddr_in {
uint8_t sin_len;
_netbsd_sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
int8_t sin_zero[8];
};
struct _netbsd_sockaddr_in6 {
uint8_t sin6_len;
_netbsd_sa_family_t sin6_family;
in_port_t sin6_port;
uint32_t sin6_flowinfo;
struct in6_addr sin6_addr;
uint32_t sin6_scope_id;
};
struct _netbsd_sockaddr_un {
uint8_t sun_len;
_netbsd_sa_family_t sun_family;
char sun_path[104];
};
struct _netbsd_stat {
_netbsd_dev_t st_dev;
_netbsd_mode_t st_mode;
_netbsd_ino_t st_ino;
_netbsd_nlink_t st_nlink;
uid_t st_uid;
gid_t st_gid;
_netbsd_dev_t st_rdev;
struct _netbsd_timespec st_atimespec;
struct _netbsd_timespec st_mtimespec;
struct _netbsd_timespec st_ctimespec;
struct _netbsd_timespec st_birthtimespec;
off_t st_size;
_netbsd_blkcnt_t st_blocks;
_netbsd_blksize_t st_blksize;
uint32_t st_flags;
uint32_t st_gen;
uint32_t st_spare[2];
};
typedef union _netbsd_sigval {
int sival_int;
void *sival_ptr;
} _netbsd_sigval_t;
struct _netbsd_sigevent {
int sigev_notify;
int sigev_signo;
union _netbsd_sigval sigev_value;
void (*sigev_notify_function)(union _netbsd_sigval);
void /* pthread_attr_t */ *sigev_notify_attributes;
};
struct _netbsd_kevent {
uintptr_t ident;
uint32_t filter;
uint32_t flags;
uint32_t fflags;
int64_t data;
intptr_t udata;
};
struct _netbsd_kfilter_mapping {
char *name;
size_t len;
uint32_t filter;
};
]]
if abi.abi64 then
append [[
struct _ksiginfo {
int _signo;
int _code;
int _errno;
int _pad; /* only on LP64 */
union {
struct {
pid_t _pid;
uid_t _uid;
_netbsd_sigval_t _value;
} _rt;
struct {
pid_t _pid;
uid_t _uid;
int _status;
_netbsd_clock_t _utime;
_netbsd_clock_t _stime;
} _child;
struct {
void *_addr;
int _trap;
} _fault;
struct {
long _band;
int _fd;
} _poll;
} _reason;
};
]]
else
append [[
struct _ksiginfo {
int _signo;
int _code;
int _errno;
union {
struct {
pid_t _pid;
uid_t _uid;
_netbsd_sigval_t _value;
} _rt;
struct {
pid_t _pid;
uid_t _uid;
int _status;
_netbsd_clock_t _utime;
_netbsd_clock_t _stime;
} _child;
struct {
void *_addr;
int _trap;
} _fault;
struct {
long _band;
int _fd;
} _poll;
} _reason;
};
]]
end
append [[
typedef union _netbsd_siginfo {
char si_pad[128]; /* Total size; for future expansion */
struct _ksiginfo _info;
} _netbsd_siginfo_t;
struct _netbsd_sigaction {
union {
void (*_sa_handler)(int);
void (*_sa_sigaction)(int, _netbsd_siginfo_t *, void *);
} _sa_u;
_netbsd_sigset_t sa_mask;
int sa_flags;
};
struct _netbsd_ufs_args {
char *fspec;
};
struct _netbsd_tmpfs_args {
int ta_version;
_netbsd_ino_t ta_nodes_max;
off_t ta_size_max;
uid_t ta_root_uid;
gid_t ta_root_gid;
_netbsd_mode_t ta_root_mode;
};
struct _netbsd_ptyfs_args {
int version;
gid_t gid;
_netbsd_mode_t mode;
int flags;
};
struct _netbsd_procfs_args {
int version;
int flags;
};
struct _netbsd_dirent {
_netbsd_ino_t d_fileno;
uint16_t d_reclen;
uint16_t d_namlen;
uint8_t d_type;
char d_name[512];
};
struct _netbsd_ifreq {
char ifr_name[16];
union {
struct _netbsd_sockaddr ifru_addr;
struct _netbsd_sockaddr ifru_dstaddr;
struct _netbsd_sockaddr ifru_broadaddr;
struct _netbsd_sockaddr_storage ifru_space;
short ifru_flags;
int ifru_metric;
int ifru_mtu;
int ifru_dlt;
unsigned int ifru_value;
void * ifru_data;
struct {
uint32_t b_buflen;
void *b_buf;
} ifru_b;
} ifr_ifru;
};
struct _netbsd_ifaliasreq {
char ifra_name[16];
struct _netbsd_sockaddr ifra_addr;
struct _netbsd_sockaddr ifra_dstaddr;
struct _netbsd_sockaddr ifra_mask;
};
struct _netbsd_pollfd {
int fd;
short int events;
short int revents;
};
struct _netbsd_flock {
off_t l_start;
off_t l_len;
pid_t l_pid;
short l_type;
short l_whence;
};
struct _netbsd_termios {
_netbsd_tcflag_t c_iflag;
_netbsd_tcflag_t c_oflag;
_netbsd_tcflag_t c_cflag;
_netbsd_tcflag_t c_lflag;
cc_t c_cc[20];
int c_ispeed;
int c_ospeed;
};
/* compat issues */
struct _netbsd_compat_60_ptmget {
int cfd;
int sfd;
char cn[16];
char sn[16];
};
struct _netbsd_ptmget {
int cfd;
int sfd;
char cn[1024];
char sn[1024];
};
struct _netbsd_statvfs {
unsigned long f_flag;
unsigned long f_bsize;
unsigned long f_frsize;
unsigned long f_iosize;
_netbsd_fsblkcnt_t f_blocks;
_netbsd_fsblkcnt_t f_bfree;
_netbsd_fsblkcnt_t f_bavail;
_netbsd_fsblkcnt_t f_bresvd;
_netbsd_fsfilcnt_t f_files;
_netbsd_fsfilcnt_t f_ffree;
_netbsd_fsfilcnt_t f_favail;
_netbsd_fsfilcnt_t f_fresvd;
uint64_t f_syncreads;
uint64_t f_syncwrites;
uint64_t f_asyncreads;
uint64_t f_asyncwrites;
_netbsd_fsid_t f_fsidx;
unsigned long f_fsid;
unsigned long f_namemax;
uid_t f_owner;
uint32_t f_spare[4];
char f_fstypename[32];
char f_mntonname[1024];
char f_mntfromname[1024];
};
struct _netbsd_rusage {
struct _netbsd_timeval ru_utime;
struct _netbsd_timeval ru_stime;
long ru_maxrss;
long ru_ixrss;
long ru_idrss;
long ru_isrss;
long ru_minflt;
long ru_majflt;
long ru_nswap;
long ru_inblock;
long ru_oublock;
long ru_msgsnd;
long ru_msgrcv;
long ru_nsignals;
long ru_nvcsw;
long ru_nivcsw;
};
]]
if abi.le then
append [[
struct _netbsd_ktr_header {
int ktr_len;
short ktr_type;
short ktr_version;
pid_t ktr_pid;
char ktr_comm[17];
union {
struct {
struct {
int32_t tv_sec;
long tv_usec;
} _tv;
const void *_buf;
} _v0;
struct {
struct {
int32_t tv_sec;
long tv_nsec;
} _ts;
lwpid_t _lid;
} _v1;
struct {
struct _netbsd_timespec _ts;
lwpid_t _lid;
} _v2;
} _v;
};
]]
else
append [[
struct _netbsd_ktr_header {
int ktr_len;
short ktr_version;
short ktr_type;
pid_t ktr_pid;
char ktr_comm[17];
union {
struct {
struct {
int32_t tv_sec;
long tv_usec;
} _tv;
const void *_buf;
} _v0;
struct {
struct {
int32_t tv_sec;
long tv_nsec;
} _ts;
lwpid_t _lid;
} _v1;
struct {
struct _netbsd_timespec _ts;
lwpid_t _lid;
} _v2;
} _v;
};
]]
end
append [[
struct _netbsd_ktr_syscall {
int ktr_code;
int ktr_argsize;
};
struct _netbsd_ktr_sysret {
short ktr_code;
short ktr_eosys;
int ktr_error;
_netbsd_register_t ktr_retval;
_netbsd_register_t ktr_retval_1;
};
struct _netbsd_ktr_genio {
int ktr_fd;
int ktr_rw; /* enum uoi_rw, changed to constant */
};
struct _netbsd_ktr_psig {
int signo;
sig_t action;
_netbsd_sigset_t mask;
int code;
};
struct _netbsd_ktr_csw {
int out;
int user;
};
struct _netbsd_ktr_user {
char ktr_id[20];
};
struct _netbsd_ktr_saupcall {
int ktr_type;
int ktr_nevent;
int ktr_nint;
void *ktr_sas;
void *ktr_ap;
};
struct _netbsd_ktr_execfd {
int ktr_fd;
unsigned int ktr_dtype;
};
struct _netbsd_ifdrv {
char ifd_name[16];
unsigned long ifd_cmd;
size_t ifd_len;
void *ifd_data;
};
struct _netbsd_ifbreq {
char ifbr_ifsname[16];
uint32_t ifbr_ifsflags;
uint8_t ifbr_state;
uint8_t ifbr_priority;
uint8_t ifbr_path_cost;
uint8_t ifbr_portno;
};
struct _netbsd_in6_addrlifetime {
_netbsd_time_t ia6t_expire;
_netbsd_time_t ia6t_preferred;
uint32_t ia6t_vltime;
uint32_t ia6t_pltime;
};
struct _netbsd_in6_ifstat {
u_quad_t ifs6_in_receive;
u_quad_t ifs6_in_hdrerr;
u_quad_t ifs6_in_toobig;
u_quad_t ifs6_in_noroute;
u_quad_t ifs6_in_addrerr;
u_quad_t ifs6_in_protounknown;
u_quad_t ifs6_in_truncated;
u_quad_t ifs6_in_discard;
u_quad_t ifs6_in_deliver;
u_quad_t ifs6_out_forward;
u_quad_t ifs6_out_request;
u_quad_t ifs6_out_discard;
u_quad_t ifs6_out_fragok;
u_quad_t ifs6_out_fragfail;
u_quad_t ifs6_out_fragcreat;
u_quad_t ifs6_reass_reqd;
u_quad_t ifs6_reass_ok;
u_quad_t ifs6_reass_fail;
u_quad_t ifs6_in_mcast;
u_quad_t ifs6_out_mcast;
};
struct _netbsd_icmp6_ifstat {
u_quad_t ifs6_in_msg;
u_quad_t ifs6_in_error;
u_quad_t ifs6_in_dstunreach;
u_quad_t ifs6_in_adminprohib;
u_quad_t ifs6_in_timeexceed;
u_quad_t ifs6_in_paramprob;
u_quad_t ifs6_in_pkttoobig;
u_quad_t ifs6_in_echo;
u_quad_t ifs6_in_echoreply;
u_quad_t ifs6_in_routersolicit;
u_quad_t ifs6_in_routeradvert;
u_quad_t ifs6_in_neighborsolicit;
u_quad_t ifs6_in_neighboradvert;
u_quad_t ifs6_in_redirect;
u_quad_t ifs6_in_mldquery;
u_quad_t ifs6_in_mldreport;
u_quad_t ifs6_in_mlddone;
u_quad_t ifs6_out_msg;
u_quad_t ifs6_out_error;
u_quad_t ifs6_out_dstunreach;
u_quad_t ifs6_out_adminprohib;
u_quad_t ifs6_out_timeexceed;
u_quad_t ifs6_out_paramprob;
u_quad_t ifs6_out_pkttoobig;
u_quad_t ifs6_out_echo;
u_quad_t ifs6_out_echoreply;
u_quad_t ifs6_out_routersolicit;
u_quad_t ifs6_out_routeradvert;
u_quad_t ifs6_out_neighborsolicit;
u_quad_t ifs6_out_neighboradvert;
u_quad_t ifs6_out_redirect;
u_quad_t ifs6_out_mldquery;
u_quad_t ifs6_out_mldreport;
u_quad_t ifs6_out_mlddone;
};
struct _netbsd_in6_ifreq {
char ifr_name[16];
union {
struct _netbsd_sockaddr_in6 ifru_addr;
struct _netbsd_sockaddr_in6 ifru_dstaddr;
short ifru_flags;
int ifru_flags6;
int ifru_metric;
void * ifru_data;
struct _netbsd_in6_addrlifetime ifru_lifetime;
struct _netbsd_in6_ifstat ifru_stat;
struct _netbsd_icmp6_ifstat ifru_icmp6stat;
} ifr_ifru;
};
struct _netbsd_in6_aliasreq {
char ifra_name[16];
struct _netbsd_sockaddr_in6 ifra_addr;
struct _netbsd_sockaddr_in6 ifra_dstaddr;
struct _netbsd_sockaddr_in6 ifra_prefixmask;
int ifra_flags;
struct _netbsd_in6_addrlifetime ifra_lifetime;
};
struct _netbsd_rt_metrics {
uint64_t rmx_locks;
uint64_t rmx_mtu;
uint64_t rmx_hopcount;
uint64_t rmx_recvpipe;
uint64_t rmx_sendpipe;
uint64_t rmx_ssthresh;
uint64_t rmx_rtt;
uint64_t rmx_rttvar;
_netbsd_time_t rmx_expire;
_netbsd_time_t rmx_pksent;
};
struct _netbsd_rt_msghdr {
u_short rtm_msglen __attribute__ ((aligned (8)));
u_char rtm_version;
u_char rtm_type;
u_short rtm_index;
int rtm_flags;
int rtm_addrs;
pid_t rtm_pid;
int rtm_seq;
int rtm_errno;
int rtm_use;
int rtm_inits;
struct _netbsd_rt_metrics rtm_rmx __attribute__ ((aligned (8)));
};
struct _netbsd_clockinfo {
int hz;
int tick;
int tickadj;
int stathz;
int profhz;
};
struct _netbsd_loadavg {
_netbsd_fixpt_t ldavg[3];
long fscale;
};
struct _netbsd_vmtotal
{
int16_t t_rq;
int16_t t_dw;
int16_t t_pw;
int16_t t_sl;
int16_t _reserved1;
int32_t t_vm;
int32_t t_avm;
int32_t t_rm;
int32_t t_arm;
int32_t t_vmshr;
int32_t t_avmshr;
int32_t t_rmshr;
int32_t t_armshr;
int32_t t_free;
};
struct _netbsd_ctlname {
const char *ctl_name;
int ctl_type;
};
/* volatile may be an issue... */
struct _netbsd_aiocb {
off_t aio_offset;
volatile void *aio_buf;
size_t aio_nbytes;
int aio_fildes;
int aio_lio_opcode;
int aio_reqprio;
struct _netbsd_sigevent aio_sigevent;
/* Internal kernel variables */
int _state;
int _errno;
ssize_t _retval;
};
]]
local s = table.concat(defs, "")
-- TODO broken, makes this module not a proper function, see #120
-- although this will not ever actually happen...
if abi.host == "netbsd" then
s = string.gsub(s, "_netbsd_", "") -- remove netbsd types
end
ffi.cdef(s)