1*1da177e4SLinus Torvalds/* 2*1da177e4SLinus Torvalds * This file is subject to the terms and conditions of the GNU General Public 3*1da177e4SLinus Torvalds * License. See the file "COPYING" in the main directory of this archive 4*1da177e4SLinus Torvalds * for more details. 5*1da177e4SLinus Torvalds * 6*1da177e4SLinus Torvalds * Copyright (C) 1995, 96, 97, 98, 99, 2000, 01, 02 by Ralf Baechle 7*1da177e4SLinus Torvalds * Copyright (C) 2001 MIPS Technologies, Inc. 8*1da177e4SLinus Torvalds * Copyright (C) 2004 Thiemo Seufer 9*1da177e4SLinus Torvalds */ 10*1da177e4SLinus Torvalds#include <linux/config.h> 11*1da177e4SLinus Torvalds#include <linux/errno.h> 12*1da177e4SLinus Torvalds#include <asm/asm.h> 13*1da177e4SLinus Torvalds#include <asm/asmmacro.h> 14*1da177e4SLinus Torvalds#include <asm/mipsregs.h> 15*1da177e4SLinus Torvalds#include <asm/regdef.h> 16*1da177e4SLinus Torvalds#include <asm/stackframe.h> 17*1da177e4SLinus Torvalds#include <asm/isadep.h> 18*1da177e4SLinus Torvalds#include <asm/sysmips.h> 19*1da177e4SLinus Torvalds#include <asm/thread_info.h> 20*1da177e4SLinus Torvalds#include <asm/unistd.h> 21*1da177e4SLinus Torvalds#include <asm/war.h> 22*1da177e4SLinus Torvalds#include <asm/offset.h> 23*1da177e4SLinus Torvalds 24*1da177e4SLinus Torvalds/* Highest syscall used of any syscall flavour */ 25*1da177e4SLinus Torvalds#define MAX_SYSCALL_NO __NR_O32_Linux + __NR_O32_Linux_syscalls 26*1da177e4SLinus Torvalds 27*1da177e4SLinus Torvalds .align 5 28*1da177e4SLinus TorvaldsNESTED(handle_sys, PT_SIZE, sp) 29*1da177e4SLinus Torvalds .set noat 30*1da177e4SLinus Torvalds SAVE_SOME 31*1da177e4SLinus Torvalds STI 32*1da177e4SLinus Torvalds .set at 33*1da177e4SLinus Torvalds 34*1da177e4SLinus Torvalds lw t1, PT_EPC(sp) # skip syscall on return 35*1da177e4SLinus Torvalds 36*1da177e4SLinus Torvalds#if defined(CONFIG_BINFMT_IRIX) 37*1da177e4SLinus Torvalds sltiu t0, v0, MAX_SYSCALL_NO + 1 # check syscall number 38*1da177e4SLinus Torvalds#else 39*1da177e4SLinus Torvalds subu v0, v0, __NR_O32_Linux # check syscall number 40*1da177e4SLinus Torvalds sltiu t0, v0, __NR_O32_Linux_syscalls + 1 41*1da177e4SLinus Torvalds#endif 42*1da177e4SLinus Torvalds addiu t1, 4 # skip to next instruction 43*1da177e4SLinus Torvalds sw t1, PT_EPC(sp) 44*1da177e4SLinus Torvalds beqz t0, illegal_syscall 45*1da177e4SLinus Torvalds 46*1da177e4SLinus Torvalds sll t0, v0, 3 47*1da177e4SLinus Torvalds la t1, sys_call_table 48*1da177e4SLinus Torvalds addu t1, t0 49*1da177e4SLinus Torvalds lw t2, (t1) # syscall routine 50*1da177e4SLinus Torvalds lw t3, 4(t1) # >= 0 if we need stack arguments 51*1da177e4SLinus Torvalds beqz t2, illegal_syscall 52*1da177e4SLinus Torvalds 53*1da177e4SLinus Torvalds sw a3, PT_R26(sp) # save a3 for syscall restarting 54*1da177e4SLinus Torvalds bgez t3, stackargs 55*1da177e4SLinus Torvalds 56*1da177e4SLinus Torvaldsstack_done: 57*1da177e4SLinus Torvalds lw t0, TI_FLAGS($28) # syscall tracing enabled? 58*1da177e4SLinus Torvalds li t1, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT 59*1da177e4SLinus Torvalds and t0, t1 60*1da177e4SLinus Torvalds bnez t0, syscall_trace_entry # -> yes 61*1da177e4SLinus Torvalds 62*1da177e4SLinus Torvalds jalr t2 # Do The Real Thing (TM) 63*1da177e4SLinus Torvalds 64*1da177e4SLinus Torvalds li t0, -EMAXERRNO - 1 # error? 65*1da177e4SLinus Torvalds sltu t0, t0, v0 66*1da177e4SLinus Torvalds sw t0, PT_R7(sp) # set error flag 67*1da177e4SLinus Torvalds beqz t0, 1f 68*1da177e4SLinus Torvalds 69*1da177e4SLinus Torvalds negu v0 # error 70*1da177e4SLinus Torvalds sw v0, PT_R0(sp) # set flag for syscall 71*1da177e4SLinus Torvalds # restarting 72*1da177e4SLinus Torvalds1: sw v0, PT_R2(sp) # result 73*1da177e4SLinus Torvalds 74*1da177e4SLinus Torvaldso32_syscall_exit: 75*1da177e4SLinus Torvalds local_irq_disable # make sure need_resched and 76*1da177e4SLinus Torvalds # signals dont change between 77*1da177e4SLinus Torvalds # sampling and return 78*1da177e4SLinus Torvalds lw a2, TI_FLAGS($28) # current->work 79*1da177e4SLinus Torvalds li t0, _TIF_ALLWORK_MASK 80*1da177e4SLinus Torvalds and t0, a2 81*1da177e4SLinus Torvalds bnez t0, o32_syscall_exit_work 82*1da177e4SLinus Torvalds 83*1da177e4SLinus Torvalds j restore_partial 84*1da177e4SLinus Torvalds 85*1da177e4SLinus Torvaldso32_syscall_exit_work: 86*1da177e4SLinus Torvalds j syscall_exit_work_partial 87*1da177e4SLinus Torvalds 88*1da177e4SLinus Torvalds/* ------------------------------------------------------------------------ */ 89*1da177e4SLinus Torvalds 90*1da177e4SLinus Torvaldssyscall_trace_entry: 91*1da177e4SLinus Torvalds SAVE_STATIC 92*1da177e4SLinus Torvalds move s0, t2 93*1da177e4SLinus Torvalds move a0, sp 94*1da177e4SLinus Torvalds li a1, 0 95*1da177e4SLinus Torvalds jal do_syscall_trace 96*1da177e4SLinus Torvalds 97*1da177e4SLinus Torvalds lw a0, PT_R4(sp) # Restore argument registers 98*1da177e4SLinus Torvalds lw a1, PT_R5(sp) 99*1da177e4SLinus Torvalds lw a2, PT_R6(sp) 100*1da177e4SLinus Torvalds lw a3, PT_R7(sp) 101*1da177e4SLinus Torvalds jalr s0 102*1da177e4SLinus Torvalds 103*1da177e4SLinus Torvalds li t0, -EMAXERRNO - 1 # error? 104*1da177e4SLinus Torvalds sltu t0, t0, v0 105*1da177e4SLinus Torvalds sw t0, PT_R7(sp) # set error flag 106*1da177e4SLinus Torvalds beqz t0, 1f 107*1da177e4SLinus Torvalds 108*1da177e4SLinus Torvalds negu v0 # error 109*1da177e4SLinus Torvalds sw v0, PT_R0(sp) # set flag for syscall 110*1da177e4SLinus Torvalds # restarting 111*1da177e4SLinus Torvalds1: sw v0, PT_R2(sp) # result 112*1da177e4SLinus Torvalds 113*1da177e4SLinus Torvalds j syscall_exit 114*1da177e4SLinus Torvalds 115*1da177e4SLinus Torvalds/* ------------------------------------------------------------------------ */ 116*1da177e4SLinus Torvalds 117*1da177e4SLinus Torvalds /* 118*1da177e4SLinus Torvalds * More than four arguments. Try to deal with it by copying the 119*1da177e4SLinus Torvalds * stack arguments from the user stack to the kernel stack. 120*1da177e4SLinus Torvalds * This Sucks (TM). 121*1da177e4SLinus Torvalds */ 122*1da177e4SLinus Torvaldsstackargs: 123*1da177e4SLinus Torvalds lw t0, PT_R29(sp) # get old user stack pointer 124*1da177e4SLinus Torvalds 125*1da177e4SLinus Torvalds /* 126*1da177e4SLinus Torvalds * We intentionally keep the kernel stack a little below the top of 127*1da177e4SLinus Torvalds * userspace so we don't have to do a slower byte accurate check here. 128*1da177e4SLinus Torvalds */ 129*1da177e4SLinus Torvalds lw t5, TI_ADDR_LIMIT($28) 130*1da177e4SLinus Torvalds addu t4, t0, 32 131*1da177e4SLinus Torvalds and t5, t4 132*1da177e4SLinus Torvalds bltz t5, bad_stack # -> sp is bad 133*1da177e4SLinus Torvalds 134*1da177e4SLinus Torvalds /* Ok, copy the args from the luser stack to the kernel stack. 135*1da177e4SLinus Torvalds * t3 is the precomputed number of instruction bytes needed to 136*1da177e4SLinus Torvalds * load or store arguments 6-8. 137*1da177e4SLinus Torvalds */ 138*1da177e4SLinus Torvalds 139*1da177e4SLinus Torvalds la t1, 5f # load up to 3 arguments 140*1da177e4SLinus Torvalds subu t1, t3 141*1da177e4SLinus Torvalds1: lw t5, 16(t0) # argument #5 from usp 142*1da177e4SLinus Torvalds .set push 143*1da177e4SLinus Torvalds .set noreorder 144*1da177e4SLinus Torvalds .set nomacro 145*1da177e4SLinus Torvalds jr t1 146*1da177e4SLinus Torvalds addiu t1, 6f - 5f 147*1da177e4SLinus Torvalds 148*1da177e4SLinus Torvalds2: lw t8, 28(t0) # argument #8 from usp 149*1da177e4SLinus Torvalds3: lw t7, 24(t0) # argument #7 from usp 150*1da177e4SLinus Torvalds4: lw t6, 20(t0) # argument #6 from usp 151*1da177e4SLinus Torvalds5: jr t1 152*1da177e4SLinus Torvalds sw t5, 16(sp) # argument #5 to ksp 153*1da177e4SLinus Torvalds 154*1da177e4SLinus Torvalds sw t8, 28(sp) # argument #8 to ksp 155*1da177e4SLinus Torvalds sw t7, 24(sp) # argument #7 to ksp 156*1da177e4SLinus Torvalds sw t6, 20(sp) # argument #6 to ksp 157*1da177e4SLinus Torvalds6: j stack_done # go back 158*1da177e4SLinus Torvalds nop 159*1da177e4SLinus Torvalds .set pop 160*1da177e4SLinus Torvalds 161*1da177e4SLinus Torvalds .section __ex_table,"a" 162*1da177e4SLinus Torvalds PTR 1b,bad_stack 163*1da177e4SLinus Torvalds PTR 2b,bad_stack 164*1da177e4SLinus Torvalds PTR 3b,bad_stack 165*1da177e4SLinus Torvalds PTR 4b,bad_stack 166*1da177e4SLinus Torvalds .previous 167*1da177e4SLinus Torvalds 168*1da177e4SLinus Torvalds /* 169*1da177e4SLinus Torvalds * The stackpointer for a call with more than 4 arguments is bad. 170*1da177e4SLinus Torvalds * We probably should handle this case a bit more drastic. 171*1da177e4SLinus Torvalds */ 172*1da177e4SLinus Torvaldsbad_stack: 173*1da177e4SLinus Torvalds negu v0 # error 174*1da177e4SLinus Torvalds sw v0, PT_R0(sp) 175*1da177e4SLinus Torvalds sw v0, PT_R2(sp) 176*1da177e4SLinus Torvalds li t0, 1 # set error flag 177*1da177e4SLinus Torvalds sw t0, PT_R7(sp) 178*1da177e4SLinus Torvalds j o32_syscall_exit 179*1da177e4SLinus Torvalds 180*1da177e4SLinus Torvalds /* 181*1da177e4SLinus Torvalds * The system call does not exist in this kernel 182*1da177e4SLinus Torvalds */ 183*1da177e4SLinus Torvaldsillegal_syscall: 184*1da177e4SLinus Torvalds li v0, -ENOSYS # error 185*1da177e4SLinus Torvalds sw v0, PT_R2(sp) 186*1da177e4SLinus Torvalds li t0, 1 # set error flag 187*1da177e4SLinus Torvalds sw t0, PT_R7(sp) 188*1da177e4SLinus Torvalds j o32_syscall_exit 189*1da177e4SLinus Torvalds END(handle_sys) 190*1da177e4SLinus Torvalds 191*1da177e4SLinus Torvalds LEAF(mips_atomic_set) 192*1da177e4SLinus Torvalds andi v0, a1, 3 # must be word aligned 193*1da177e4SLinus Torvalds bnez v0, bad_alignment 194*1da177e4SLinus Torvalds 195*1da177e4SLinus Torvalds lw v1, TI_ADDR_LIMIT($28) # in legal address range? 196*1da177e4SLinus Torvalds addiu a0, a1, 4 197*1da177e4SLinus Torvalds or a0, a0, a1 198*1da177e4SLinus Torvalds and a0, a0, v1 199*1da177e4SLinus Torvalds bltz a0, bad_address 200*1da177e4SLinus Torvalds 201*1da177e4SLinus Torvalds#ifdef CONFIG_CPU_HAS_LLSC 202*1da177e4SLinus Torvalds /* Ok, this is the ll/sc case. World is sane :-) */ 203*1da177e4SLinus Torvalds1: ll v0, (a1) 204*1da177e4SLinus Torvalds move a0, a2 205*1da177e4SLinus Torvalds2: sc a0, (a1) 206*1da177e4SLinus Torvalds#if R10000_LLSC_WAR 207*1da177e4SLinus Torvalds beqzl a0, 1b 208*1da177e4SLinus Torvalds#else 209*1da177e4SLinus Torvalds beqz a0, 1b 210*1da177e4SLinus Torvalds#endif 211*1da177e4SLinus Torvalds 212*1da177e4SLinus Torvalds .section __ex_table,"a" 213*1da177e4SLinus Torvalds PTR 1b, bad_stack 214*1da177e4SLinus Torvalds PTR 2b, bad_stack 215*1da177e4SLinus Torvalds .previous 216*1da177e4SLinus Torvalds#else 217*1da177e4SLinus Torvalds sw a1, 16(sp) 218*1da177e4SLinus Torvalds sw a2, 20(sp) 219*1da177e4SLinus Torvalds 220*1da177e4SLinus Torvalds move a0, sp 221*1da177e4SLinus Torvalds move a2, a1 222*1da177e4SLinus Torvalds li a1, 1 223*1da177e4SLinus Torvalds jal do_page_fault 224*1da177e4SLinus Torvalds 225*1da177e4SLinus Torvalds lw a1, 16(sp) 226*1da177e4SLinus Torvalds lw a2, 20(sp) 227*1da177e4SLinus Torvalds 228*1da177e4SLinus Torvalds /* 229*1da177e4SLinus Torvalds * At this point the page should be readable and writable unless 230*1da177e4SLinus Torvalds * there was no more memory available. 231*1da177e4SLinus Torvalds */ 232*1da177e4SLinus Torvalds1: lw v0, (a1) 233*1da177e4SLinus Torvalds2: sw a2, (a1) 234*1da177e4SLinus Torvalds 235*1da177e4SLinus Torvalds .section __ex_table,"a" 236*1da177e4SLinus Torvalds PTR 1b, no_mem 237*1da177e4SLinus Torvalds PTR 2b, no_mem 238*1da177e4SLinus Torvalds .previous 239*1da177e4SLinus Torvalds#endif 240*1da177e4SLinus Torvalds 241*1da177e4SLinus Torvalds sw zero, PT_R7(sp) # success 242*1da177e4SLinus Torvalds sw v0, PT_R2(sp) # result 243*1da177e4SLinus Torvalds 244*1da177e4SLinus Torvalds /* Success, so skip usual error handling garbage. */ 245*1da177e4SLinus Torvalds lw a2, TI_FLAGS($28) # syscall tracing enabled? 246*1da177e4SLinus Torvalds li t0, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT 247*1da177e4SLinus Torvalds and t0, a2, t0 248*1da177e4SLinus Torvalds bnez t0, 1f 249*1da177e4SLinus Torvalds 250*1da177e4SLinus Torvalds j o32_syscall_exit 251*1da177e4SLinus Torvalds 252*1da177e4SLinus Torvalds1: SAVE_STATIC 253*1da177e4SLinus Torvalds move a0, sp 254*1da177e4SLinus Torvalds li a1, 1 255*1da177e4SLinus Torvalds jal do_syscall_trace 256*1da177e4SLinus Torvalds j syscall_exit 257*1da177e4SLinus Torvalds 258*1da177e4SLinus Torvaldsno_mem: li v0, -ENOMEM 259*1da177e4SLinus Torvalds jr ra 260*1da177e4SLinus Torvalds 261*1da177e4SLinus Torvaldsbad_address: 262*1da177e4SLinus Torvalds li v0, -EFAULT 263*1da177e4SLinus Torvalds jr ra 264*1da177e4SLinus Torvalds 265*1da177e4SLinus Torvaldsbad_alignment: 266*1da177e4SLinus Torvalds li v0, -EINVAL 267*1da177e4SLinus Torvalds jr ra 268*1da177e4SLinus Torvalds END(mips_atomic_set) 269*1da177e4SLinus Torvalds 270*1da177e4SLinus Torvalds LEAF(sys_sysmips) 271*1da177e4SLinus Torvalds beq a0, MIPS_ATOMIC_SET, mips_atomic_set 272*1da177e4SLinus Torvalds j _sys_sysmips 273*1da177e4SLinus Torvalds END(sys_sysmips) 274*1da177e4SLinus Torvalds 275*1da177e4SLinus Torvalds LEAF(sys_syscall) 276*1da177e4SLinus Torvalds#if defined(CONFIG_BINFMT_IRIX) 277*1da177e4SLinus Torvalds sltiu v0, a0, MAX_SYSCALL_NO + 1 # check syscall number 278*1da177e4SLinus Torvalds#else 279*1da177e4SLinus Torvalds subu t0, a0, __NR_O32_Linux # check syscall number 280*1da177e4SLinus Torvalds sltiu v0, t0, __NR_O32_Linux_syscalls + 1 281*1da177e4SLinus Torvalds#endif 282*1da177e4SLinus Torvalds sll t1, t0, 3 283*1da177e4SLinus Torvalds beqz v0, einval 284*1da177e4SLinus Torvalds 285*1da177e4SLinus Torvalds lw t2, sys_call_table(t1) # syscall routine 286*1da177e4SLinus Torvalds 287*1da177e4SLinus Torvalds#if defined(CONFIG_BINFMT_IRIX) 288*1da177e4SLinus Torvalds li v1, 4000 # nr of sys_syscall 289*1da177e4SLinus Torvalds#else 290*1da177e4SLinus Torvalds li v1, 4000 - __NR_O32_Linux # index of sys_syscall 291*1da177e4SLinus Torvalds#endif 292*1da177e4SLinus Torvalds beq t0, v1, einval # do not recurse 293*1da177e4SLinus Torvalds 294*1da177e4SLinus Torvalds /* Some syscalls like execve get their arguments from struct pt_regs 295*1da177e4SLinus Torvalds and claim zero arguments in the syscall table. Thus we have to 296*1da177e4SLinus Torvalds assume the worst case and shuffle around all potential arguments. 297*1da177e4SLinus Torvalds If you want performance, don't use indirect syscalls. */ 298*1da177e4SLinus Torvalds 299*1da177e4SLinus Torvalds move a0, a1 # shift argument registers 300*1da177e4SLinus Torvalds move a1, a2 301*1da177e4SLinus Torvalds move a2, a3 302*1da177e4SLinus Torvalds lw a3, 16(sp) 303*1da177e4SLinus Torvalds lw t4, 20(sp) 304*1da177e4SLinus Torvalds lw t5, 24(sp) 305*1da177e4SLinus Torvalds lw t6, 28(sp) 306*1da177e4SLinus Torvalds sw t4, 16(sp) 307*1da177e4SLinus Torvalds sw t5, 20(sp) 308*1da177e4SLinus Torvalds sw t6, 24(sp) 309*1da177e4SLinus Torvalds sw a0, PT_R4(sp) # .. and push back a0 - a3, some 310*1da177e4SLinus Torvalds sw a1, PT_R5(sp) # syscalls expect them there 311*1da177e4SLinus Torvalds sw a2, PT_R6(sp) 312*1da177e4SLinus Torvalds sw a3, PT_R7(sp) 313*1da177e4SLinus Torvalds sw a3, PT_R26(sp) # update a3 for syscall restarting 314*1da177e4SLinus Torvalds jr t2 315*1da177e4SLinus Torvalds /* Unreached */ 316*1da177e4SLinus Torvalds 317*1da177e4SLinus Torvaldseinval: li v0, -EINVAL 318*1da177e4SLinus Torvalds jr ra 319*1da177e4SLinus Torvalds END(sys_syscall) 320*1da177e4SLinus Torvalds 321*1da177e4SLinus Torvalds .macro fifty ptr, nargs, from=1, to=50 322*1da177e4SLinus Torvalds sys \ptr \nargs 323*1da177e4SLinus Torvalds .if \to-\from 324*1da177e4SLinus Torvalds fifty \ptr,\nargs,"(\from+1)",\to 325*1da177e4SLinus Torvalds .endif 326*1da177e4SLinus Torvalds .endm 327*1da177e4SLinus Torvalds 328*1da177e4SLinus Torvalds .macro mille ptr, nargs, from=1, to=20 329*1da177e4SLinus Torvalds fifty \ptr,\nargs 330*1da177e4SLinus Torvalds .if \to-\from 331*1da177e4SLinus Torvalds mille \ptr,\nargs,"(\from+1)",\to 332*1da177e4SLinus Torvalds .endif 333*1da177e4SLinus Torvalds .endm 334*1da177e4SLinus Torvalds 335*1da177e4SLinus Torvalds .macro syscalltable 336*1da177e4SLinus Torvalds#if defined(CONFIG_BINFMT_IRIX) 337*1da177e4SLinus Torvalds mille sys_ni_syscall 0 /* 0 - 999 SVR4 flavour */ 338*1da177e4SLinus Torvalds mille sys_ni_syscall 0 /* 1000 - 1999 32-bit IRIX */ 339*1da177e4SLinus Torvalds mille sys_ni_syscall 0 /* 2000 - 2999 BSD43 flavour */ 340*1da177e4SLinus Torvalds mille sys_ni_syscall 0 /* 3000 - 3999 POSIX flavour */ 341*1da177e4SLinus Torvalds#endif 342*1da177e4SLinus Torvalds 343*1da177e4SLinus Torvalds sys sys_syscall 8 /* 4000 */ 344*1da177e4SLinus Torvalds sys sys_exit 1 345*1da177e4SLinus Torvalds sys sys_fork 0 346*1da177e4SLinus Torvalds sys sys_read 3 347*1da177e4SLinus Torvalds sys sys_write 3 348*1da177e4SLinus Torvalds sys sys_open 3 /* 4005 */ 349*1da177e4SLinus Torvalds sys sys_close 1 350*1da177e4SLinus Torvalds sys sys_waitpid 3 351*1da177e4SLinus Torvalds sys sys_creat 2 352*1da177e4SLinus Torvalds sys sys_link 2 353*1da177e4SLinus Torvalds sys sys_unlink 1 /* 4010 */ 354*1da177e4SLinus Torvalds sys sys_execve 0 355*1da177e4SLinus Torvalds sys sys_chdir 1 356*1da177e4SLinus Torvalds sys sys_time 1 357*1da177e4SLinus Torvalds sys sys_mknod 3 358*1da177e4SLinus Torvalds sys sys_chmod 2 /* 4015 */ 359*1da177e4SLinus Torvalds sys sys_lchown 3 360*1da177e4SLinus Torvalds sys sys_ni_syscall 0 361*1da177e4SLinus Torvalds sys sys_ni_syscall 0 /* was sys_stat */ 362*1da177e4SLinus Torvalds sys sys_lseek 3 363*1da177e4SLinus Torvalds sys sys_getpid 0 /* 4020 */ 364*1da177e4SLinus Torvalds sys sys_mount 5 365*1da177e4SLinus Torvalds sys sys_oldumount 1 366*1da177e4SLinus Torvalds sys sys_setuid 1 367*1da177e4SLinus Torvalds sys sys_getuid 0 368*1da177e4SLinus Torvalds sys sys_stime 1 /* 4025 */ 369*1da177e4SLinus Torvalds sys sys_ptrace 4 370*1da177e4SLinus Torvalds sys sys_alarm 1 371*1da177e4SLinus Torvalds sys sys_ni_syscall 0 /* was sys_fstat */ 372*1da177e4SLinus Torvalds sys sys_pause 0 373*1da177e4SLinus Torvalds sys sys_utime 2 /* 4030 */ 374*1da177e4SLinus Torvalds sys sys_ni_syscall 0 375*1da177e4SLinus Torvalds sys sys_ni_syscall 0 376*1da177e4SLinus Torvalds sys sys_access 2 377*1da177e4SLinus Torvalds sys sys_nice 1 378*1da177e4SLinus Torvalds sys sys_ni_syscall 0 /* 4035 */ 379*1da177e4SLinus Torvalds sys sys_sync 0 380*1da177e4SLinus Torvalds sys sys_kill 2 381*1da177e4SLinus Torvalds sys sys_rename 2 382*1da177e4SLinus Torvalds sys sys_mkdir 2 383*1da177e4SLinus Torvalds sys sys_rmdir 1 /* 4040 */ 384*1da177e4SLinus Torvalds sys sys_dup 1 385*1da177e4SLinus Torvalds sys sys_pipe 0 386*1da177e4SLinus Torvalds sys sys_times 1 387*1da177e4SLinus Torvalds sys sys_ni_syscall 0 388*1da177e4SLinus Torvalds sys sys_brk 1 /* 4045 */ 389*1da177e4SLinus Torvalds sys sys_setgid 1 390*1da177e4SLinus Torvalds sys sys_getgid 0 391*1da177e4SLinus Torvalds sys sys_ni_syscall 0 /* was signal(2) */ 392*1da177e4SLinus Torvalds sys sys_geteuid 0 393*1da177e4SLinus Torvalds sys sys_getegid 0 /* 4050 */ 394*1da177e4SLinus Torvalds sys sys_acct 1 395*1da177e4SLinus Torvalds sys sys_umount 2 396*1da177e4SLinus Torvalds sys sys_ni_syscall 0 397*1da177e4SLinus Torvalds sys sys_ioctl 3 398*1da177e4SLinus Torvalds sys sys_fcntl 3 /* 4055 */ 399*1da177e4SLinus Torvalds sys sys_ni_syscall 2 400*1da177e4SLinus Torvalds sys sys_setpgid 2 401*1da177e4SLinus Torvalds sys sys_ni_syscall 0 402*1da177e4SLinus Torvalds sys sys_olduname 1 403*1da177e4SLinus Torvalds sys sys_umask 1 /* 4060 */ 404*1da177e4SLinus Torvalds sys sys_chroot 1 405*1da177e4SLinus Torvalds sys sys_ustat 2 406*1da177e4SLinus Torvalds sys sys_dup2 2 407*1da177e4SLinus Torvalds sys sys_getppid 0 408*1da177e4SLinus Torvalds sys sys_getpgrp 0 /* 4065 */ 409*1da177e4SLinus Torvalds sys sys_setsid 0 410*1da177e4SLinus Torvalds sys sys_sigaction 3 411*1da177e4SLinus Torvalds sys sys_sgetmask 0 412*1da177e4SLinus Torvalds sys sys_ssetmask 1 413*1da177e4SLinus Torvalds sys sys_setreuid 2 /* 4070 */ 414*1da177e4SLinus Torvalds sys sys_setregid 2 415*1da177e4SLinus Torvalds sys sys_sigsuspend 0 416*1da177e4SLinus Torvalds sys sys_sigpending 1 417*1da177e4SLinus Torvalds sys sys_sethostname 2 418*1da177e4SLinus Torvalds sys sys_setrlimit 2 /* 4075 */ 419*1da177e4SLinus Torvalds sys sys_getrlimit 2 420*1da177e4SLinus Torvalds sys sys_getrusage 2 421*1da177e4SLinus Torvalds sys sys_gettimeofday 2 422*1da177e4SLinus Torvalds sys sys_settimeofday 2 423*1da177e4SLinus Torvalds sys sys_getgroups 2 /* 4080 */ 424*1da177e4SLinus Torvalds sys sys_setgroups 2 425*1da177e4SLinus Torvalds sys sys_ni_syscall 0 /* old_select */ 426*1da177e4SLinus Torvalds sys sys_symlink 2 427*1da177e4SLinus Torvalds sys sys_ni_syscall 0 /* was sys_lstat */ 428*1da177e4SLinus Torvalds sys sys_readlink 3 /* 4085 */ 429*1da177e4SLinus Torvalds sys sys_uselib 1 430*1da177e4SLinus Torvalds sys sys_swapon 2 431*1da177e4SLinus Torvalds sys sys_reboot 3 432*1da177e4SLinus Torvalds sys old_readdir 3 433*1da177e4SLinus Torvalds sys old_mmap 6 /* 4090 */ 434*1da177e4SLinus Torvalds sys sys_munmap 2 435*1da177e4SLinus Torvalds sys sys_truncate 2 436*1da177e4SLinus Torvalds sys sys_ftruncate 2 437*1da177e4SLinus Torvalds sys sys_fchmod 2 438*1da177e4SLinus Torvalds sys sys_fchown 3 /* 4095 */ 439*1da177e4SLinus Torvalds sys sys_getpriority 2 440*1da177e4SLinus Torvalds sys sys_setpriority 3 441*1da177e4SLinus Torvalds sys sys_ni_syscall 0 442*1da177e4SLinus Torvalds sys sys_statfs 2 443*1da177e4SLinus Torvalds sys sys_fstatfs 2 /* 4100 */ 444*1da177e4SLinus Torvalds sys sys_ni_syscall 0 /* was ioperm(2) */ 445*1da177e4SLinus Torvalds sys sys_socketcall 2 446*1da177e4SLinus Torvalds sys sys_syslog 3 447*1da177e4SLinus Torvalds sys sys_setitimer 3 448*1da177e4SLinus Torvalds sys sys_getitimer 2 /* 4105 */ 449*1da177e4SLinus Torvalds sys sys_newstat 2 450*1da177e4SLinus Torvalds sys sys_newlstat 2 451*1da177e4SLinus Torvalds sys sys_newfstat 2 452*1da177e4SLinus Torvalds sys sys_uname 1 453*1da177e4SLinus Torvalds sys sys_ni_syscall 0 /* 4110 was iopl(2) */ 454*1da177e4SLinus Torvalds sys sys_vhangup 0 455*1da177e4SLinus Torvalds sys sys_ni_syscall 0 /* was sys_idle() */ 456*1da177e4SLinus Torvalds sys sys_ni_syscall 0 /* was sys_vm86 */ 457*1da177e4SLinus Torvalds sys sys_wait4 4 458*1da177e4SLinus Torvalds sys sys_swapoff 1 /* 4115 */ 459*1da177e4SLinus Torvalds sys sys_sysinfo 1 460*1da177e4SLinus Torvalds sys sys_ipc 6 461*1da177e4SLinus Torvalds sys sys_fsync 1 462*1da177e4SLinus Torvalds sys sys_sigreturn 0 463*1da177e4SLinus Torvalds sys sys_clone 0 /* 4120 */ 464*1da177e4SLinus Torvalds sys sys_setdomainname 2 465*1da177e4SLinus Torvalds sys sys_newuname 1 466*1da177e4SLinus Torvalds sys sys_ni_syscall 0 /* sys_modify_ldt */ 467*1da177e4SLinus Torvalds sys sys_adjtimex 1 468*1da177e4SLinus Torvalds sys sys_mprotect 3 /* 4125 */ 469*1da177e4SLinus Torvalds sys sys_sigprocmask 3 470*1da177e4SLinus Torvalds sys sys_ni_syscall 0 /* was create_module */ 471*1da177e4SLinus Torvalds sys sys_init_module 5 472*1da177e4SLinus Torvalds sys sys_delete_module 1 473*1da177e4SLinus Torvalds sys sys_ni_syscall 0 /* 4130 was get_kernel_syms */ 474*1da177e4SLinus Torvalds sys sys_quotactl 4 475*1da177e4SLinus Torvalds sys sys_getpgid 1 476*1da177e4SLinus Torvalds sys sys_fchdir 1 477*1da177e4SLinus Torvalds sys sys_bdflush 2 478*1da177e4SLinus Torvalds sys sys_sysfs 3 /* 4135 */ 479*1da177e4SLinus Torvalds sys sys_personality 1 480*1da177e4SLinus Torvalds sys sys_ni_syscall 0 /* for afs_syscall */ 481*1da177e4SLinus Torvalds sys sys_setfsuid 1 482*1da177e4SLinus Torvalds sys sys_setfsgid 1 483*1da177e4SLinus Torvalds sys sys_llseek 5 /* 4140 */ 484*1da177e4SLinus Torvalds sys sys_getdents 3 485*1da177e4SLinus Torvalds sys sys_select 5 486*1da177e4SLinus Torvalds sys sys_flock 2 487*1da177e4SLinus Torvalds sys sys_msync 3 488*1da177e4SLinus Torvalds sys sys_readv 3 /* 4145 */ 489*1da177e4SLinus Torvalds sys sys_writev 3 490*1da177e4SLinus Torvalds sys sys_cacheflush 3 491*1da177e4SLinus Torvalds sys sys_cachectl 3 492*1da177e4SLinus Torvalds sys sys_sysmips 4 493*1da177e4SLinus Torvalds sys sys_ni_syscall 0 /* 4150 */ 494*1da177e4SLinus Torvalds sys sys_getsid 1 495*1da177e4SLinus Torvalds sys sys_fdatasync 1 496*1da177e4SLinus Torvalds sys sys_sysctl 1 497*1da177e4SLinus Torvalds sys sys_mlock 2 498*1da177e4SLinus Torvalds sys sys_munlock 2 /* 4155 */ 499*1da177e4SLinus Torvalds sys sys_mlockall 1 500*1da177e4SLinus Torvalds sys sys_munlockall 0 501*1da177e4SLinus Torvalds sys sys_sched_setparam 2 502*1da177e4SLinus Torvalds sys sys_sched_getparam 2 503*1da177e4SLinus Torvalds sys sys_sched_setscheduler 3 /* 4160 */ 504*1da177e4SLinus Torvalds sys sys_sched_getscheduler 1 505*1da177e4SLinus Torvalds sys sys_sched_yield 0 506*1da177e4SLinus Torvalds sys sys_sched_get_priority_max 1 507*1da177e4SLinus Torvalds sys sys_sched_get_priority_min 1 508*1da177e4SLinus Torvalds sys sys_sched_rr_get_interval 2 /* 4165 */ 509*1da177e4SLinus Torvalds sys sys_nanosleep, 2 510*1da177e4SLinus Torvalds sys sys_mremap, 4 511*1da177e4SLinus Torvalds sys sys_accept 3 512*1da177e4SLinus Torvalds sys sys_bind 3 513*1da177e4SLinus Torvalds sys sys_connect 3 /* 4170 */ 514*1da177e4SLinus Torvalds sys sys_getpeername 3 515*1da177e4SLinus Torvalds sys sys_getsockname 3 516*1da177e4SLinus Torvalds sys sys_getsockopt 5 517*1da177e4SLinus Torvalds sys sys_listen 2 518*1da177e4SLinus Torvalds sys sys_recv 4 /* 4175 */ 519*1da177e4SLinus Torvalds sys sys_recvfrom 6 520*1da177e4SLinus Torvalds sys sys_recvmsg 3 521*1da177e4SLinus Torvalds sys sys_send 4 522*1da177e4SLinus Torvalds sys sys_sendmsg 3 523*1da177e4SLinus Torvalds sys sys_sendto 6 /* 4180 */ 524*1da177e4SLinus Torvalds sys sys_setsockopt 5 525*1da177e4SLinus Torvalds sys sys_shutdown 2 526*1da177e4SLinus Torvalds sys sys_socket 3 527*1da177e4SLinus Torvalds sys sys_socketpair 4 528*1da177e4SLinus Torvalds sys sys_setresuid 3 /* 4185 */ 529*1da177e4SLinus Torvalds sys sys_getresuid 3 530*1da177e4SLinus Torvalds sys sys_ni_syscall 0 /* was sys_query_module */ 531*1da177e4SLinus Torvalds sys sys_poll 3 532*1da177e4SLinus Torvalds sys sys_nfsservctl 3 533*1da177e4SLinus Torvalds sys sys_setresgid 3 /* 4190 */ 534*1da177e4SLinus Torvalds sys sys_getresgid 3 535*1da177e4SLinus Torvalds sys sys_prctl 5 536*1da177e4SLinus Torvalds sys sys_rt_sigreturn 0 537*1da177e4SLinus Torvalds sys sys_rt_sigaction 4 538*1da177e4SLinus Torvalds sys sys_rt_sigprocmask 4 /* 4195 */ 539*1da177e4SLinus Torvalds sys sys_rt_sigpending 2 540*1da177e4SLinus Torvalds sys sys_rt_sigtimedwait 4 541*1da177e4SLinus Torvalds sys sys_rt_sigqueueinfo 3 542*1da177e4SLinus Torvalds sys sys_rt_sigsuspend 0 543*1da177e4SLinus Torvalds sys sys_pread64 6 /* 4200 */ 544*1da177e4SLinus Torvalds sys sys_pwrite64 6 545*1da177e4SLinus Torvalds sys sys_chown 3 546*1da177e4SLinus Torvalds sys sys_getcwd 2 547*1da177e4SLinus Torvalds sys sys_capget 2 548*1da177e4SLinus Torvalds sys sys_capset 2 /* 4205 */ 549*1da177e4SLinus Torvalds sys sys_sigaltstack 0 550*1da177e4SLinus Torvalds sys sys_sendfile 4 551*1da177e4SLinus Torvalds sys sys_ni_syscall 0 552*1da177e4SLinus Torvalds sys sys_ni_syscall 0 553*1da177e4SLinus Torvalds sys sys_mmap2 6 /* 4210 */ 554*1da177e4SLinus Torvalds sys sys_truncate64 4 555*1da177e4SLinus Torvalds sys sys_ftruncate64 4 556*1da177e4SLinus Torvalds sys sys_stat64 2 557*1da177e4SLinus Torvalds sys sys_lstat64 2 558*1da177e4SLinus Torvalds sys sys_fstat64 2 /* 4215 */ 559*1da177e4SLinus Torvalds sys sys_pivot_root 2 560*1da177e4SLinus Torvalds sys sys_mincore 3 561*1da177e4SLinus Torvalds sys sys_madvise 3 562*1da177e4SLinus Torvalds sys sys_getdents64 3 563*1da177e4SLinus Torvalds sys sys_fcntl64 3 /* 4220 */ 564*1da177e4SLinus Torvalds sys sys_ni_syscall 0 565*1da177e4SLinus Torvalds sys sys_gettid 0 566*1da177e4SLinus Torvalds sys sys_readahead 5 567*1da177e4SLinus Torvalds sys sys_setxattr 5 568*1da177e4SLinus Torvalds sys sys_lsetxattr 5 /* 4225 */ 569*1da177e4SLinus Torvalds sys sys_fsetxattr 5 570*1da177e4SLinus Torvalds sys sys_getxattr 4 571*1da177e4SLinus Torvalds sys sys_lgetxattr 4 572*1da177e4SLinus Torvalds sys sys_fgetxattr 4 573*1da177e4SLinus Torvalds sys sys_listxattr 3 /* 4230 */ 574*1da177e4SLinus Torvalds sys sys_llistxattr 3 575*1da177e4SLinus Torvalds sys sys_flistxattr 3 576*1da177e4SLinus Torvalds sys sys_removexattr 2 577*1da177e4SLinus Torvalds sys sys_lremovexattr 2 578*1da177e4SLinus Torvalds sys sys_fremovexattr 2 /* 4235 */ 579*1da177e4SLinus Torvalds sys sys_tkill 2 580*1da177e4SLinus Torvalds sys sys_sendfile64 5 581*1da177e4SLinus Torvalds sys sys_futex 2 582*1da177e4SLinus Torvalds sys sys_sched_setaffinity 3 583*1da177e4SLinus Torvalds sys sys_sched_getaffinity 3 /* 4240 */ 584*1da177e4SLinus Torvalds sys sys_io_setup 2 585*1da177e4SLinus Torvalds sys sys_io_destroy 1 586*1da177e4SLinus Torvalds sys sys_io_getevents 5 587*1da177e4SLinus Torvalds sys sys_io_submit 3 588*1da177e4SLinus Torvalds sys sys_io_cancel 3 /* 4245 */ 589*1da177e4SLinus Torvalds sys sys_exit_group 1 590*1da177e4SLinus Torvalds sys sys_lookup_dcookie 3 591*1da177e4SLinus Torvalds sys sys_epoll_create 1 592*1da177e4SLinus Torvalds sys sys_epoll_ctl 4 593*1da177e4SLinus Torvalds sys sys_epoll_wait 3 /* 4250 */ 594*1da177e4SLinus Torvalds sys sys_remap_file_pages 5 595*1da177e4SLinus Torvalds sys sys_set_tid_address 1 596*1da177e4SLinus Torvalds sys sys_restart_syscall 0 597*1da177e4SLinus Torvalds sys sys_fadvise64_64 7 598*1da177e4SLinus Torvalds sys sys_statfs64 3 /* 4255 */ 599*1da177e4SLinus Torvalds sys sys_fstatfs64 2 600*1da177e4SLinus Torvalds sys sys_timer_create 3 601*1da177e4SLinus Torvalds sys sys_timer_settime 4 602*1da177e4SLinus Torvalds sys sys_timer_gettime 2 603*1da177e4SLinus Torvalds sys sys_timer_getoverrun 1 /* 4260 */ 604*1da177e4SLinus Torvalds sys sys_timer_delete 1 605*1da177e4SLinus Torvalds sys sys_clock_settime 2 606*1da177e4SLinus Torvalds sys sys_clock_gettime 2 607*1da177e4SLinus Torvalds sys sys_clock_getres 2 608*1da177e4SLinus Torvalds sys sys_clock_nanosleep 4 /* 4265 */ 609*1da177e4SLinus Torvalds sys sys_tgkill 3 610*1da177e4SLinus Torvalds sys sys_utimes 2 611*1da177e4SLinus Torvalds sys sys_mbind 4 612*1da177e4SLinus Torvalds sys sys_ni_syscall 0 /* sys_get_mempolicy */ 613*1da177e4SLinus Torvalds sys sys_ni_syscall 0 /* 4270 sys_set_mempolicy */ 614*1da177e4SLinus Torvalds sys sys_mq_open 4 615*1da177e4SLinus Torvalds sys sys_mq_unlink 1 616*1da177e4SLinus Torvalds sys sys_mq_timedsend 5 617*1da177e4SLinus Torvalds sys sys_mq_timedreceive 5 618*1da177e4SLinus Torvalds sys sys_mq_notify 2 /* 4275 */ 619*1da177e4SLinus Torvalds sys sys_mq_getsetattr 3 620*1da177e4SLinus Torvalds sys sys_ni_syscall 0 /* sys_vserver */ 621*1da177e4SLinus Torvalds sys sys_waitid 4 622*1da177e4SLinus Torvalds sys sys_ni_syscall 0 /* available, was setaltroot */ 623*1da177e4SLinus Torvalds sys sys_add_key 5 624*1da177e4SLinus Torvalds sys sys_request_key 4 625*1da177e4SLinus Torvalds sys sys_keyctl 5 626*1da177e4SLinus Torvalds 627*1da177e4SLinus Torvalds .endm 628*1da177e4SLinus Torvalds 629*1da177e4SLinus Torvalds /* We pre-compute the number of _instruction_ bytes needed to 630*1da177e4SLinus Torvalds load or store the arguments 6-8. Negative values are ignored. */ 631*1da177e4SLinus Torvalds 632*1da177e4SLinus Torvalds .macro sys function, nargs 633*1da177e4SLinus Torvalds PTR \function 634*1da177e4SLinus Torvalds LONG (\nargs << 2) - (5 << 2) 635*1da177e4SLinus Torvalds .endm 636*1da177e4SLinus Torvalds 637*1da177e4SLinus Torvalds .align 3 638*1da177e4SLinus Torvalds .type sys_call_table,@object 639*1da177e4SLinus TorvaldsEXPORT(sys_call_table) 640*1da177e4SLinus Torvalds syscalltable 641*1da177e4SLinus Torvalds .size sys_call_table, . - sys_call_table 642