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

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

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ 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.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /arch/loongarch/kernel/syscall.c (Architecture ppc) and /arch/mips/kernel/syscall.c (Architecture mips)


  1 // SPDX-License-Identifier: GPL-2.0+           << 
  2 /*                                                  1 /*
  3  * Author: Hanlu Li <lihanlu@loongson.cn>      !!   2  * This file is subject to the terms and conditions of the GNU General Public
  4  *         Huacai Chen <chenhuacai@loongson.cn !!   3  * License.  See the file "COPYING" in the main directory of this archive
                                                   >>   4  * for more details.
  5  *                                                  5  *
  6  * Copyright (C) 2020-2022 Loongson Technology !!   6  * Copyright (C) 1995, 1996, 1997, 2000, 2001, 05 by Ralf Baechle
                                                   >>   7  * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
                                                   >>   8  * Copyright (C) 2001 MIPS Technologies, Inc.
  7  */                                                 9  */
  8 #include <linux/capability.h>                      10 #include <linux/capability.h>
  9 #include <linux/entry-common.h>                << 
 10 #include <linux/errno.h>                           11 #include <linux/errno.h>
 11 #include <linux/linkage.h>                         12 #include <linux/linkage.h>
 12 #include <linux/objtool.h>                     !!  13 #include <linux/fs.h>
 13 #include <linux/randomize_kstack.h>            !!  14 #include <linux/smp.h>
                                                   >>  15 #include <linux/ptrace.h>
                                                   >>  16 #include <linux/string.h>
 14 #include <linux/syscalls.h>                        17 #include <linux/syscalls.h>
                                                   >>  18 #include <linux/file.h>
                                                   >>  19 #include <linux/utsname.h>
 15 #include <linux/unistd.h>                          20 #include <linux/unistd.h>
                                                   >>  21 #include <linux/sem.h>
                                                   >>  22 #include <linux/msg.h>
                                                   >>  23 #include <linux/shm.h>
                                                   >>  24 #include <linux/compiler.h>
                                                   >>  25 #include <linux/ipc.h>
                                                   >>  26 #include <linux/uaccess.h>
                                                   >>  27 #include <linux/slab.h>
                                                   >>  28 #include <linux/elf.h>
                                                   >>  29 #include <linux/sched/task_stack.h>
 16                                                    30 
 17 #include <asm/asm.h>                               31 #include <asm/asm.h>
 18 #include <asm/exception.h>                     !!  32 #include <asm/asm-eva.h>
 19 #include <asm/loongarch.h>                     !!  33 #include <asm/branch.h>
                                                   >>  34 #include <asm/cachectl.h>
                                                   >>  35 #include <asm/cacheflush.h>
                                                   >>  36 #include <asm/asm-offsets.h>
 20 #include <asm/signal.h>                            37 #include <asm/signal.h>
                                                   >>  38 #include <asm/sim.h>
                                                   >>  39 #include <asm/shmparam.h>
                                                   >>  40 #include <asm/sync.h>
                                                   >>  41 #include <asm/sysmips.h>
                                                   >>  42 #include <asm/syscalls.h>
 21 #include <asm/switch_to.h>                         43 #include <asm/switch_to.h>
 22 #include <asm-generic/syscalls.h>              << 
 23                                                    44 
 24 #undef __SYSCALL                               !!  45 /*
 25 #define __SYSCALL(nr, call)     [nr] = (call), !!  46  * For historic reasons the pipe(2) syscall on MIPS has an unusual calling
 26 #define __SYSCALL_WITH_COMPAT(nr, native, comp !!  47  * convention.  It returns results in registers $v0 / $v1 which means there
                                                   >>  48  * is no need for it to do verify the validity of a userspace pointer
                                                   >>  49  * argument.  Historically that used to be expensive in Linux.  These days
                                                   >>  50  * the performance advantage is negligible.
                                                   >>  51  */
                                                   >>  52 asmlinkage int sysm_pipe(void)
                                                   >>  53 {
                                                   >>  54         int fd[2];
                                                   >>  55         int error = do_pipe_flags(fd, 0);
                                                   >>  56         if (error)
                                                   >>  57                 return error;
                                                   >>  58         current_pt_regs()->regs[3] = fd[1];
                                                   >>  59         return fd[0];
                                                   >>  60 }
 27                                                    61 
 28 SYSCALL_DEFINE6(mmap, unsigned long, addr, uns !!  62 SYSCALL_DEFINE6(mips_mmap, unsigned long, addr, unsigned long, len,
 29                 prot, unsigned long, flags, un !!  63         unsigned long, prot, unsigned long, flags, unsigned long,
                                                   >>  64         fd, off_t, offset)
 30 {                                                  65 {
 31         if (offset & ~PAGE_MASK)                   66         if (offset & ~PAGE_MASK)
 32                 return -EINVAL;                    67                 return -EINVAL;
 33                                                !!  68         return ksys_mmap_pgoff(addr, len, prot, flags, fd,
 34         return ksys_mmap_pgoff(addr, len, prot !!  69                                offset >> PAGE_SHIFT);
 35 }                                                  70 }
 36                                                    71 
 37 void *sys_call_table[__NR_syscalls] = {        !!  72 SYSCALL_DEFINE6(mips_mmap2, unsigned long, addr, unsigned long, len,
 38         [0 ... __NR_syscalls - 1] = sys_ni_sys !!  73         unsigned long, prot, unsigned long, flags, unsigned long, fd,
 39 #include <asm/syscall_table_64.h>              !!  74         unsigned long, pgoff)
 40 };                                             !!  75 {
                                                   >>  76         if (pgoff & (~PAGE_MASK >> 12))
                                                   >>  77                 return -EINVAL;
 41                                                    78 
 42 typedef long (*sys_call_fn)(unsigned long, uns !!  79         return ksys_mmap_pgoff(addr, len, prot, flags, fd,
 43         unsigned long, unsigned long, unsigned !!  80                                pgoff >> (PAGE_SHIFT - 12));
                                                   >>  81 }
 44                                                    82 
 45 void noinstr __no_stack_protector do_syscall(s !!  83 save_static_function(sys_fork);
                                                   >>  84 save_static_function(sys_clone);
                                                   >>  85 save_static_function(sys_clone3);
                                                   >>  86 
                                                   >>  87 SYSCALL_DEFINE1(set_thread_area, unsigned long, addr)
 46 {                                                  88 {
 47         unsigned long nr;                      !!  89         struct thread_info *ti = task_thread_info(current);
 48         sys_call_fn syscall_fn;                << 
 49                                                    90 
 50         nr = regs->regs[11];                   !!  91         ti->tp_value = addr;
 51         /* Set for syscall restarting */       !!  92         if (cpu_has_userlocal)
 52         if (nr < NR_syscalls)                  !!  93                 write_c0_userlocal(addr);
 53                 regs->regs[0] = nr + 1;        << 
 54                                                    94 
 55         regs->csr_era += 4;                    !!  95         return 0;
 56         regs->orig_a0 = regs->regs[4];         !!  96 }
 57         regs->regs[4] = -ENOSYS;               << 
 58                                                    97 
 59         nr = syscall_enter_from_user_mode(regs !!  98 static inline int mips_atomic_set(unsigned long addr, unsigned long new)
                                                   >>  99 {
                                                   >> 100         unsigned long old, tmp;
                                                   >> 101         struct pt_regs *regs;
                                                   >> 102         unsigned int err;
 60                                                   103 
 61         add_random_kstack_offset();            !! 104         if (unlikely(addr & 3))
                                                   >> 105                 return -EINVAL;
 62                                                   106 
 63         if (nr < NR_syscalls) {                !! 107         if (unlikely(!access_ok((const void __user *)addr, 4)))
 64                 syscall_fn = sys_call_table[nr !! 108                 return -EINVAL;
 65                 regs->regs[4] = syscall_fn(reg !! 109 
 66                                            reg !! 110         if (cpu_has_llsc && IS_ENABLED(CONFIG_WAR_R10000_LLSC)) {
                                                   >> 111                 __asm__ __volatile__ (
                                                   >> 112                 "       .set    push                                    \n"
                                                   >> 113                 "       .set    arch=r4000                              \n"
                                                   >> 114                 "       li      %[err], 0                               \n"
                                                   >> 115                 "1:     ll      %[old], (%[addr])                       \n"
                                                   >> 116                 "       move    %[tmp], %[new]                          \n"
                                                   >> 117                 "2:     sc      %[tmp], (%[addr])                       \n"
                                                   >> 118                 "       beqzl   %[tmp], 1b                              \n"
                                                   >> 119                 "3:                                                     \n"
                                                   >> 120                 "       .insn                                           \n"
                                                   >> 121                 "       .section .fixup,\"ax\"                          \n"
                                                   >> 122                 "4:     li      %[err], %[efault]                       \n"
                                                   >> 123                 "       j       3b                                      \n"
                                                   >> 124                 "       .previous                                       \n"
                                                   >> 125                 "       .section __ex_table,\"a\"                       \n"
                                                   >> 126                 "       "STR(PTR_WD)"   1b, 4b                          \n"
                                                   >> 127                 "       "STR(PTR_WD)"   2b, 4b                          \n"
                                                   >> 128                 "       .previous                                       \n"
                                                   >> 129                 "       .set    pop                                     \n"
                                                   >> 130                 : [old] "=&r" (old),
                                                   >> 131                   [err] "=&r" (err),
                                                   >> 132                   [tmp] "=&r" (tmp)
                                                   >> 133                 : [addr] "r" (addr),
                                                   >> 134                   [new] "r" (new),
                                                   >> 135                   [efault] "i" (-EFAULT)
                                                   >> 136                 : "memory");
                                                   >> 137         } else if (cpu_has_llsc) {
                                                   >> 138                 __asm__ __volatile__ (
                                                   >> 139                 "       .set    push                                    \n"
                                                   >> 140                 "       .set    "MIPS_ISA_ARCH_LEVEL"                   \n"
                                                   >> 141                 "       li      %[err], 0                               \n"
                                                   >> 142                 "1:                                                     \n"
                                                   >> 143                 "       " __SYNC(full, loongson3_war) "                 \n"
                                                   >> 144                 user_ll("%[old]", "(%[addr])")
                                                   >> 145                 "       move    %[tmp], %[new]                          \n"
                                                   >> 146                 "2:                                                     \n"
                                                   >> 147                 user_sc("%[tmp]", "(%[addr])")
                                                   >> 148                 "       beqz    %[tmp], 1b                              \n"
                                                   >> 149                 "3:                                                     \n"
                                                   >> 150                 "       .insn                                           \n"
                                                   >> 151                 "       .section .fixup,\"ax\"                          \n"
                                                   >> 152                 "5:     li      %[err], %[efault]                       \n"
                                                   >> 153                 "       j       3b                                      \n"
                                                   >> 154                 "       .previous                                       \n"
                                                   >> 155                 "       .section __ex_table,\"a\"                       \n"
                                                   >> 156                 "       "STR(PTR_WD)"   1b, 5b                          \n"
                                                   >> 157                 "       "STR(PTR_WD)"   2b, 5b                          \n"
                                                   >> 158                 "       .previous                                       \n"
                                                   >> 159                 "       .set    pop                                     \n"
                                                   >> 160                 : [old] "=&r" (old),
                                                   >> 161                   [err] "=&r" (err),
                                                   >> 162                   [tmp] "=&r" (tmp)
                                                   >> 163                 : [addr] "r" (addr),
                                                   >> 164                   [new] "r" (new),
                                                   >> 165                   [efault] "i" (-EFAULT)
                                                   >> 166                 : "memory");
                                                   >> 167         } else {
                                                   >> 168                 do {
                                                   >> 169                         preempt_disable();
                                                   >> 170                         ll_bit = 1;
                                                   >> 171                         ll_task = current;
                                                   >> 172                         preempt_enable();
                                                   >> 173 
                                                   >> 174                         err = __get_user(old, (unsigned int *) addr);
                                                   >> 175                         err |= __put_user(new, (unsigned int *) addr);
                                                   >> 176                         if (err)
                                                   >> 177                                 break;
                                                   >> 178                         rmb();
                                                   >> 179                 } while (!ll_bit);
 67         }                                         180         }
 68                                                   181 
                                                   >> 182         if (unlikely(err))
                                                   >> 183                 return err;
                                                   >> 184 
                                                   >> 185         regs = current_pt_regs();
                                                   >> 186         regs->regs[2] = old;
                                                   >> 187         regs->regs[7] = 0;      /* No error */
                                                   >> 188 
 69         /*                                        189         /*
 70          * This value will get limited by KSTA !! 190          * Don't let your children do this ...
 71          * bits. The actual entropy will be fu << 
 72          * when applying stack alignment const << 
 73          * aligned, which will remove the 4 lo << 
 74          * here.                               << 
 75          *                                     << 
 76          * The resulting 6 bits of entropy is  << 
 77          */                                       191          */
 78         choose_random_kstack_offset(drdtime()) !! 192         __asm__ __volatile__(
                                                   >> 193         "       move    $29, %0                                         \n"
                                                   >> 194         "       j       syscall_exit                                    \n"
                                                   >> 195         : /* no outputs */
                                                   >> 196         : "r" (regs));
                                                   >> 197 
                                                   >> 198         /* unreached.  Honestly.  */
                                                   >> 199         unreachable();
                                                   >> 200 }
                                                   >> 201 
                                                   >> 202 /*
                                                   >> 203  * mips_atomic_set() normally returns directly via syscall_exit potentially
                                                   >> 204  * clobbering static registers, so be sure to preserve them.
                                                   >> 205  */
                                                   >> 206 save_static_function(sys_sysmips);
                                                   >> 207 
                                                   >> 208 SYSCALL_DEFINE3(sysmips, long, cmd, long, arg1, long, arg2)
                                                   >> 209 {
                                                   >> 210         switch (cmd) {
                                                   >> 211         case MIPS_ATOMIC_SET:
                                                   >> 212                 return mips_atomic_set(arg1, arg2);
                                                   >> 213 
                                                   >> 214         case MIPS_FIXADE:
                                                   >> 215                 if (arg1 & ~3)
                                                   >> 216                         return -EINVAL;
                                                   >> 217 
                                                   >> 218                 if (arg1 & 1)
                                                   >> 219                         set_thread_flag(TIF_FIXADE);
                                                   >> 220                 else
                                                   >> 221                         clear_thread_flag(TIF_FIXADE);
                                                   >> 222                 if (arg1 & 2)
                                                   >> 223                         set_thread_flag(TIF_LOGADE);
                                                   >> 224                 else
                                                   >> 225                         clear_thread_flag(TIF_LOGADE);
                                                   >> 226 
                                                   >> 227                 return 0;
                                                   >> 228 
                                                   >> 229         case FLUSH_CACHE:
                                                   >> 230                 __flush_cache_all();
                                                   >> 231                 return 0;
                                                   >> 232         }
                                                   >> 233 
                                                   >> 234         return -EINVAL;
                                                   >> 235 }
 79                                                   236 
 80         syscall_exit_to_user_mode(regs);       !! 237 /*
                                                   >> 238  * No implemented yet ...
                                                   >> 239  */
                                                   >> 240 SYSCALL_DEFINE3(cachectl, char *, addr, int, nbytes, int, op)
                                                   >> 241 {
                                                   >> 242         return -ENOSYS;
 81 }                                                 243 }
 82                                                   244 

~ [ 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