Line data Source code
1 : // SPDX-License-Identifier: GPL-2.0 2 : /* 3 : * Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) 4 : */ 5 : 6 : #include <linux/kernel.h> 7 : #include <linux/ptrace.h> 8 : #include <linux/seccomp.h> 9 : #include <kern_util.h> 10 : #include <sysdep/ptrace.h> 11 : #include <sysdep/ptrace_user.h> 12 : #include <sysdep/syscalls.h> 13 : #include <linux/time-internal.h> 14 : #include <asm/unistd.h> 15 : 16 0 : void handle_syscall(struct uml_pt_regs *r) 17 : { 18 0 : struct pt_regs *regs = container_of(r, struct pt_regs, regs); 19 : int syscall; 20 : 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 : */ 28 : if (time_travel_mode == TT_MODE_INFCPU || 29 : time_travel_mode == TT_MODE_EXTERNAL) 30 : schedule(); 31 : 32 : /* Initialize the syscall number and default return value. */ 33 0 : UPT_SYSCALL_NR(r) = PT_SYSCALL_NR(r->gp); 34 0 : PT_REGS_SET_SYSCALL_RETURN(regs, -ENOSYS); 35 : 36 0 : if (syscall_trace_enter(regs)) 37 : goto out; 38 : 39 : /* Do the seccomp check after ptrace; failures should be fast. */ 40 0 : if (secure_computing() == -1) 41 : goto out; 42 : 43 0 : syscall = UPT_SYSCALL_NR(r); 44 0 : if (syscall >= 0 && syscall < __NR_syscalls) 45 0 : PT_REGS_SET_SYSCALL_RETURN(regs, 46 : EXECUTE_SYSCALL(syscall, regs)); 47 : 48 : out: 49 0 : syscall_trace_leave(regs); 50 0 : }