Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys add support COMPAT_LINUX for aarch64



details:   https://anonhg.NetBSD.org/src/rev/6c9ba2eda130
branches:  trunk
changeset: 987003:6c9ba2eda130
user:      ryo <ryo%NetBSD.org@localhost>
date:      Thu Sep 23 06:56:26 2021 +0000

description:
add support COMPAT_LINUX for aarch64

diffstat:

 sys/arch/aarch64/aarch64/linux_syscall.c            |    58 +
 sys/arch/aarch64/aarch64/syscall.c                  |    34 +-
 sys/arch/aarch64/conf/files.aarch64                 |    12 +-
 sys/arch/evbarm/conf/GENERIC64                      |     6 +-
 sys/compat/linux/arch/aarch64/Makefile              |     3 +
 sys/compat/linux/arch/aarch64/files.linux_aarch64   |     9 +
 sys/compat/linux/arch/aarch64/linux_commons.c       |    37 +
 sys/compat/linux/arch/aarch64/linux_errno.h         |    35 +
 sys/compat/linux/arch/aarch64/linux_exec.h          |    37 +
 sys/compat/linux/arch/aarch64/linux_fcntl.h         |    72 +
 sys/compat/linux/arch/aarch64/linux_machdep.c       |   258 +
 sys/compat/linux/arch/aarch64/linux_machdep.h       |    84 +
 sys/compat/linux/arch/aarch64/linux_mmap.h          |    40 +
 sys/compat/linux/arch/aarch64/linux_sigarray.c      |    95 +
 sys/compat/linux/arch/aarch64/linux_sigcode.S       |    43 +
 sys/compat/linux/arch/aarch64/linux_siginfo.h       |   107 +
 sys/compat/linux/arch/aarch64/linux_signal.h        |   117 +
 sys/compat/linux/arch/aarch64/linux_socket.h        |    34 +
 sys/compat/linux/arch/aarch64/linux_syscall.h       |   590 ++
 sys/compat/linux/arch/aarch64/linux_syscallargs.h   |  1357 ++++
 sys/compat/linux/arch/aarch64/linux_syscalls.c      |  1114 ++++
 sys/compat/linux/arch/aarch64/linux_sysent.c        |  1946 +++++++
 sys/compat/linux/arch/aarch64/linux_systrace_args.c |  5268 +++++++++++++++++++
 sys/compat/linux/arch/aarch64/linux_termios.h       |   225 +
 sys/compat/linux/arch/aarch64/linux_types.h         |    96 +
 sys/compat/linux/arch/aarch64/syscalls.conf         |    16 +
 sys/compat/linux/arch/aarch64/syscalls.master       |   676 ++
 sys/compat/linux/common/linux_break.c               |     6 +-
 sys/compat/linux/common/linux_errno.h               |     4 +-
 sys/compat/linux/common/linux_exec.h                |     4 +-
 sys/compat/linux/common/linux_fcntl.h               |     4 +-
 sys/compat/linux/common/linux_file.c                |    18 +-
 sys/compat/linux/common/linux_file64.c              |     6 +-
 sys/compat/linux/common/linux_ioctl.h               |     4 +-
 sys/compat/linux/common/linux_ipccall.c             |     6 +-
 sys/compat/linux/common/linux_ipccall.h             |     6 +-
 sys/compat/linux/common/linux_llseek.c              |     6 +-
 sys/compat/linux/common/linux_machdep.h             |     4 +-
 sys/compat/linux/common/linux_misc.c                |    12 +-
 sys/compat/linux/common/linux_misc_notalpha.c       |    31 +-
 sys/compat/linux/common/linux_mmap.h                |     4 +-
 sys/compat/linux/common/linux_oldmmap.c             |     6 +-
 sys/compat/linux/common/linux_oldmmap.h             |     4 +-
 sys/compat/linux/common/linux_oldolduname.c         |     6 +-
 sys/compat/linux/common/linux_oldolduname.h         |     4 +-
 sys/compat/linux/common/linux_oldselect.c           |     6 +-
 sys/compat/linux/common/linux_oldselect.h           |     4 +-
 sys/compat/linux/common/linux_olduname.c            |     6 +-
 sys/compat/linux/common/linux_olduname.h            |     4 +-
 sys/compat/linux/common/linux_pipe.c                |     8 +-
 sys/compat/linux/common/linux_sem.h                 |     4 +-
 sys/compat/linux/common/linux_sig_notalpha.c        |     6 +-
 sys/compat/linux/common/linux_sigaction.c           |     6 +-
 sys/compat/linux/common/linux_siginfo.h             |     4 +-
 sys/compat/linux/common/linux_signal.c              |    14 +-
 sys/compat/linux/common/linux_signal.h              |     8 +-
 sys/compat/linux/common/linux_signo.c               |     6 +-
 sys/compat/linux/common/linux_socket.c              |    12 +-
 sys/compat/linux/common/linux_socket.h              |     5 +-
 sys/compat/linux/common/linux_socketcall.c          |     6 +-
 sys/compat/linux/common/linux_socketcall.h          |     6 +-
 sys/compat/linux/common/linux_sysctl.c              |     7 +-
 sys/compat/linux/common/linux_termios.h             |     4 +-
 sys/compat/linux/common/linux_types.h               |     4 +-
 sys/compat/linux/linux_syscall.h                    |     4 +-
 sys/compat/linux/linux_syscallargs.h                |     4 +-
 sys/compat/linux/linux_syscalls.c                   |     6 +-
 67 files changed, 12523 insertions(+), 115 deletions(-)

