]> git.ipfire.org Git - thirdparty/linux.git/blame - arch/um/kernel/skas/syscall.c
Merge tag 'io_uring-5.7-2020-05-22' of git://git.kernel.dk/linux-block
[thirdparty/linux.git] / arch / um / kernel / skas / syscall.c
CommitLineData
0d1fb0a4 1// SPDX-License-Identifier: GPL-2.0
e32dacb9 2/*
ba180fd4 3 * Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
e32dacb9
JD
4 */
5
37185b33
AV
6#include <linux/kernel.h>
7#include <linux/ptrace.h>
c50b4659 8#include <linux/seccomp.h>
37185b33
AV
9#include <kern_util.h>
10#include <sysdep/ptrace.h>
e04c989e 11#include <sysdep/ptrace_user.h>
37185b33 12#include <sysdep/syscalls.h>
f185063b 13#include <linux/time-internal.h>
e6da5df0 14#include <asm/unistd.h>
e32dacb9 15
77bf4400 16void handle_syscall(struct uml_pt_regs *r)
e32dacb9
JD
17{
18 struct pt_regs *regs = container_of(r, struct pt_regs, regs);
e32dacb9 19 int syscall;
e32dacb9 20
06503870
JB
21 /*
22 * If we have infinite CPU resources, then make every syscall also a
23 * preemption point, since we don't have any other preemption in this
24 * case, and kernel threads would basically never run until userspace
25 * went to sleep, even if said userspace interacts with the kernel in
26 * various ways.
27 */
88ce6424
JB
28 if (time_travel_mode == TT_MODE_INFCPU ||
29 time_travel_mode == TT_MODE_EXTERNAL)
06503870
JB
30 schedule();
31
e04c989e
MS
32 /* Initialize the syscall number and default return value. */
33 UPT_SYSCALL_NR(r) = PT_SYSCALL_NR(r->gp);
34 PT_REGS_SET_SYSCALL_RETURN(regs, -ENOSYS);
35
26703c63 36 if (syscall_trace_enter(regs))
972939e2 37 goto out;
c50b4659 38
26703c63 39 /* Do the seccomp check after ptrace; failures should be fast. */
fefad9ef 40 if (secure_computing() == -1)
972939e2 41 goto out;
e32dacb9 42
e04c989e 43 syscall = UPT_SYSCALL_NR(r);
e04c989e
MS
44 if (syscall >= 0 && syscall <= __NR_syscall_max)
45 PT_REGS_SET_SYSCALL_RETURN(regs,
46 EXECUTE_SYSCALL(syscall, regs));
e32dacb9 47
972939e2 48out:
1bfa2317 49 syscall_trace_leave(regs);
e32dacb9 50}