xref: /linux/arch/arm64/kernel/sys.c (revision caab277b)
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 <catalin.marinas@arm.com>
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 
SYSCALL_DEFINE6(mmap,unsigned long,addr,unsigned long,len,unsigned long,prot,unsigned long,flags,unsigned long,fd,unsigned long,off)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 
SYSCALL_DEFINE1(arm64_personality,unsigned int,personality)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 
__arm64_sys_ni_syscall(const struct pt_regs * __unused)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