~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/loongarch/kernel/syscall.c

Version: ~ [ linux-6.11-rc3 ] ~ [ linux-6.10.4 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.45 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.104 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.164 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.223 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.281 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.319 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0+
  2 /*
  3  * Author: Hanlu Li <lihanlu@loongson.cn>
  4  *         Huacai Chen <chenhuacai@loongson.cn>
  5  *
  6  * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
  7  */
  8 #include <linux/capability.h>
  9 #include <linux/entry-common.h>
 10 #include <linux/errno.h>
 11 #include <linux/linkage.h>
 12 #include <linux/objtool.h>
 13 #include <linux/randomize_kstack.h>
 14 #include <linux/syscalls.h>
 15 #include <linux/unistd.h>
 16 
 17 #include <asm/asm.h>
 18 #include <asm/exception.h>
 19 #include <asm/loongarch.h>
 20 #include <asm/signal.h>
 21 #include <asm/switch_to.h>
 22 #include <asm-generic/syscalls.h>
 23 
 24 #undef __SYSCALL
 25 #define __SYSCALL(nr, call)     [nr] = (call),
 26 #define __SYSCALL_WITH_COMPAT(nr, native, compat) __SYSCALL(nr, native)
 27 
 28 SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len, unsigned long,
 29                 prot, unsigned long, flags, unsigned long, fd, unsigned long, offset)
 30 {
 31         if (offset & ~PAGE_MASK)
 32                 return -EINVAL;
 33 
 34         return ksys_mmap_pgoff(addr, len, prot, flags, fd, offset >> PAGE_SHIFT);
 35 }
 36 
 37 void *sys_call_table[__NR_syscalls] = {
 38         [0 ... __NR_syscalls - 1] = sys_ni_syscall,
 39 #include <asm/syscall_table_64.h>
 40 };
 41 
 42 typedef long (*sys_call_fn)(unsigned long, unsigned long,
 43         unsigned long, unsigned long, unsigned long, unsigned long);
 44 
 45 void noinstr __no_stack_protector do_syscall(struct pt_regs *regs)
 46 {
 47         unsigned long nr;
 48         sys_call_fn syscall_fn;
 49 
 50         nr = regs->regs[11];
 51         /* Set for syscall restarting */
 52         if (nr < NR_syscalls)
 53                 regs->regs[0] = nr + 1;
 54 
 55         regs->csr_era += 4;
 56         regs->orig_a0 = regs->regs[4];
 57         regs->regs[4] = -ENOSYS;
 58 
 59         nr = syscall_enter_from_user_mode(regs, nr);
 60 
 61         add_random_kstack_offset();
 62 
 63         if (nr < NR_syscalls) {
 64                 syscall_fn = sys_call_table[nr];
 65                 regs->regs[4] = syscall_fn(regs->orig_a0, regs->regs[5], regs->regs[6],
 66                                            regs->regs[7], regs->regs[8], regs->regs[9]);
 67         }
 68 
 69         /*
 70          * This value will get limited by KSTACK_OFFSET_MAX(), which is 10
 71          * bits. The actual entropy will be further reduced by the compiler
 72          * when applying stack alignment constraints: 16-bytes (i.e. 4-bits)
 73          * aligned, which will remove the 4 low bits from any entropy chosen
 74          * here.
 75          *
 76          * The resulting 6 bits of entropy is seen in SP[9:4].
 77          */
 78         choose_random_kstack_offset(drdtime());
 79 
 80         syscall_exit_to_user_mode(regs);
 81 }
 82 
 83 #ifdef CONFIG_RANDOMIZE_KSTACK_OFFSET
 84 STACK_FRAME_NON_STANDARD(do_syscall);
 85 #endif
 86 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php