1*caab277bSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 27992d60dSCatalin Marinas /* 37992d60dSCatalin Marinas * AArch64-specific system calls implementation 47992d60dSCatalin Marinas * 57992d60dSCatalin Marinas * Copyright (C) 2012 ARM Ltd. 67992d60dSCatalin Marinas * Author: Catalin Marinas <[email protected]> 77992d60dSCatalin Marinas */ 87992d60dSCatalin Marinas 97992d60dSCatalin Marinas #include <linux/compiler.h> 107992d60dSCatalin Marinas #include <linux/errno.h> 117992d60dSCatalin Marinas #include <linux/fs.h> 127992d60dSCatalin Marinas #include <linux/mm.h> 137992d60dSCatalin Marinas #include <linux/export.h> 147992d60dSCatalin Marinas #include <linux/sched.h> 157992d60dSCatalin Marinas #include <linux/slab.h> 167992d60dSCatalin Marinas #include <linux/syscalls.h> 1727d83e68SMark Rutland 18643d703dSSuzuki K Poulose #include <asm/cpufeature.h> 1927d83e68SMark Rutland #include <asm/syscall.h> 207992d60dSCatalin Marinas 21d3516c90SMark Rutland SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len, 22d3516c90SMark Rutland unsigned long, prot, unsigned long, flags, 23f08cae2fSBoyang Zhou unsigned long, fd, unsigned long, off) 247992d60dSCatalin Marinas { 257992d60dSCatalin Marinas if (offset_in_page(off) != 0) 267992d60dSCatalin Marinas return -EINVAL; 277992d60dSCatalin Marinas 28a90f590aSDominik Brodowski return ksys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT); 297992d60dSCatalin Marinas } 307992d60dSCatalin Marinas 31643d703dSSuzuki K Poulose SYSCALL_DEFINE1(arm64_personality, unsigned int, personality) 32643d703dSSuzuki K Poulose { 33643d703dSSuzuki K Poulose if (personality(personality) == PER_LINUX32 && 34643d703dSSuzuki K Poulose !system_supports_32bit_el0()) 35643d703dSSuzuki K Poulose return -EINVAL; 363f7deccbSMark Rutland return ksys_personality(personality); 37643d703dSSuzuki K Poulose } 38643d703dSSuzuki K Poulose 391e29ab31SSami Tolvanen asmlinkage long sys_ni_syscall(void); 401e29ab31SSami Tolvanen 411e29ab31SSami Tolvanen asmlinkage long __arm64_sys_ni_syscall(const struct pt_regs *__unused) 421e29ab31SSami Tolvanen { 431e29ab31SSami Tolvanen return sys_ni_syscall(); 441e29ab31SSami Tolvanen } 451e29ab31SSami Tolvanen 467992d60dSCatalin Marinas /* 477992d60dSCatalin Marinas * Wrappers to pass the pt_regs argument. 487992d60dSCatalin Marinas */ 4900377277SCatalin Marinas #define __arm64_sys_personality __arm64_sys_arm64_personality 507992d60dSCatalin Marinas 517992d60dSCatalin Marinas #undef __SYSCALL 524378a7d4SMark Rutland #define __SYSCALL(nr, sym) asmlinkage long __arm64_##sym(const struct pt_regs *); 534378a7d4SMark Rutland #include <asm/unistd.h> 544378a7d4SMark Rutland 554378a7d4SMark Rutland #undef __SYSCALL 561e29ab31SSami Tolvanen #define __SYSCALL(nr, sym) [nr] = __arm64_##sym, 577992d60dSCatalin Marinas 5880d63bc3SMark Rutland const syscall_fn_t sys_call_table[__NR_syscalls] = { 591e29ab31SSami Tolvanen [0 ... __NR_syscalls - 1] = __arm64_sys_ni_syscall, 607992d60dSCatalin Marinas #include <asm/unistd.h> 617992d60dSCatalin Marinas }; 62