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

TOMOYO Linux Cross Reference
Linux/arch/xtensa/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/xtensa/kernel/syscall.c (Architecture ppc) and /arch/mips/kernel/syscall.c (Architecture mips)


  1 /*                                                  1 /*
  2  * arch/xtensa/kernel/syscall.c                << 
  3  *                                             << 
  4  * This file is subject to the terms and condi      2  * This file is subject to the terms and conditions of the GNU General Public
  5  * License.  See the file "COPYING" in the mai      3  * License.  See the file "COPYING" in the main directory of this archive
  6  * for more details.                                4  * for more details.
  7  *                                                  5  *
  8  * Copyright (C) 2001 - 2005 Tensilica Inc.    !!   6  * Copyright (C) 1995, 1996, 1997, 2000, 2001, 05 by Ralf Baechle
  9  * Copyright (C) 2000 Silicon Graphics, Inc.   !!   7  * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
 10  * Copyright (C) 1995 - 2000 by Ralf Baechle   !!   8  * Copyright (C) 2001 MIPS Technologies, Inc.
 11  *                                             << 
 12  * Joe Taylor <joe@tensilica.com, joetylr@yaho << 
 13  * Marc Gauthier <marc@tensilica.com, marc@alu << 
 14  * Chris Zankel <chris@zankel.net>             << 
 15  * Kevin Chea                                  << 
 16  *                                             << 
 17  */                                                 9  */
 18 #include <linux/uaccess.h>                     !!  10 #include <linux/capability.h>
 19 #include <asm/syscall.h>                       << 
 20 #include <linux/linkage.h>                     << 
 21 #include <linux/stringify.h>                   << 
 22 #include <linux/errno.h>                           11 #include <linux/errno.h>
                                                   >>  12 #include <linux/linkage.h>
                                                   >>  13 #include <linux/fs.h>
                                                   >>  14 #include <linux/smp.h>
                                                   >>  15 #include <linux/ptrace.h>
                                                   >>  16 #include <linux/string.h>
 23 #include <linux/syscalls.h>                        17 #include <linux/syscalls.h>
 24 #include <linux/file.h>                            18 #include <linux/file.h>
 25 #include <linux/fs.h>                          !!  19 #include <linux/utsname.h>
 26 #include <linux/mman.h>                        !!  20 #include <linux/unistd.h>
 27 #include <linux/sched/mm.h>                    !!  21 #include <linux/sem.h>
                                                   >>  22 #include <linux/msg.h>
 28 #include <linux/shm.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>
                                                   >>  30 
                                                   >>  31 #include <asm/asm.h>
                                                   >>  32 #include <asm/asm-eva.h>
                                                   >>  33 #include <asm/branch.h>
                                                   >>  34 #include <asm/cachectl.h>
                                                   >>  35 #include <asm/cacheflush.h>
                                                   >>  36 #include <asm/asm-offsets.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>
                                                   >>  43 #include <asm/switch_to.h>
                                                   >>  44 
                                                   >>  45 /*
                                                   >>  46  * For historic reasons the pipe(2) syscall on MIPS has an unusual calling
                                                   >>  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 }
 29                                                    61 
 30 syscall_t sys_call_table[] /* FIXME __cachelin !!  62 SYSCALL_DEFINE6(mips_mmap, unsigned long, addr, unsigned long, len,
 31 #define __SYSCALL(nr, entry)    (syscall_t)ent !!  63         unsigned long, prot, unsigned long, flags, unsigned long,
 32 #include <asm/syscall_table.h>                 !!  64         fd, off_t, offset)
 33 };                                             !!  65 {
 34                                                !!  66         if (offset & ~PAGE_MASK)
 35 #define COLOUR_ALIGN(addr, pgoff) \            !!  67                 return -EINVAL;
 36         ((((addr) + SHMLBA - 1) & ~(SHMLBA - 1 !!  68         return ksys_mmap_pgoff(addr, len, prot, flags, fd,
 37          (((pgoff) << PAGE_SHIFT) & (SHMLBA -  !!  69                                offset >> PAGE_SHIFT);
                                                   >>  70 }
 38                                                    71 
 39 asmlinkage long xtensa_shmat(int shmid, char _ !!  72 SYSCALL_DEFINE6(mips_mmap2, unsigned long, addr, unsigned long, len,
                                                   >>  73         unsigned long, prot, unsigned long, flags, unsigned long, fd,
                                                   >>  74         unsigned long, pgoff)
 40 {                                                  75 {
 41         unsigned long ret;                     !!  76         if (pgoff & (~PAGE_MASK >> 12))
 42         long err;                              !!  77                 return -EINVAL;
 43                                                    78 
 44         err = do_shmat(shmid, shmaddr, shmflg, !!  79         return ksys_mmap_pgoff(addr, len, prot, flags, fd,
 45         if (err)                               !!  80                                pgoff >> (PAGE_SHIFT - 12));
 46                 return err;                    !!  81 }
 47         return (long)ret;                      !!  82 
                                                   >>  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)
                                                   >>  88 {
                                                   >>  89         struct thread_info *ti = task_thread_info(current);
                                                   >>  90 
                                                   >>  91         ti->tp_value = addr;
                                                   >>  92         if (cpu_has_userlocal)
                                                   >>  93                 write_c0_userlocal(addr);
                                                   >>  94 
                                                   >>  95         return 0;
 48 }                                                  96 }
 49                                                    97 
 50 asmlinkage long xtensa_fadvise64_64(int fd, in !!  98 static inline int mips_atomic_set(unsigned long addr, unsigned long new)
 51                 unsigned long long offset, uns << 
 52 {                                                  99 {
 53         return ksys_fadvise64_64(fd, offset, l !! 100         unsigned long old, tmp;
                                                   >> 101         struct pt_regs *regs;
                                                   >> 102         unsigned int err;
                                                   >> 103 
                                                   >> 104         if (unlikely(addr & 3))
                                                   >> 105                 return -EINVAL;
                                                   >> 106 
                                                   >> 107         if (unlikely(!access_ok((const void __user *)addr, 4)))
                                                   >> 108                 return -EINVAL;
                                                   >> 109 
                                                   >> 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);
                                                   >> 180         }
                                                   >> 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 
                                                   >> 189         /*
                                                   >> 190          * Don't let your children do this ...
                                                   >> 191          */
                                                   >> 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();
 54 }                                                 200 }
 55                                                   201 
 56 #ifdef CONFIG_MMU                              !! 202 /*
 57 unsigned long arch_get_unmapped_area(struct fi !! 203  * mips_atomic_set() normally returns directly via syscall_exit potentially
 58                 unsigned long len, unsigned lo !! 204  * clobbering static registers, so be sure to preserve them.
 59                 vm_flags_t vm_flags)           !! 205  */
                                                   >> 206 save_static_function(sys_sysmips);
                                                   >> 207 
                                                   >> 208 SYSCALL_DEFINE3(sysmips, long, cmd, long, arg1, long, arg2)
 60 {                                                 209 {
 61         struct vm_area_struct *vmm;            !! 210         switch (cmd) {
 62         struct vma_iterator vmi;               !! 211         case MIPS_ATOMIC_SET:
                                                   >> 212                 return mips_atomic_set(arg1, arg2);
 63                                                   213 
 64         if (flags & MAP_FIXED) {               !! 214         case MIPS_FIXADE:
 65                 /* We do not accept a shared m !! 215                 if (arg1 & ~3)
 66                  * cache aliasing constraints. << 
 67                  */                            << 
 68                 if ((flags & MAP_SHARED) &&    << 
 69                                 ((addr - (pgof << 
 70                         return -EINVAL;           216                         return -EINVAL;
 71                 return addr;                   << 
 72         }                                      << 
 73                                                   217 
 74         if (len > TASK_SIZE)                   !! 218                 if (arg1 & 1)
 75                 return -ENOMEM;                !! 219                         set_thread_flag(TIF_FIXADE);
 76         if (!addr)                             !! 220                 else
 77                 addr = TASK_UNMAPPED_BASE;     !! 221                         clear_thread_flag(TIF_FIXADE);
 78                                                !! 222                 if (arg1 & 2)
 79         if (flags & MAP_SHARED)                !! 223                         set_thread_flag(TIF_LOGADE);
 80                 addr = COLOUR_ALIGN(addr, pgof !! 224                 else
 81         else                                   !! 225                         clear_thread_flag(TIF_LOGADE);
 82                 addr = PAGE_ALIGN(addr);       !! 226 
 83                                                !! 227                 return 0;
 84         vma_iter_init(&vmi, current->mm, addr) !! 228 
 85         for_each_vma(vmi, vmm) {               !! 229         case FLUSH_CACHE:
 86                 /* At this point:  (addr < vmm !! 230                 __flush_cache_all();
 87                 if (addr + len <= vm_start_gap !! 231                 return 0;
 88                         break;                 << 
 89                                                << 
 90                 addr = vmm->vm_end;            << 
 91                 if (flags & MAP_SHARED)        << 
 92                         addr = COLOUR_ALIGN(ad << 
 93         }                                         232         }
 94                                                   233 
 95         if (TASK_SIZE - len < addr)            !! 234         return -EINVAL;
 96                 return -ENOMEM;                !! 235 }
 97                                                   236 
 98         return addr;                           !! 237 /*
                                                   >> 238  * No implemented yet ...
                                                   >> 239  */
                                                   >> 240 SYSCALL_DEFINE3(cachectl, char *, addr, int, nbytes, int, op)
                                                   >> 241 {
                                                   >> 242         return -ENOSYS;
 99 }                                                 243 }
100 #endif                                         << 
101                                                   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