Author: dchagin
Date: Sun May 24 16:07:11 2015
New Revision: 283424
URL: https://svnweb.freebsd.org/changeset/base/283424

Log:
  Add preliminary support for x86-64 Linux binaries.
  
  Differential Revision:        https://reviews.freebsd.org/D1076

Added:
  head/sys/amd64/linux/
  head/sys/amd64/linux/Makefile   (contents, props changed)
  head/sys/amd64/linux/linux.h   (contents, props changed)
  head/sys/amd64/linux/linux_dummy.c   (contents, props changed)
  head/sys/amd64/linux/linux_genassym.c   (contents, props changed)
  head/sys/amd64/linux/linux_ipc64.h   (contents, props changed)
  head/sys/amd64/linux/linux_locore.s   (contents, props changed)
  head/sys/amd64/linux/linux_machdep.c   (contents, props changed)
  head/sys/amd64/linux/linux_support.s   (contents, props changed)
  head/sys/amd64/linux/linux_sysvec.c   (contents, props changed)
  head/sys/amd64/linux/linux_vdso.lds.s   (contents, props changed)
  head/sys/amd64/linux/syscalls.conf   (contents, props changed)
  head/sys/amd64/linux/syscalls.master   (contents, props changed)
  head/sys/modules/linux64/
  head/sys/modules/linux64/Makefile   (contents, props changed)

Added: head/sys/amd64/linux/Makefile
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/amd64/linux/Makefile       Sun May 24 16:07:11 2015        
(r283424)
@@ -0,0 +1,17 @@
+# Makefile for syscall tables
+#
+# $FreeBSD$
+
+all:
+       @echo "make sysent only"
+
+sysent:  linux_sysent.c linux_syscall.h linux_proto.h linux_syscalls.c 
linux_systrace_args.c
+
+linux_sysent.c linux_syscall.h linux_proto.h linux_syscalls.c 
linux_systrace_args.c: \
+               ../../kern/makesyscalls.sh syscalls.master syscalls.conf
+       -mv -f linux_sysent.c linux_sysent.c.bak
+       -mv -f linux_syscall.h linux_syscall.h.bak
+       -mv -f linux_proto.h linux_proto.h.bak
+       -mv -f linux_syscalls.c linux_syscalls.c.bak
+       -mv -f linux_systrace_args.c linux_systrace_args.c.bak
+       sh ../../kern/makesyscalls.sh syscalls.master syscalls.conf

Added: head/sys/amd64/linux/linux.h
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/amd64/linux/linux.h        Sun May 24 16:07:11 2015        
(r283424)
@@ -0,0 +1,666 @@
+/*-
+ * Copyright (c) 2013 Dmitry Chagin
+ * Copyright (c) 1994-1996 Søren Schmidt
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer
+ *    in this position and unchanged.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _AMD64_LINUX_H_
+#define        _AMD64_LINUX_H_
+
+#include <amd64/linux/linux_syscall.h>
+
+/*
+ * debugging support
+ */
+extern u_char linux_debug_map[];
+#define        ldebug(name)    isclr(linux_debug_map, LINUX_SYS_linux_ ## name)
+#define        ARGS(nm, fmt)   "linux(%ld/%ld): "#nm"("fmt")\n",               
        \
+                       (long)td->td_proc->p_pid, (long)td->td_tid
+#define        LMSG(fmt)       "linux(%ld/%ld): "fmt"\n",                      
        \
+                       (long)td->td_proc->p_pid, (long)td->td_tid
+#define        LINUX_DTRACE    linuxulator
+
+#define        PTRIN(v)        (void *)(v)
+#define        PTROUT(v)       (uintptr_t)(v)
+
+#define        CP(src,dst,fld) do { (dst).fld = (src).fld; } while (0)
+#define        CP2(src,dst,sfld,dfld) do { (dst).dfld = (src).sfld; } while (0)
+#define        PTRIN_CP(src,dst,fld) \
+       do { (dst).fld = PTRIN((src).fld); } while (0)
+
+/*
+ * Provide a separate set of types for the Linux types.
+ */
+typedef int32_t                l_int;
+typedef int64_t                l_long;
+typedef int16_t                l_short;
+typedef uint32_t       l_uint;
+typedef uint64_t       l_ulong;
+typedef uint16_t       l_ushort;
+
+typedef l_ulong                l_uintptr_t;
+typedef l_long         l_clock_t;
+typedef l_int          l_daddr_t;
+typedef l_ulong                l_dev_t;
+typedef l_uint         l_gid_t;
+typedef l_uint         l_uid_t;
+typedef l_ulong                l_ino_t;
+typedef l_int          l_key_t;
+typedef l_long         l_loff_t;
+typedef l_uint         l_mode_t;
+typedef l_long         l_off_t;
+typedef l_int          l_pid_t;
+typedef l_ulong                l_size_t;
+typedef l_long         l_ssize_t;
+typedef l_long         l_suseconds_t;
+typedef l_long         l_time_t;
+typedef l_int          l_timer_t;
+typedef l_int          l_mqd_t;
+typedef l_size_t       l_socklen_t;
+
+typedef struct {
+       l_int           val[2];
+} l_fsid_t;
+
+typedef struct {
+       l_time_t        tv_sec;
+       l_suseconds_t   tv_usec;
+} l_timeval;
+
+#define        l_fd_set        fd_set
+
+/*
+ * Miscellaneous
+ */
+#define        LINUX_NAME_MAX          255
+#define        LINUX_CTL_MAXNAME       10
+
+#define LINUX_AT_COUNT         17      /* Count of used aux entry types. */
+
+struct l___sysctl_args
+{
+       l_uintptr_t     name;
+       l_int           nlen;
+       l_uintptr_t     oldval;
+       l_uintptr_t     oldlenp;
+       l_uintptr_t     newval;
+       l_size_t        newlen;
+       l_ulong         __spare[4];
+};
+
+/* Scheduling policies */
+#define        LINUX_SCHED_OTHER       0
+#define        LINUX_SCHED_FIFO        1
+#define        LINUX_SCHED_RR          2
+
+/* Resource limits */
+#define        LINUX_RLIMIT_CPU        0
+#define        LINUX_RLIMIT_FSIZE      1
+#define        LINUX_RLIMIT_DATA       2
+#define        LINUX_RLIMIT_STACK      3
+#define        LINUX_RLIMIT_CORE       4
+#define        LINUX_RLIMIT_RSS        5
+#define        LINUX_RLIMIT_NPROC      6
+#define        LINUX_RLIMIT_NOFILE     7
+#define        LINUX_RLIMIT_MEMLOCK    8
+#define        LINUX_RLIMIT_AS         9       /* Address space limit */
+
+#define        LINUX_RLIM_NLIMITS      10
+
+struct l_rlimit {
+       l_ulong         rlim_cur;
+       l_ulong         rlim_max;
+};
+
+/* mmap options */
+#define        LINUX_MAP_SHARED        0x0001
+#define        LINUX_MAP_PRIVATE       0x0002
+#define        LINUX_MAP_FIXED         0x0010
+#define        LINUX_MAP_ANON          0x0020
+#define        LINUX_MAP_GROWSDOWN     0x0100
+
+/*
+ * stat family of syscalls
+ */
+struct l_timespec {
+       l_time_t        tv_sec;
+       l_long          tv_nsec;
+};
+
+struct l_newstat {
+       l_dev_t         st_dev;
+       l_ino_t         st_ino;
+       l_ulong         st_nlink;
+       l_uint          st_mode;
+       l_uid_t         st_uid;
+       l_gid_t         st_gid;
+       l_uint          __st_pad1;
+       l_dev_t         st_rdev;
+       l_off_t         st_size;
+       l_long          st_blksize;
+       l_long          st_blocks;
+       struct l_timespec       st_atim;
+       struct l_timespec       st_mtim;
+       struct l_timespec       st_ctim;
+       l_long          __unused1;
+       l_long          __unused2;
+       l_long          __unused3;
+};
+
+/*
+ * Signalling
+ */
+#define        LINUX_SIGHUP            1
+#define        LINUX_SIGINT            2
+#define        LINUX_SIGQUIT           3
+#define        LINUX_SIGILL            4
+#define        LINUX_SIGTRAP           5
+#define        LINUX_SIGABRT           6
+#define        LINUX_SIGIOT            LINUX_SIGABRT
+#define        LINUX_SIGBUS            7
+#define        LINUX_SIGFPE            8
+#define        LINUX_SIGKILL           9
+#define        LINUX_SIGUSR1           10
+#define        LINUX_SIGSEGV           11
+#define        LINUX_SIGUSR2           12
+#define        LINUX_SIGPIPE           13
+#define        LINUX_SIGALRM           14
+#define        LINUX_SIGTERM           15
+#define        LINUX_SIGSTKFLT         16
+#define        LINUX_SIGCHLD           17
+#define        LINUX_SIGCONT           18
+#define        LINUX_SIGSTOP           19
+#define        LINUX_SIGTSTP           20
+#define        LINUX_SIGTTIN           21
+#define        LINUX_SIGTTOU           22
+#define        LINUX_SIGURG            23
+#define        LINUX_SIGXCPU           24
+#define        LINUX_SIGXFSZ           25
+#define        LINUX_SIGVTALRM         26
+#define        LINUX_SIGPROF           27
+#define        LINUX_SIGWINCH          28
+#define        LINUX_SIGIO             29
+#define        LINUX_SIGPOLL           LINUX_SIGIO
+#define        LINUX_SIGPWR            30
+#define        LINUX_SIGSYS            31
+#define        LINUX_SIGRTMIN          32
+
+#define        LINUX_SIGTBLSZ          31
+#define        LINUX_NSIG              64
+#define        LINUX_NBPW              64
+#define        LINUX_NSIG_WORDS        (LINUX_NSIG / LINUX_NBPW)
+
+/* sigaction flags */
+#define        LINUX_SA_NOCLDSTOP      0x00000001
+#define        LINUX_SA_NOCLDWAIT      0x00000002
+#define        LINUX_SA_SIGINFO        0x00000004
+#define        LINUX_SA_RESTORER       0x04000000
+#define        LINUX_SA_ONSTACK        0x08000000
+#define        LINUX_SA_RESTART        0x10000000
+#define        LINUX_SA_INTERRUPT      0x20000000
+#define        LINUX_SA_NOMASK         0x40000000
+#define        LINUX_SA_ONESHOT        0x80000000
+
+/* sigprocmask actions */
+#define        LINUX_SIG_BLOCK         0
+#define        LINUX_SIG_UNBLOCK       1
+#define        LINUX_SIG_SETMASK       2
+
+/* primitives to manipulate sigset_t */
+
+#define        LINUX_SIGEMPTYSET(set)                                  \
+       do {                                                    \
+               (set).__bits[0] = 0;                            \
+       } while(0)
+
+#define        LINUX_SIGISMEMBER(set, sig)                             \
+       (1UL & ((set).__bits[0] >> _SIG_IDX(sig)))
+
+#define        LINUX_SIGADDSET(set, sig)                               \
+       (set).__bits[0] |= 1UL << _SIG_IDX(sig)
+
+/* sigaltstack */
+#define        LINUX_MINSIGSTKSZ       2048
+#define        LINUX_SS_ONSTACK        1
+#define        LINUX_SS_DISABLE        2
+
+int linux_to_bsd_sigaltstack(int lsa);
+int bsd_to_linux_sigaltstack(int bsa);
+
+typedef void   (*l_handler_t)(l_int);
+
+typedef struct {
+       l_ulong __bits[LINUX_NSIG_WORDS];
+} l_sigset_t;
+
+typedef struct {
+       l_handler_t     lsa_handler;
+       l_ulong         lsa_flags;
+       l_uintptr_t     lsa_restorer;
+       l_sigset_t      lsa_mask;
+} l_sigaction_t;
+
+typedef struct {
+       l_uintptr_t     ss_sp;
+       l_int           ss_flags;
+       l_size_t        ss_size;
+} l_stack_t;
+
+struct l_fpstate {
+       u_int16_t cwd;
+       u_int16_t swd;
+       u_int16_t twd;
+       u_int16_t fop;
+       u_int64_t rip;
+       u_int64_t rdp;
+       u_int32_t mxcsr;
+       u_int32_t mxcsr_mask;
+       u_int32_t st_space[32];
+       u_int32_t xmm_space[64];
+       u_int32_t reserved2[24];
+};
+
+struct l_sigcontext {
+       l_ulong         sc_r8;
+       l_ulong         sc_r9;
+       l_ulong         sc_r10;
+       l_ulong         sc_r11;
+       l_ulong         sc_r12;
+       l_ulong         sc_r13;
+       l_ulong         sc_r14;
+       l_ulong         sc_r15;
+       l_ulong         sc_rdi;
+       l_ulong         sc_rsi;
+       l_ulong         sc_rbp;
+       l_ulong         sc_rbx;
+       l_ulong         sc_rdx;
+       l_ulong         sc_rax;
+       l_ulong         sc_rcx;
+       l_ulong         sc_rsp;
+       l_ulong         sc_rip;
+       l_ulong         sc_rflags;
+       l_ushort        sc_cs;
+       l_ushort        sc_gs;
+       l_ushort        sc_fs;
+       l_ushort        sc___pad0;
+       l_ulong         sc_err;
+       l_ulong         sc_trapno;
+       l_sigset_t      sc_mask;
+       l_ulong         sc_cr2;
+       struct l_fpstate *sc_fpstate;
+       l_ulong         sc_reserved1[8];
+};
+
+struct l_ucontext {
+       l_ulong         uc_flags;
+       l_uintptr_t     uc_link;
+       l_stack_t       uc_stack;
+       struct l_sigcontext     uc_mcontext;
+       l_sigset_t      uc_sigmask;
+};
+
+#define LINUX_SI_PREAMBLE_SIZE (4 * sizeof(int))
+#define        LINUX_SI_MAX_SIZE       128
+#define        LINUX_SI_PAD_SIZE       ((LINUX_SI_MAX_SIZE - \
+                                   LINUX_SI_PREAMBLE_SIZE) / sizeof(l_int))
+typedef union l_sigval {
+       l_int           sival_int;
+       l_uintptr_t     sival_ptr;
+} l_sigval_t;
+
+typedef struct l_siginfo {
+       l_int           lsi_signo;
+       l_int           lsi_errno;
+       l_int           lsi_code;
+       union {
+               l_int   _pad[LINUX_SI_PAD_SIZE];
+
+               struct {
+                       l_pid_t         _pid;
+                       l_uid_t         _uid;
+               } _kill;
+
+               struct {
+                       l_timer_t       _tid;
+                       l_int           _overrun;
+                       char            _pad[sizeof(l_uid_t) - sizeof(int)];
+                       union l_sigval  _sigval;
+                       l_uint          _sys_private;
+               } _timer;
+
+               struct {
+                       l_pid_t         _pid;           /* sender's pid */
+                       l_uid_t         _uid;           /* sender's uid */
+                       union l_sigval  _sigval;
+               } _rt;
+
+               struct {
+                       l_pid_t         _pid;           /* which child */
+                       l_uid_t         _uid;           /* sender's uid */
+                       l_int           _status;        /* exit code */
+                       l_clock_t       _utime;
+                       l_clock_t       _stime;
+               } _sigchld;
+
+               struct {
+                       l_uintptr_t     _addr;  /* Faulting insn/memory ref. */
+               } _sigfault;
+
+               struct {
+                       l_long          _band;  /* POLL_IN,POLL_OUT,POLL_MSG */
+                       l_int           _fd;
+               } _sigpoll;
+       } _sifields;
+} l_siginfo_t;
+
+#define        lsi_pid         _sifields._kill._pid
+#define        lsi_uid         _sifields._kill._uid
+#define        lsi_tid         _sifields._timer._tid
+#define        lsi_overrun     _sifields._timer._overrun
+#define        lsi_sys_private _sifields._timer._sys_private
+#define        lsi_status      _sifields._sigchld._status
+#define        lsi_utime       _sifields._sigchld._utime
+#define        lsi_stime       _sifields._sigchld._stime
+#define        lsi_value       _sifields._rt._sigval
+#define        lsi_int         _sifields._rt._sigval.sival_int
+#define        lsi_ptr         _sifields._rt._sigval.sival_ptr
+#define        lsi_addr        _sifields._sigfault._addr
+#define        lsi_band        _sifields._sigpoll._band
+#define        lsi_fd          _sifields._sigpoll._fd
+
+/*
+ * We make the stack look like Linux expects it when calling a signal
+ * handler, but use the BSD way of calling the handler and sigreturn().
+ * This means that we need to pass the pointer to the handler too.
+ * It is appended to the frame to not interfere with the rest of it.
+ */
+
+struct l_rt_sigframe {
+       struct l_ucontext       sf_sc;
+       struct l_siginfo        sf_si;
+       l_handler_t             sf_handler;
+};
+
+/*
+ * open/fcntl flags
+ */
+#define        LINUX_O_RDONLY          00000000
+#define        LINUX_O_WRONLY          00000001
+#define        LINUX_O_RDWR            00000002
+#define        LINUX_O_ACCMODE         00000003
+#define        LINUX_O_CREAT           00000100
+#define        LINUX_O_EXCL            00000200
+#define        LINUX_O_NOCTTY          00000400
+#define        LINUX_O_TRUNC           00001000
+#define        LINUX_O_APPEND          00002000
+#define        LINUX_O_NONBLOCK        00004000
+#define        LINUX_O_NDELAY          LINUX_O_NONBLOCK
+#define        LINUX_O_SYNC            00010000
+#define        LINUX_FASYNC            00020000
+#define        LINUX_O_DIRECT          00040000        /* Direct disk access 
hint */
+#define        LINUX_O_LARGEFILE       00100000
+#define        LINUX_O_DIRECTORY       00200000        /* Must be a directory 
*/
+#define        LINUX_O_NOFOLLOW        00400000        /* Do not follow links 
*/
+#define        LINUX_O_NOATIME         01000000
+#define        LINUX_O_CLOEXEC         02000000
+
+#define        LINUX_F_DUPFD           0
+#define        LINUX_F_GETFD           1
+#define        LINUX_F_SETFD           2
+#define        LINUX_F_GETFL           3
+#define        LINUX_F_SETFL           4
+#define        LINUX_F_GETLK           5
+#define        LINUX_F_SETLK           6
+#define        LINUX_F_SETLKW          7
+#define        LINUX_F_SETOWN          8
+#define        LINUX_F_GETOWN          9
+
+#define        LINUX_F_RDLCK           0
+#define        LINUX_F_WRLCK           1
+#define        LINUX_F_UNLCK           2
+
+/*
+ * mount flags
+ */
+#define        LINUX_MS_RDONLY         0x0001
+#define        LINUX_MS_NOSUID         0x0002
+#define        LINUX_MS_NODEV          0x0004
+#define        LINUX_MS_NOEXEC         0x0008
+#define        LINUX_MS_REMOUNT        0x0020
+
+/*
+ * SystemV IPC defines
+ */
+#define        LINUX_IPC_RMID          0
+#define        LINUX_IPC_SET           1
+#define        LINUX_IPC_STAT          2
+#define        LINUX_IPC_INFO          3
+
+#define        LINUX_SHM_LOCK          11
+#define        LINUX_SHM_UNLOCK        12
+#define        LINUX_SHM_STAT          13
+#define        LINUX_SHM_INFO          14
+
+#define        LINUX_SHM_RDONLY        0x1000
+#define        LINUX_SHM_RND           0x2000
+#define        LINUX_SHM_REMAP         0x4000
+
+/* semctl commands */
+#define        LINUX_GETPID            11
+#define        LINUX_GETVAL            12
+#define        LINUX_GETALL            13
+#define        LINUX_GETNCNT           14
+#define        LINUX_GETZCNT           15
+#define        LINUX_SETVAL            16
+#define        LINUX_SETALL            17
+#define        LINUX_SEM_STAT          18
+#define        LINUX_SEM_INFO          19
+
+union l_semun {
+       l_int           val;
+       l_uintptr_t     buf;
+       l_uintptr_t     array;
+       l_uintptr_t     __buf;
+       l_uintptr_t     __pad;
+};
+
+struct l_ipc_perm {
+       l_key_t         key;
+       l_uid_t         uid;
+       l_gid_t         gid;
+       l_uid_t         cuid;
+       l_gid_t         cgid;
+       l_ushort        mode;
+       l_ushort        seq;
+};
+
+/*
+ * Socket defines
+ */
+
+#define        LINUX_SOL_SOCKET        1
+#define        LINUX_SOL_IP            0
+#define        LINUX_SOL_IPX           256
+#define        LINUX_SOL_AX25          257
+#define        LINUX_SOL_TCP           6
+#define        LINUX_SOL_UDP           17
+
+#define        LINUX_SO_DEBUG          1
+#define        LINUX_SO_REUSEADDR      2
+#define        LINUX_SO_TYPE           3
+#define        LINUX_SO_ERROR          4
+#define        LINUX_SO_DONTROUTE      5
+#define        LINUX_SO_BROADCAST      6
+#define        LINUX_SO_SNDBUF         7
+#define        LINUX_SO_RCVBUF         8
+#define        LINUX_SO_KEEPALIVE      9
+#define        LINUX_SO_OOBINLINE      10
+#define        LINUX_SO_NO_CHECK       11
+#define        LINUX_SO_PRIORITY       12
+#define        LINUX_SO_LINGER         13
+#define        LINUX_SO_PASSCRED       16
+#define        LINUX_SO_PEERCRED       17
+#define        LINUX_SO_RCVLOWAT       18
+#define        LINUX_SO_SNDLOWAT       19
+#define        LINUX_SO_RCVTIMEO       20
+#define        LINUX_SO_SNDTIMEO       21
+#define        LINUX_SO_TIMESTAMP      29
+#define        LINUX_SO_ACCEPTCONN     30
+
+#define        LINUX_IP_TOS            1
+#define        LINUX_IP_TTL            2
+#define        LINUX_IP_HDRINCL        3
+#define        LINUX_IP_OPTIONS        4
+
+#define        LINUX_IP_MULTICAST_IF           32
+#define        LINUX_IP_MULTICAST_TTL          33
+#define        LINUX_IP_MULTICAST_LOOP         34
+#define        LINUX_IP_ADD_MEMBERSHIP         35
+#define        LINUX_IP_DROP_MEMBERSHIP        36
+
+struct l_sockaddr {
+       l_ushort        sa_family;
+       char            sa_data[14];
+};
+
+struct l_msghdr {
+       l_uintptr_t     msg_name;
+       l_int           msg_namelen;
+       l_uintptr_t     msg_iov;
+       l_size_t        msg_iovlen;
+       l_uintptr_t     msg_control;
+       l_size_t        msg_controllen;
+       l_uint          msg_flags;
+};
+
+struct l_cmsghdr {
+       l_size_t        cmsg_len;
+       l_int           cmsg_level;
+       l_int           cmsg_type;
+};
+
+struct l_ifmap {
+       l_ulong         mem_start;
+       l_ulong         mem_end;
+       l_ushort        base_addr;
+       u_char          irq;
+       u_char          dma;
+       u_char          port;
+} __packed;
+
+#define        LINUX_IFHWADDRLEN       6
+#define        LINUX_IFNAMSIZ          16
+
+struct l_ifreq {
+       union {
+               char    ifrn_name[LINUX_IFNAMSIZ];
+       } ifr_ifrn;
+
+       union {
+               struct l_sockaddr       ifru_addr;
+               struct l_sockaddr       ifru_dstaddr;
+               struct l_sockaddr       ifru_broadaddr;
+               struct l_sockaddr       ifru_netmask;
+               struct l_sockaddr       ifru_hwaddr;
+               l_short         ifru_flags[1];
+               l_int           ifru_metric;
+               l_int           ifru_mtu;
+               struct l_ifmap  ifru_map;
+               char            ifru_slave[LINUX_IFNAMSIZ];
+               l_uintptr_t     ifru_data;
+       } ifr_ifru;
+} __packed;
+
+#define        ifr_name        ifr_ifrn.ifrn_name      /* Interface name */
+#define        ifr_hwaddr      ifr_ifru.ifru_hwaddr    /* MAC address */
+
+struct l_ifconf {
+       int     ifc_len;
+       union {
+               l_uintptr_t     ifcu_buf;
+               l_uintptr_t     ifcu_req;
+       } ifc_ifcu;
+};
+
+#define        ifc_buf         ifc_ifcu.ifcu_buf
+#define        ifc_req         ifc_ifcu.ifcu_req
+
+/*
+ * poll()
+ */
+#define        LINUX_POLLIN            0x0001
+#define        LINUX_POLLPRI           0x0002
+#define        LINUX_POLLOUT           0x0004
+#define        LINUX_POLLERR           0x0008
+#define        LINUX_POLLHUP           0x0010
+#define        LINUX_POLLNVAL          0x0020
+#define        LINUX_POLLRDNORM        0x0040
+#define        LINUX_POLLRDBAND        0x0080
+#define        LINUX_POLLWRNORM        0x0100
+#define        LINUX_POLLWRBAND        0x0200
+#define        LINUX_POLLMSG           0x0400
+
+struct l_pollfd {
+       l_int           fd;
+       l_short         events;
+       l_short         revents;
+};
+
+
+#define        LINUX_CLONE_VM                  0x00000100
+#define        LINUX_CLONE_FS                  0x00000200
+#define        LINUX_CLONE_FILES               0x00000400
+#define        LINUX_CLONE_SIGHAND             0x00000800
+#define        LINUX_CLONE_PID                 0x00001000      /* No longer 
exist in Linux */
+#define        LINUX_CLONE_VFORK               0x00004000
+#define        LINUX_CLONE_PARENT              0x00008000
+#define        LINUX_CLONE_THREAD              0x00010000
+#define        LINUX_CLONE_SETTLS              0x00080000
+#define        LINUX_CLONE_PARENT_SETTID       0x00100000
+#define        LINUX_CLONE_CHILD_CLEARTID      0x00200000
+#define        LINUX_CLONE_CHILD_SETTID        0x01000000
+
+#define LINUX_ARCH_SET_GS              0x1001
+#define LINUX_ARCH_SET_FS              0x1002
+#define LINUX_ARCH_GET_GS              0x1003
+#define LINUX_ARCH_GET_FS              0x1004
+
+#define        linux_copyout_rusage(r, u)      copyout(r, u, sizeof(*r))
+
+/* robust futexes */
+struct linux_robust_list {
+       l_uintptr_t                     next;
+};
+ 
+struct linux_robust_list_head {
+       struct linux_robust_list        list;
+       l_long                          futex_offset;
+       l_uintptr_t                     pending_list;
+};
+
+#endif /* !_AMD64_LINUX_H_ */