diffs (truncated from 13818 to 300 lines):

diff -r 0ff8869f3aa6 -r 6c9ba2eda130 sys/arch/aarch64/aarch64/linux_syscall.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/aarch64/aarch64/linux_syscall.c  Thu Sep 23 06:56:26 2021 +0000
@@ -0,0 +1,58 @@
+/*     $NetBSD: linux_syscall.c,v 1.1 2021/09/23 06:56:26 ryo Exp $    */
+
+/*
+ * Copyright (c) 2021 Ryo Shimizu <ryo%nerv.org@localhost>
+ * 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.
+ * 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>
+__KERNEL_RCSID(0, "$NetBSD: linux_syscall.c,v 1.1 2021/09/23 06:56:26 ryo Exp $");
+
+#if defined(_KERNEL_OPT)
+#include "opt_compat_linux.h"
+#endif
+
+#include <compat/linux/linux_syscall.h>
+#include <compat/linux/common/linux_errno.h>
+
+#define EMULNAME(x)            __CONCAT(linux_,x)
+#define EMULNAMEU(x)           __CONCAT(LINUX_,x)
+
+
+/*
+ * syscall.c behavior options
+ */
+
+/*
+ * linux/arm64 always uses indirect syscall, and ignores code of 'svc #<code>'.
+ * The system call number is specified by the x8 register.
+ */
+#define SYSCALL_CODE_REG       8
+#define SYSCALL_NO_INDIRECT
+
+/* used when __HAVE_MINIMAL_EMUL is not defined */
+#define SYSCALL_EMUL_ERRNO(x)  native_to_linux_errno[x]
+
+
+#include "syscall.c"
diff -r 0ff8869f3aa6 -r 6c9ba2eda130 sys/arch/aarch64/aarch64/syscall.c
--- a/sys/arch/aarch64/aarch64/syscall.c        Thu Sep 23 06:34:00 2021 +0000
+++ b/sys/arch/aarch64/aarch64/syscall.c        Thu Sep 23 06:56:26 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: syscall.c,v 1.6 2019/04/10 06:30:05 ryo Exp $  */
+/*     $NetBSD: syscall.c,v 1.7 2021/09/23 06:56:26 ryo Exp $  */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -29,8 +29,6 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
-/* DO NOT INCLUDE opt_compat_XXX.h */
-
 #include <sys/param.h>
 #include <sys/cpu.h>
 #include <sys/ktrace.h>
@@ -58,10 +56,12 @@
 #ifndef EMULNAME
 #include <sys/syscall.h>
 
+#define SYSCALL_INDIRECT_CODE_REG      17      /* netbsd/aarch64 use x17 */
+
 #define EMULNAME(x)    (x)
 #define EMULNAMEU(x)   (x)
 
-__KERNEL_RCSID(0, "$NetBSD: syscall.c,v 1.6 2019/04/10 06:30:05 ryo Exp $");
+__KERNEL_RCSID(0, "$NetBSD: syscall.c,v 1.7 2021/09/23 06:56:26 ryo Exp $");
 
 void
 cpu_spawn_return(struct lwp *l)
@@ -99,18 +99,33 @@
 
        curcpu()->ci_data.cpu_nsyscall++;
 
-       size_t code = tf->tf_esr & 0xffff;
        register_t *params = (void *)tf->tf_reg;
        size_t nargs = NARGREG;
