-
Notifications
You must be signed in to change notification settings - Fork 52.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
arm64: convert raw syscall invocation to C
As a first step towards invoking syscalls with a pt_regs argument, convert the raw syscall invocation logic to C. We end up with a bit more register shuffling, but the unified invocation logic means we can unify the tracing paths, too. Previously, assembly had to open-code calls to ni_sys() when the system call number was out-of-bounds for the relevant syscall table. This case is now handled by invoke_syscall(), and the assembly no longer need to handle this case explicitly. This allows the tracing paths to be simplified and unified, as we no longer need the __ni_sys_trace path and the __sys_trace_return label. This only converts the invocation of the syscall. The rest of the syscall triage and tracing is left in assembly for now, and will be converted in subsequent patches. Signed-off-by: Mark Rutland <mark.rutland@arm.com> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> Cc: Will Deacon <will.deacon@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com>
- Loading branch information
Showing
4 changed files
with
59 additions
and
43 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
|
||
#include <linux/errno.h> | ||
#include <linux/nospec.h> | ||
#include <linux/ptrace.h> | ||
#include <linux/syscalls.h> | ||
|
||
#include <asm/syscall.h> | ||
|
||
long compat_arm_syscall(struct pt_regs *regs); | ||
|
||
asmlinkage long do_ni_syscall(struct pt_regs *regs) | ||
{ | ||
#ifdef CONFIG_COMPAT | ||
long ret; | ||
if (is_compat_task()) { | ||
ret = compat_arm_syscall(regs); | ||
if (ret != -ENOSYS) | ||
return ret; | ||
} | ||
#endif | ||
|
||
return sys_ni_syscall(); | ||
} | ||
|
||
static long __invoke_syscall(struct pt_regs *regs, syscall_fn_t syscall_fn) | ||
{ | ||
return syscall_fn(regs->regs[0], regs->regs[1], regs->regs[2], | ||
regs->regs[3], regs->regs[4], regs->regs[5]); | ||
} | ||
|
||
asmlinkage void invoke_syscall(struct pt_regs *regs, unsigned int scno, | ||
unsigned int sc_nr, | ||
const syscall_fn_t syscall_table[]) | ||
{ | ||
long ret; | ||
|
||
if (scno < sc_nr) { | ||
syscall_fn_t syscall_fn; | ||
syscall_fn = syscall_table[array_index_nospec(scno, sc_nr)]; | ||
ret = __invoke_syscall(regs, syscall_fn); | ||
} else { | ||
ret = do_ni_syscall(regs); | ||
} | ||
|
||
regs->regs[0] = ret; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters