1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | /* |
3 | * AArch64-specific system calls implementation |
4 | * |
5 | * Copyright (C) 2012 ARM Ltd. |
6 | * Author: Catalin Marinas <catalin.marinas@arm.com> |
7 | */ |
8 | |
9 | #include <linux/compiler.h> |
10 | #include <linux/errno.h> |
11 | #include <linux/fs.h> |
12 | #include <linux/mm.h> |
13 | #include <linux/export.h> |
14 | #include <linux/sched.h> |
15 | #include <linux/slab.h> |
16 | #include <linux/syscalls.h> |
17 | |
18 | #include <asm/cpufeature.h> |
19 | #include <asm/syscall.h> |
20 | |
21 | SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len, |
22 | unsigned long, prot, unsigned long, flags, |
23 | unsigned long, fd, unsigned long, off) |
24 | { |
25 | if (offset_in_page(off) != 0) |
26 | return -EINVAL; |
27 | |
28 | return ksys_mmap_pgoff(addr, len, prot, flags, fd, pgoff: off >> PAGE_SHIFT); |
29 | } |
30 | |
31 | SYSCALL_DEFINE1(arm64_personality, unsigned int, personality) |
32 | { |
33 | if (personality(personality) == PER_LINUX32 && |
34 | !system_supports_32bit_el0()) |
35 | return -EINVAL; |
36 | return ksys_personality(personality); |
37 | } |
38 | |
39 | asmlinkage long sys_ni_syscall(void); |
40 | |
41 | asmlinkage long __arm64_sys_ni_syscall(const struct pt_regs *__unused) |
42 | { |
43 | return sys_ni_syscall(); |
44 | } |
45 | |
46 | /* |
47 | * Wrappers to pass the pt_regs argument. |
48 | */ |
49 | #define __arm64_sys_personality __arm64_sys_arm64_personality |
50 | |
51 | #undef __SYSCALL |
52 | #define __SYSCALL(nr, sym) asmlinkage long __arm64_##sym(const struct pt_regs *); |
53 | #include <asm/unistd.h> |
54 | |
55 | #undef __SYSCALL |
56 | #define __SYSCALL(nr, sym) [nr] = __arm64_##sym, |
57 | |
58 | const syscall_fn_t sys_call_table[__NR_syscalls] = { |
59 | [0 ... __NR_syscalls - 1] = __arm64_sys_ni_syscall, |
60 | #include <asm/unistd.h> |
61 | }; |
62 | |