+#ifdef SYSCALL_CODE_REG
+       /*
+        * mov x<SYSCALL_CODE_REG>, #<syscall_no>
+        * svc #<optional>
+        */
+       size_t code = tf->tf_reg[SYSCALL_CODE_REG];
+#if (SYSCALL_CODE_REG == 0)
+       params++;
+#endif
+#else /* SYSCALL_CODE_REG */
+       /*
+        * svc #<syscall_no>
+        */
+       size_t code = tf->tf_esr & 0xffff;
+#endif /* SYSCALL_CODE_REG */
 
+#ifndef SYSCALL_NO_INDIRECT
        switch (code) {
        case EMULNAMEU(SYS_syscall):
-#if !defined(COMPAT_LINUX)
        case EMULNAMEU(SYS___syscall):
-               code = tf->tf_reg[17];
-#else
+#if (SYSCALL_INDIRECT_CODE_REG == 0)
                code = *params++;
                nargs -= 1;
+#else
+               code = tf->tf_reg[SYSCALL_INDIRECT_CODE_REG];
 #endif
                /*
                 * code is first argument,
@@ -120,6 +135,7 @@
        default:
                break;
        }
+#endif /* !SYSCALL_NO_INDIRECT */
 
        code &= EMULNAMEU(SYS_NSYSENT) - 1;
        const struct sysent * const callp = p->p_emul->e_sysent + code;
@@ -209,6 +225,8 @@
 #ifndef __HAVE_MINIMAL_EMUL
                        if (p->p_emul->e_errno)
                                error = p->p_emul->e_errno[error];
+#elif defined(SYSCALL_EMUL_ERRNO)
+                       error = SYSCALL_EMUL_ERRNO(error);
 #endif
                        tf->tf_reg[0] = error;
                        tf->tf_spsr |= NZCV_C;
diff -r 0ff8869f3aa6 -r 6c9ba2eda130 sys/arch/aarch64/conf/files.aarch64
--- a/sys/arch/aarch64/conf/files.aarch64       Thu Sep 23 06:34:00 2021 +0000
+++ b/sys/arch/aarch64/conf/files.aarch64       Thu Sep 23 06:56:26 2021 +0000
@@ -1,4 +1,4 @@
-#      $NetBSD: files.aarch64,v 1.32 2021/08/06 19:38:53 jmcneill Exp $
+#      $NetBSD: files.aarch64,v 1.33 2021/09/23 06:56:26 ryo Exp $
 
 defflag opt_cpuoptions.h       AARCH64_ALIGNMENT_CHECK
 defflag opt_cpuoptions.h       AARCH64_EL0_STACK_ALIGNMENT_CHECK
@@ -126,12 +126,10 @@
 file   arch/aarch64/aarch64/netbsd32_syscall.c         compat_netbsd32
 
 # Linux binary compatibility (COMPAT_LINUX)
-#include "compat/ossaudio/files.ossaudio"
-#include "compat/linux/files.linux"
-#include "compat/linux/arch/aarch64/files.linux_aarch64"
-#file  arch/aarch64/aarch64/linux_sigcode.S    compat_linux
-#file  arch/aarch64/aarch64/linux_syscall.c    compat_linux
-#file  arch/aarch64/aarch64/linux_trap.c       compat_linux
+include "compat/ossaudio/files.ossaudio"
+include "compat/linux/files.linux"
+include "compat/linux/arch/aarch64/files.linux_aarch64"
+file   arch/aarch64/aarch64/linux_syscall.c    compat_linux
 
 # profiling support
 file   dev/tprof/tprof_armv8.c                 tprof   needs-flag
diff -r 0ff8869f3aa6 -r 6c9ba2eda130 sys/arch/evbarm/conf/GENERIC64
--- a/sys/arch/evbarm/conf/GENERIC64    Thu Sep 23 06:34:00 2021 +0000
+++ b/sys/arch/evbarm/conf/GENERIC64    Thu Sep 23 06:56:26 2021 +0000
@@ -1,5 +1,5 @@
 #
-#      $NetBSD: GENERIC64,v 1.185 2021/09/13 23:31:23 jmcneill Exp $
+#      $NetBSD: GENERIC64,v 1.186 2021/09/23 06:56:27 ryo Exp $
 #
 #      GENERIC ARM (aarch64) kernel
 #
@@ -89,6 +89,10 @@
 options        COMPAT_NETBSD32
 options        EXEC_ELF32
 
+#options       COMPAT_LINUX    # binary compatibility with Linux
+#options       COMPAT_50       # COMPAT_LINUX depends on
+#options       COMPAT_OSSAUDIO # binary compatibility with Linux
+
 # EFI runtime support
 options        EFI_RUNTIME
 
diff -r 0ff8869f3aa6 -r 6c9ba2eda130 sys/compat/linux/arch/aarch64/Makefile
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/compat/linux/arch/aarch64/Makefile    Thu Sep 23 06:56:26 2021 +0000
@@ -0,0 +1,3 @@
+#      $NetBSD: Makefile,v 1.1 2021/09/23 06:56:27 ryo Exp $
+
+.include <../../Makefile.inc>
diff -r 0ff8869f3aa6 -r 6c9ba2eda130 sys/compat/linux/arch/aarch64/files.linux_aarch64
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/compat/linux/arch/aarch64/files.linux_aarch64 Thu Sep 23 06:56:26 2021 +0000
@@ -0,0 +1,9 @@
+#      $NetBSD: files.linux_aarch64,v 1.1 2021/09/23 06:56:27 ryo Exp $
+#
+# Config file description for aarch64-dependent Linux compat code.
+
+file   compat/linux/arch/aarch64/linux_machdep.c       compat_linux
+file   compat/linux/arch/aarch64/linux_commons.c       compat_linux
+file   compat/linux/arch/aarch64/linux_syscalls.c      compat_linux
+file   compat/linux/arch/aarch64/linux_sysent.c        compat_linux
+file   compat/linux/arch/aarch64/linux_sigcode.S       compat_linux
diff -r 0ff8869f3aa6 -r 6c9ba2eda130 sys/compat/linux/arch/aarch64/linux_commons.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/compat/linux/arch/aarch64/linux_commons.c     Thu Sep 23 06:56:26 2021 +0000
@@ -0,0 +1,37 @@
+/*     $NetBSD: linux_commons.c,v 1.1 2021/09/23 06:56:27 ryo Exp $    */
+
+/*
+ * This file includes C files from the common
+ * area to decrese the number of files to compile
+ * in order to make building a kernel go faster.
+ *
+ * Option headers and headers which depend on
+ * certain options being set need to be included
+ * here.  This ensures that a header file sees
+ * the options it needs even if one of included
+ * C files doesn't use it.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: linux_commons.c,v 1.1 2021/09/23 06:56:27 ryo Exp $");
+
+#if defined(_KERNEL_OPT)
+#include "opt_sysv.h"
+#endif
+
+#include <sys/param.h>
+#include <sys/mount.h>
+#include <sys/signal.h>
+#include <sys/syscallargs.h>
+
+#include <compat/linux/common/linux_signal.h>
+#include <compat/linux/common/linux_types.h>
+#include <compat/linux/common/linux_ipc.h>
+#include <compat/linux/common/linux_sem.h>
+
+#include <compat/linux/linux_syscallargs.h>
+
+#include "../../common/linux_pipe.c"
+#include "../../common/linux_file64.c"
+#include "../../common/linux_misc_notalpha.c"
+#include "../../common/linux_fadvise64.c"
diff -r 0ff8869f3aa6 -r 6c9ba2eda130 sys/compat/linux/arch/aarch64/linux_errno.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/compat/linux/arch/aarch64/linux_errno.h       Thu Sep 23 06:56:26 2021 +0000
@@ -0,0 +1,35 @@
+/*     $NetBSD: linux_errno.h,v 1.1 2021/09/23 06:56:27 ryo Exp $      */
+
+/*-
+ * Copyright (c) 2021 The NetBSD Foundation, Inc.
+ * 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.
+ * 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``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 FOUNDATION OR CONTRIBUTORS
+ * 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.
+ */
+
+#ifndef _AARCH64_LINUX_ERRNO_H
+#define _AARCH64_LINUX_ERRNO_H
+
+#include <compat/linux/common/linux_errno_generic.h>
+#define LINUX_SCERR_SIGN -
+
+#endif /* !_AARCH64_LINUX_ERRNO_H */
diff -r 0ff8869f3aa6 -r 6c9ba2eda130 sys/compat/linux/arch/aarch64/linux_exec.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/compat/linux/arch/aarch64/linux_exec.h        Thu Sep 23 06:56:26 2021 +0000
@@ -0,0 +1,37 @@



Home | Main Index | Thread Index | Old Index