git: ee55d560e89a - main - linux(4): Add a simple rseq syscall implementation.
Date: Tue, 26 Apr 2022 16:37:14 UTC
The branch main has been updated by dchagin: URL: https://cgit.FreeBSD.org/src/commit/?id=ee55d560e89ac8de37def993a13d2582638273b7 commit ee55d560e89ac8de37def993a13d2582638273b7 Author: Dmitry Chagin <dchagin@FreeBSD.org> AuthorDate: 2022-04-26 16:35:56 +0000 Commit: Dmitry Chagin <dchagin@FreeBSD.org> CommitDate: 2022-04-26 16:35:56 +0000 linux(4): Add a simple rseq syscall implementation. To avoid annoyng messages from glibc-2.35 test suite add the simple implementation of rseq syscall which is do nothing for now. I plan to implement it if and when the API stabilizes. MFC after: 2 weeks --- sys/compat/linux/linux_dummy.c | 1 - sys/compat/linux/linux_rseq.c | 87 ++++++++++++++++++++++++++++++++++++++++++ sys/modules/linux/Makefile | 2 +- sys/modules/linux64/Makefile | 2 +- 4 files changed, 89 insertions(+), 3 deletions(-) diff --git a/sys/compat/linux/linux_dummy.c b/sys/compat/linux/linux_dummy.c index e254bf94c026..57360c0d1a00 100644 --- a/sys/compat/linux/linux_dummy.c +++ b/sys/compat/linux/linux_dummy.c @@ -144,7 +144,6 @@ DUMMY(epoll_pwait2); DUMMY(mount_setattr); /* Linux 4.18: */ DUMMY(io_pgetevents); -DUMMY(rseq); /* Linux 5.0: */ DUMMY(pidfd_send_signal); DUMMY(io_uring_setup); diff --git a/sys/compat/linux/linux_rseq.c b/sys/compat/linux/linux_rseq.c new file mode 100644 index 000000000000..89bf526a4271 --- /dev/null +++ b/sys/compat/linux/linux_rseq.c @@ -0,0 +1,87 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2022 Dmitry Chagin <dchagin@FreeBSD.org> + * + * 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 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 AUTHOR 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. + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include <sys/param.h> +#include <sys/systm.h> + +#ifdef COMPAT_LINUX32 +#include <machine/../linux32/linux.h> +#include <machine/../linux32/linux32_proto.h> +#else +#include <machine/../linux/linux.h> +#include <machine/../linux/linux_proto.h> +#endif + + +enum linux_rseq_cpu_id_state { + LINUX_RSEQ_CPU_ID_UNINITIALIZED = -1, + LINUX_RSEQ_CPU_ID_REGISTRATION_FAILED = -2, +}; + +enum linux_rseq_flags { + LINUX_RSEQ_FLAG_UNREGISTER = (1 << 0), +}; + +enum linux_rseq_cs_flags_bit { + LINUX_RSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT_BIT = 0, + LINUX_RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL_BIT = 1, + LINUX_RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE_BIT = 2, +}; + +enum linux_rseq_cs_flags { + LINUX_RSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT = + (1U << LINUX_RSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT_BIT), + LINUX_RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL = + (1U << LINUX_RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL_BIT), + LINUX_RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE = + (1U << LINUX_RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE_BIT), +}; + +struct linux_rseq_cs { + uint32_t version; + uint32_t flags; + uint64_t start_ip; + uint64_t post_commit_offset; + uint64_t abort_ip; +} __attribute__((aligned(4 * sizeof(uint64_t)))); + +struct linux_rseq { + uint32_t cpu_id_start; + uint32_t cpu_id; + uint64_t rseq_cs; + uint32_t flags; +} __attribute__((aligned(4 * sizeof(uint64_t)))); + +int +linux_rseq(struct thread *td, struct linux_rseq_args *args) +{ + + return (ENOSYS); +} diff --git a/sys/modules/linux/Makefile b/sys/modules/linux/Makefile index 089187ca7cff..9b4453045c09 100644 --- a/sys/modules/linux/Makefile +++ b/sys/modules/linux/Makefile @@ -16,7 +16,7 @@ SRCS= linux_fork.c linux${SFX}_dummy_machdep.c linux_file.c linux_event.c \ linux${SFX}_machdep.c linux_misc.c linux_signal.c \ linux_socket.c linux_stats.c linux_sysctl.c linux${SFX}_sysent.c \ linux${SFX}_sysvec.c linux_uid16.c linux_time.c \ - linux_timer.c linux_vdso.c \ + linux_timer.c linux_vdso.c linux_rseq.c \ opt_inet6.h opt_compat.h opt_posix.h opt_usb.h vnode_if.h \ device_if.h bus_if.h .if ${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "amd64" diff --git a/sys/modules/linux64/Makefile b/sys/modules/linux64/Makefile index e2a408f49bad..4a4a84d38c73 100644 --- a/sys/modules/linux64/Makefile +++ b/sys/modules/linux64/Makefile @@ -10,7 +10,7 @@ SRCS= linux_elf64.c linux_fork.c linux_dummy_machdep.c linux_file.c \ linux_event.c linux_futex.c linux_getcwd.c linux_ioctl.c linux_ipc.c \ linux_machdep.c linux_misc.c linux_ptrace.c linux_signal.c \ linux_socket.c linux_stats.c linux_sysctl.c linux_sysent.c \ - linux_sysvec.c linux_time.c linux_vdso.c linux_timer.c \ + linux_sysvec.c linux_time.c linux_vdso.c linux_timer.c linux_rseq.c \ opt_compat.h opt_inet6.h opt_posix.h opt_usb.h \ vnode_if.h device_if.h bus_if.h \ linux_support.s