Added: head/sys/amd64/linux/linux_dummy.c
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/amd64/linux/linux_dummy.c  Sun May 24 16:07:11 2015        
(r283424)
@@ -0,0 +1,154 @@
+/*-
+ * Copyright (c) 2013 Dmitry Chagin
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer
+ *    in this position and unchanged.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "opt_compat.h"
+#include "opt_kdtrace.h"
+
+#include <sys/param.h>
+#include <sys/kernel.h>
+#include <sys/sdt.h>
+#include <sys/systm.h>
+#include <sys/proc.h>
+
+#include <amd64/linux/linux.h>
+#include <amd64/linux/linux_proto.h>
+#include <compat/linux/linux_dtrace.h>
+#include <compat/linux/linux_util.h>
+
+/* DTrace init */
+LIN_SDT_PROVIDER_DECLARE(LINUX_DTRACE);
+
+DUMMY(mincore);
+DUMMY(sendfile);
+DUMMY(ptrace);
+DUMMY(syslog);
+DUMMY(setfsuid);
+DUMMY(setfsgid);
+DUMMY(sysfs);
+DUMMY(vhangup);
+DUMMY(pivot_root);
+DUMMY(adjtimex);
+DUMMY(swapoff);
+DUMMY(create_module);
+DUMMY(init_module);
+DUMMY(delete_module);
+DUMMY(get_kernel_syms);
+DUMMY(query_module);
+DUMMY(quotactl);
+DUMMY(nfsservctl);
+DUMMY(getpmsg);
+DUMMY(putpmsg);
+DUMMY(afs_syscall);
+DUMMY(tuxcall);
+DUMMY(security);
+DUMMY(set_thread_area);
+DUMMY(lookup_dcookie);
+DUMMY(epoll_create);
+DUMMY(epoll_ctl_old);
+DUMMY(epoll_wait_old);
+DUMMY(remap_file_pages);
+DUMMY(semtimedop);
+DUMMY(epoll_ctl);
+DUMMY(epoll_wait);
+DUMMY(mbind);
+DUMMY(get_mempolicy);
+DUMMY(set_mempolicy);
+DUMMY(mq_open);
+DUMMY(mq_unlink);
+DUMMY(mq_timedsend);
+DUMMY(mq_timedreceive);
+DUMMY(mq_notify);
+DUMMY(mq_getsetattr);
+DUMMY(kexec_load);
+DUMMY(add_key);
+DUMMY(request_key);
+DUMMY(keyctl);
+DUMMY(ioprio_set);
+DUMMY(ioprio_get);
+DUMMY(inotify_init);
+DUMMY(inotify_add_watch);
+DUMMY(inotify_rm_watch);
+DUMMY(migrate_pages);
+DUMMY(ppoll);
+DUMMY(unshare);
+DUMMY(splice);
+DUMMY(tee);
+DUMMY(sync_file_range);
+DUMMY(vmsplice);
+DUMMY(move_pages);
+DUMMY(utimensat);
+DUMMY(epoll_pwait);
+DUMMY(signalfd);
+DUMMY(timerfd);
+DUMMY(eventfd);
+DUMMY(fallocate);
+DUMMY(timerfd_settime);
+DUMMY(timerfd_gettime);
+DUMMY(signalfd4);
+DUMMY(eventfd2);
+DUMMY(epoll_create1);
+DUMMY(inotify_init1);
+DUMMY(preadv);
+DUMMY(pwritev);
+DUMMY(rt_tsigqueueinfo);
+DUMMY(perf_event_open);
+DUMMY(recvmmsg);
+DUMMY(fanotify_init);
+DUMMY(fanotify_mark);
+DUMMY(name_to_handle_at);
+DUMMY(open_by_handle_at);
+DUMMY(clock_adjtime);
+DUMMY(syncfs);
+DUMMY(sendmmsg);
+DUMMY(setns);
+DUMMY(process_vm_readv);
+DUMMY(process_vm_writev);
+DUMMY(kcmp);
+DUMMY(finit_module);
+
+#define DUMMY_XATTR(s)                                         \
+int                                                            \
+linux_ ## s ## xattr(                                          \
+    struct thread *td, struct linux_ ## s ## xattr_args *arg)  \
+{                                                              \
+                                                               \
+       return (ENOATTR);                                       \
+}
+DUMMY_XATTR(set);
+DUMMY_XATTR(lset);
+DUMMY_XATTR(fset);
+DUMMY_XATTR(get);
+DUMMY_XATTR(lget);
+DUMMY_XATTR(fget);
+DUMMY_XATTR(list);
+DUMMY_XATTR(llist);
+DUMMY_XATTR(flist);
+DUMMY_XATTR(remove);
+DUMMY_XATTR(lremove);
+DUMMY_XATTR(fremove);

Added: head/sys/amd64/linux/linux_genassym.c
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/amd64/linux/linux_genassym.c       Sun May 24 16:07:11 2015        
(r283424)
@@ -0,0 +1,15 @@
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/assym.h>
+#include <sys/systm.h>
+
+#include <amd64/linux/linux.h>
+#include <compat/linux/linux_mib.h>
+
+ASSYM(LINUX_RT_SIGF_HANDLER, offsetof(struct l_rt_sigframe, sf_handler));
+ASSYM(LINUX_RT_SIGF_UC, offsetof(struct l_rt_sigframe, sf_sc));
+ASSYM(LINUX_RT_SIGF_SC, offsetof(struct l_ucontext, uc_mcontext));
+ASSYM(LINUX_VERSION_CODE, LINUX_VERSION_CODE);
+ASSYM(LINUX_SC_RSP, offsetof(struct l_sigcontext, sc_rsp));

Added: head/sys/amd64/linux/linux_ipc64.h
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/amd64/linux/linux_ipc64.h  Sun May 24 16:07:11 2015        
(r283424)
@@ -0,0 +1,142 @@
+/*-
+ * Copyright (c) 2002 Maxim Sobolev <sobo...@freebsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer
+ *    in this position and unchanged.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _AMD64_LINUX_LINUX_IPC64_H_
+#define        _AMD64_LINUX_LINUX_IPC64_H_
+
+/*
+ * The ipc64_perm structure for i386 architecture.
+ * Note extra padding because this structure is passed back and forth
+ * between kernel and user space.
+ *
+ * Pad space is left for:
+ * - 32-bit mode_t and seq
+ * - 2 miscellaneous 32-bit values
+ */
+
+struct l_ipc64_perm
+{
+       l_key_t         key;
+       l_uid_t         uid;
+       l_gid_t         gid;
+       l_uid_t         cuid;
+       l_gid_t         cgid;
+       l_mode_t        mode;
+       l_ushort        __pad1;
+       l_ushort        seq;
+       l_ushort        __pad2;
+       l_ulong         __unused1;
+       l_ulong         __unused2;
+};
+
+/*
+ * The msqid64_ds structure for i386 architecture.
+ * Note extra padding because this structure is passed back and forth
+ * between kernel and user space.
+ *
+ * Pad space is left for:
+ * - 64-bit time_t to solve y2038 problem
+ * - 2 miscellaneous 32-bit values
+ */
+
+struct l_msqid64_ds {
+       struct l_ipc64_perm msg_perm;
+       l_time_t        msg_stime;      /* last msgsnd time */
+       l_ulong         __unused1;
+       l_time_t        msg_rtime;      /* last msgrcv time */
+       l_ulong         __unused2;
+       l_time_t        msg_ctime;      /* last change time */
+       l_ulong         __unused3;
+       l_ulong         msg_cbytes;     /* current number of bytes on queue */
+       l_ulong         msg_qnum;       /* number of messages in queue */
+       l_ulong         msg_qbytes;     /* max number of bytes on queue */
+       l_pid_t         msg_lspid;      /* pid of last msgsnd */
+       l_pid_t         msg_lrpid;      /* last receive pid */
+       l_ulong         __unused4;
+       l_ulong         __unused5;
+};
+
+/*
+ * The semid64_ds structure for i386 architecture.
+ * Note extra padding because this structure is passed back and forth
+ * between kernel and user space.
+ *
+ * Pad space is left for:
+ * - 64-bit time_t to solve y2038 problem
+ * - 2 miscellaneous 32-bit values
+ */
+
+struct l_semid64_ds {
+       struct l_ipc64_perm sem_perm;   /* permissions */
+       l_time_t        sem_otime;      /* last semop time */
+       l_ulong         __unused1;
+       l_time_t        sem_ctime;      /* last change time */
+       l_ulong         __unused2;
+       l_ulong         sem_nsems;      /* no. of semaphores in array */
+       l_ulong         __unused3;
+       l_ulong         __unused4;
+};
+
+/*
+ * The shmid64_ds structure for i386 architecture.
+ * Note extra padding because this structure is passed back and forth
+ * between kernel and user space.
+ *
+ * Pad space is left for:
+ * - 64-bit time_t to solve y2038 problem
+ * - 2 miscellaneous 32-bit values
+ */
+
+struct l_shmid64_ds {
+       struct l_ipc64_perm shm_perm;   /* operation perms */
+       l_size_t        shm_segsz;      /* size of segment (bytes) */
+       l_time_t        shm_atime;      /* last attach time */
+       l_time_t        shm_dtime;      /* last detach time */
+       l_time_t        shm_ctime;      /* last change time */
+       l_pid_t         shm_cpid;       /* pid of creator */
+       l_pid_t         shm_lpid;       /* pid of last operator */
+       l_ulong         shm_nattch;     /* no. of current attaches */
+       l_ulong         __unused4;
+       l_ulong         __unused5;
+};
+
+struct l_shminfo64 {
+       l_ulong         shmmax;
+       l_ulong         shmmin;
+       l_ulong         shmmni;

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to