1/* 2 * This file is subject to the terms and conditions of the GNU General Public 3 * License. See the file "COPYING" in the main directory of this archive 4 * for more details. 5 * 6 * Copyright (C) 1995, 96, 97, 98, 99, 2000 by Ralf Baechle 7 */ 8#ifndef _ASM_UNISTD_H 9#define _ASM_UNISTD_H 10 11#define __NR_Linux 4000 12#define __NR_syscall (__NR_Linux + 0) 13#define __NR_exit (__NR_Linux + 1) 14#define __NR_fork (__NR_Linux + 2) 15#define __NR_read (__NR_Linux + 3) 16#define __NR_write (__NR_Linux + 4) 17#define __NR_open (__NR_Linux + 5) 18#define __NR_close (__NR_Linux + 6) 19#define __NR_waitpid (__NR_Linux + 7) 20#define __NR_creat (__NR_Linux + 8) 21#define __NR_link (__NR_Linux + 9) 22#define __NR_unlink (__NR_Linux + 10) 23#define __NR_execve (__NR_Linux + 11) 24#define __NR_chdir (__NR_Linux + 12) 25#define __NR_time (__NR_Linux + 13) 26#define __NR_mknod (__NR_Linux + 14) 27#define __NR_chmod (__NR_Linux + 15) 28#define __NR_lchown (__NR_Linux + 16) 29#define __NR_break (__NR_Linux + 17) 30#define __NR_unused18 (__NR_Linux + 18) 31#define __NR_lseek (__NR_Linux + 19) 32#define __NR_getpid (__NR_Linux + 20) 33#define __NR_mount (__NR_Linux + 21) 34#define __NR_umount (__NR_Linux + 22) 35#define __NR_setuid (__NR_Linux + 23) 36#define __NR_getuid (__NR_Linux + 24) 37#define __NR_stime (__NR_Linux + 25) 38#define __NR_ptrace (__NR_Linux + 26) 39#define __NR_alarm (__NR_Linux + 27) 40#define __NR_unused28 (__NR_Linux + 28) 41#define __NR_pause (__NR_Linux + 29) 42#define __NR_utime (__NR_Linux + 30) 43#define __NR_stty (__NR_Linux + 31) 44#define __NR_gtty (__NR_Linux + 32) 45#define __NR_access (__NR_Linux + 33) 46#define __NR_nice (__NR_Linux + 34) 47#define __NR_ftime (__NR_Linux + 35) 48#define __NR_sync (__NR_Linux + 36) 49#define __NR_kill (__NR_Linux + 37) 50#define __NR_rename (__NR_Linux + 38) 51#define __NR_mkdir (__NR_Linux + 39) 52#define __NR_rmdir (__NR_Linux + 40) 53#define __NR_dup (__NR_Linux + 41) 54#define __NR_pipe (__NR_Linux + 42) 55#define __NR_times (__NR_Linux + 43) 56#define __NR_prof (__NR_Linux + 44) 57#define __NR_brk (__NR_Linux + 45) 58#define __NR_setgid (__NR_Linux + 46) 59#define __NR_getgid (__NR_Linux + 47) 60#define __NR_signal (__NR_Linux + 48) 61#define __NR_geteuid (__NR_Linux + 49) 62#define __NR_getegid (__NR_Linux + 50) 63#define __NR_acct (__NR_Linux + 51) 64#define __NR_umount2 (__NR_Linux + 52) 65#define __NR_lock (__NR_Linux + 53) 66#define __NR_ioctl (__NR_Linux + 54) 67#define __NR_fcntl (__NR_Linux + 55) 68#define __NR_mpx (__NR_Linux + 56) 69#define __NR_setpgid (__NR_Linux + 57) 70#define __NR_ulimit (__NR_Linux + 58) 71#define __NR_unused59 (__NR_Linux + 59) 72#define __NR_umask (__NR_Linux + 60) 73#define __NR_chroot (__NR_Linux + 61) 74#define __NR_ustat (__NR_Linux + 62) 75#define __NR_dup2 (__NR_Linux + 63) 76#define __NR_getppid (__NR_Linux + 64) 77#define __NR_getpgrp (__NR_Linux + 65) 78#define __NR_setsid (__NR_Linux + 66) 79#define __NR_sigaction (__NR_Linux + 67) 80#define __NR_sgetmask (__NR_Linux + 68) 81#define __NR_ssetmask (__NR_Linux + 69) 82#define __NR_setreuid (__NR_Linux + 70) 83#define __NR_setregid (__NR_Linux + 71) 84#define __NR_sigsuspend (__NR_Linux + 72) 85#define __NR_sigpending (__NR_Linux + 73) 86#define __NR_sethostname (__NR_Linux + 74) 87#define __NR_setrlimit (__NR_Linux + 75) 88#define __NR_getrlimit (__NR_Linux + 76) 89#define __NR_getrusage (__NR_Linux + 77) 90#define __NR_gettimeofday (__NR_Linux + 78) 91#define __NR_settimeofday (__NR_Linux + 79) 92#define __NR_getgroups (__NR_Linux + 80) 93#define __NR_setgroups (__NR_Linux + 81) 94#define __NR_reserved82 (__NR_Linux + 82) 95#define __NR_symlink (__NR_Linux + 83) 96#define __NR_unused84 (__NR_Linux + 84) 97#define __NR_readlink (__NR_Linux + 85) 98#define __NR_uselib (__NR_Linux + 86) 99#define __NR_swapon (__NR_Linux + 87) 100#define __NR_reboot (__NR_Linux + 88) 101#define __NR_readdir (__NR_Linux + 89) 102#define __NR_mmap (__NR_Linux + 90) 103#define __NR_munmap (__NR_Linux + 91) 104#define __NR_truncate (__NR_Linux + 92) 105#define __NR_ftruncate (__NR_Linux + 93) 106#define __NR_fchmod (__NR_Linux + 94) 107#define __NR_fchown (__NR_Linux + 95) 108#define __NR_getpriority (__NR_Linux + 96) 109#define __NR_setpriority (__NR_Linux + 97) 110#define __NR_profil (__NR_Linux + 98) 111#define __NR_statfs (__NR_Linux + 99) 112#define __NR_fstatfs (__NR_Linux + 100) 113#define __NR_ioperm (__NR_Linux + 101) 114#define __NR_socketcall (__NR_Linux + 102) 115#define __NR_syslog (__NR_Linux + 103) 116#define __NR_setitimer (__NR_Linux + 104) 117#define __NR_getitimer (__NR_Linux + 105) 118#define __NR_stat (__NR_Linux + 106) 119#define __NR_lstat (__NR_Linux + 107) 120#define __NR_fstat (__NR_Linux + 108) 121#define __NR_unused109 (__NR_Linux + 109) 122#define __NR_iopl (__NR_Linux + 110) 123#define __NR_vhangup (__NR_Linux + 111) 124#define __NR_idle (__NR_Linux + 112) 125#define __NR_vm86 (__NR_Linux + 113) 126#define __NR_wait4 (__NR_Linux + 114) 127#define __NR_swapoff (__NR_Linux + 115) 128#define __NR_sysinfo (__NR_Linux + 116) 129#define __NR_ipc (__NR_Linux + 117) 130#define __NR_fsync (__NR_Linux + 118) 131#define __NR_sigreturn (__NR_Linux + 119) 132#define __NR_clone (__NR_Linux + 120) 133#define __NR_setdomainname (__NR_Linux + 121) 134#define __NR_uname (__NR_Linux + 122) 135#define __NR_modify_ldt (__NR_Linux + 123) 136#define __NR_adjtimex (__NR_Linux + 124) 137#define __NR_mprotect (__NR_Linux + 125) 138#define __NR_sigprocmask (__NR_Linux + 126) 139#define __NR_create_module (__NR_Linux + 127) 140#define __NR_init_module (__NR_Linux + 128) 141#define __NR_delete_module (__NR_Linux + 129) 142#define __NR_get_kernel_syms (__NR_Linux + 130) 143#define __NR_quotactl (__NR_Linux + 131) 144#define __NR_getpgid (__NR_Linux + 132) 145#define __NR_fchdir (__NR_Linux + 133) 146#define __NR_bdflush (__NR_Linux + 134) 147#define __NR_sysfs (__NR_Linux + 135) 148#define __NR_personality (__NR_Linux + 136) 149#define __NR_afs_syscall (__NR_Linux + 137) /* Syscall for Andrew File System */ 150#define __NR_setfsuid (__NR_Linux + 138) 151#define __NR_setfsgid (__NR_Linux + 139) 152#define __NR__llseek (__NR_Linux + 140) 153#define __NR_getdents (__NR_Linux + 141) 154#define __NR__newselect (__NR_Linux + 142) 155#define __NR_flock (__NR_Linux + 143) 156#define __NR_msync (__NR_Linux + 144) 157#define __NR_readv (__NR_Linux + 145) 158#define __NR_writev (__NR_Linux + 146) 159#define __NR_cacheflush (__NR_Linux + 147) 160#define __NR_cachectl (__NR_Linux + 148) 161#define __NR_sysmips (__NR_Linux + 149) 162#define __NR_unused150 (__NR_Linux + 150) 163#define __NR_getsid (__NR_Linux + 151) 164#define __NR_fdatasync (__NR_Linux + 152) 165#define __NR__sysctl (__NR_Linux + 153) 166#define __NR_mlock (__NR_Linux + 154) 167#define __NR_munlock (__NR_Linux + 155) 168#define __NR_mlockall (__NR_Linux + 156) 169#define __NR_munlockall (__NR_Linux + 157) 170#define __NR_sched_setparam (__NR_Linux + 158) 171#define __NR_sched_getparam (__NR_Linux + 159) 172#define __NR_sched_setscheduler (__NR_Linux + 160) 173#define __NR_sched_getscheduler (__NR_Linux + 161) 174#define __NR_sched_yield (__NR_Linux + 162) 175#define __NR_sched_get_priority_max (__NR_Linux + 163) 176#define __NR_sched_get_priority_min (__NR_Linux + 164) 177#define __NR_sched_rr_get_interval (__NR_Linux + 165) 178#define __NR_nanosleep (__NR_Linux + 166) 179#define __NR_mremap (__NR_Linux + 167) 180#define __NR_accept (__NR_Linux + 168) 181#define __NR_bind (__NR_Linux + 169) 182#define __NR_connect (__NR_Linux + 170) 183#define __NR_getpeername (__NR_Linux + 171) 184#define __NR_getsockname (__NR_Linux + 172) 185#define __NR_getsockopt (__NR_Linux + 173) 186#define __NR_listen (__NR_Linux + 174) 187#define __NR_recv (__NR_Linux + 175) 188#define __NR_recvfrom (__NR_Linux + 176) 189#define __NR_recvmsg (__NR_Linux + 177) 190#define __NR_send (__NR_Linux + 178) 191#define __NR_sendmsg (__NR_Linux + 179) 192#define __NR_sendto (__NR_Linux + 180) 193#define __NR_setsockopt (__NR_Linux + 181) 194#define __NR_shutdown (__NR_Linux + 182) 195#define __NR_socket (__NR_Linux + 183) 196#define __NR_socketpair (__NR_Linux + 184) 197#define __NR_setresuid (__NR_Linux + 185) 198#define __NR_getresuid (__NR_Linux + 186) 199#define __NR_query_module (__NR_Linux + 187) 200#define __NR_poll (__NR_Linux + 188) 201#define __NR_nfsservctl (__NR_Linux + 189) 202#define __NR_setresgid (__NR_Linux + 190) 203#define __NR_getresgid (__NR_Linux + 191) 204#define __NR_prctl (__NR_Linux + 192) 205#define __NR_rt_sigreturn (__NR_Linux + 193) 206#define __NR_rt_sigaction (__NR_Linux + 194) 207#define __NR_rt_sigprocmask (__NR_Linux + 195) 208#define __NR_rt_sigpending (__NR_Linux + 196) 209#define __NR_rt_sigtimedwait (__NR_Linux + 197) 210#define __NR_rt_sigqueueinfo (__NR_Linux + 198) 211#define __NR_rt_sigsuspend (__NR_Linux + 199) 212#define __NR_pread (__NR_Linux + 200) 213#define __NR_pwrite (__NR_Linux + 201) 214#define __NR_chown (__NR_Linux + 202) 215#define __NR_getcwd (__NR_Linux + 203) 216#define __NR_capget (__NR_Linux + 204) 217#define __NR_capset (__NR_Linux + 205) 218#define __NR_sigaltstack (__NR_Linux + 206) 219#define __NR_sendfile (__NR_Linux + 207) 220#define __NR_getpmsg (__NR_Linux + 208) 221#define __NR_putpmsg (__NR_Linux + 209) 222#define __NR_mmap2 (__NR_Linux + 210) 223#define __NR_truncate64 (__NR_Linux + 211) 224#define __NR_ftruncate64 (__NR_Linux + 212) 225#define __NR_stat64 (__NR_Linux + 213) 226#define __NR_lstat64 (__NR_Linux + 214) 227#define __NR_fstat64 (__NR_Linux + 215) 228#define __NR_pivot_root (__NR_Linux + 216) 229#define __NR_mincore (__NR_Linux + 217) 230#define __NR_madvise (__NR_Linux + 218) 231#define __NR_getdents64 (__NR_Linux + 219) 232#define __NR_fcntl64 (__NR_Linux + 220) 233#define __NR_security (__NR_Linux + 221) 234#define __NR_gettid (__NR_Linux + 222) 235#define __NR_readahead (__NR_Linux + 223) 236#define __NR_setxattr (__NR_Linux + 224) 237#define __NR_lsetxattr (__NR_Linux + 225) 238#define __NR_fsetxattr (__NR_Linux + 226) 239#define __NR_getxattr (__NR_Linux + 227) 240#define __NR_lgetxattr (__NR_Linux + 228) 241#define __NR_fgetxattr (__NR_Linux + 229) 242#define __NR_listxattr (__NR_Linux + 230) 243#define __NR_llistxattr (__NR_Linux + 231) 244#define __NR_flistxattr (__NR_Linux + 232) 245#define __NR_removexattr (__NR_Linux + 233) 246#define __NR_lremovexattr (__NR_Linux + 234) 247#define __NR_fremovexattr (__NR_Linux + 235) 248#define __NR_tkill (__NR_Linux + 236) 249#define __NR_sendfile64 (__NR_Linux + 237) 250#define __NR_futex (__NR_Linux + 238) 251#define __NR_sched_setaffinity (__NR_Linux + 239) 252#define __NR_sched_getaffinity (__NR_Linux + 240) 253#define __NR_set_clean_conntrack_flag (__NR_Linux + 241) // 2009.04 James. wanduck. 254 255/* 256 * Offset of the last Linux flavoured syscall 257 */ 258#define __NR_Linux_syscalls 241 259 260#ifndef __ASSEMBLY__ 261 262#define _syscall0(type,name) \ 263type name(void) \ 264{ \ 265 register unsigned long __v0 asm("$2") = __NR_##name; \ 266 register unsigned long __a3 asm("$7"); \ 267 \ 268 __asm__ volatile ( \ 269 ".set\tnoreorder\n\t" \ 270 "li\t$2, %2\t\t\t# " #name "\n\t" \ 271 "syscall\n\t" \ 272 ".set\treorder" \ 273 : "=&r" (__v0), "=r" (__a3) \ 274 : "i" (__NR_##name) \ 275 : "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24"); \ 276 \ 277 if (__a3 == 0) \ 278 return (type) __v0; \ 279 errno = __v0; \ 280 return -1; \ 281} 282 283/* 284 * DANGER: This macro isn't usable for the pipe(2) call 285 * which has a unusual return convention. 286 */ 287#define _syscall1(type,name,atype,a) \ 288type name(atype a) \ 289{ \ 290 register unsigned long __v0 asm("$2") = __NR_##name; \ 291 register unsigned long __a0 asm("$4") = (unsigned long) a; \ 292 register unsigned long __a3 asm("$7"); \ 293 \ 294 __asm__ volatile ( \ 295 ".set\tnoreorder\n\t" \ 296 "li\t$2, %3\t\t\t# " #name "\n\t" \ 297 "syscall\n\t" \ 298 ".set\treorder" \ 299 : "=&r" (__v0), "=r" (__a3) \ 300 : "r" (__a0), "i" (__NR_##name) \ 301 : "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24"); \ 302 \ 303 if (__a3 == 0) \ 304 return (type) __v0; \ 305 errno = __v0; \ 306 return -1; \ 307} 308 309#define _syscall2(type,name,atype,a,btype,b) \ 310type name(atype a, btype b) \ 311{ \ 312 register unsigned long __v0 asm("$2") = __NR_##name; \ 313 register unsigned long __a0 asm("$4") = (unsigned long) a; \ 314 register unsigned long __a1 asm("$5") = (unsigned long) b; \ 315 register unsigned long __a3 asm("$7"); \ 316 \ 317 __asm__ volatile ( \ 318 ".set\tnoreorder\n\t" \ 319 "li\t$2, %4\t\t\t# " #name "\n\t" \ 320 "syscall\n\t" \ 321 ".set\treorder" \ 322 : "=&r" (__v0), "=r" (__a3) \ 323 : "r" (__a0), "r" (__a1), "i" (__NR_##name) \ 324 : "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24"); \ 325 \ 326 if (__a3 == 0) \ 327 return (type) __v0; \ 328 errno = __v0; \ 329 return -1; \ 330} 331 332#define _syscall3(type,name,atype,a,btype,b,ctype,c) \ 333type name(atype a, btype b, ctype c) \ 334{ \ 335 register unsigned long __v0 asm("$2") = __NR_##name; \ 336 register unsigned long __a0 asm("$4") = (unsigned long) a; \ 337 register unsigned long __a1 asm("$5") = (unsigned long) b; \ 338 register unsigned long __a2 asm("$6") = (unsigned long) c; \ 339 register unsigned long __a3 asm("$7"); \ 340 \ 341 __asm__ volatile ( \ 342 ".set\tnoreorder\n\t" \ 343 "li\t$2, %5\t\t\t# " #name "\n\t" \ 344 "syscall\n\t" \ 345 ".set\treorder" \ 346 : "=&r" (__v0), "=r" (__a3) \ 347 : "r" (__a0), "r" (__a1), "r" (__a2), "i" (__NR_##name) \ 348 : "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24"); \ 349 \ 350 if (__a3 == 0) \ 351 return (type) __v0; \ 352 errno = __v0; \ 353 return -1; \ 354} 355 356#define _syscall4(type,name,atype,a,btype,b,ctype,c,dtype,d) \ 357type name(atype a, btype b, ctype c, dtype d) \ 358{ \ 359 register unsigned long __v0 asm("$2") = __NR_##name; \ 360 register unsigned long __a0 asm("$4") = (unsigned long) a; \ 361 register unsigned long __a1 asm("$5") = (unsigned long) b; \ 362 register unsigned long __a2 asm("$6") = (unsigned long) c; \ 363 register unsigned long __a3 asm("$7") = (unsigned long) d; \ 364 \ 365 __asm__ volatile ( \ 366 ".set\tnoreorder\n\t" \ 367 "li\t$2, %5\t\t\t# " #name "\n\t" \ 368 "syscall\n\t" \ 369 ".set\treorder" \ 370 : "=&r" (__v0), "+r" (__a3) \ 371 : "r" (__a0), "r" (__a1), "r" (__a2), "i" (__NR_##name) \ 372 : "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24"); \ 373 \ 374 if (__a3 == 0) \ 375 return (type) __v0; \ 376 errno = __v0; \ 377 return -1; \ 378} 379 380/* 381 * Using those means your brain needs more than an oil change ;-) 382 */ 383 384#define _syscall5(type,name,atype,a,btype,b,ctype,c,dtype,d,etype,e) \ 385type name(atype a, btype b, ctype c, dtype d, etype e) \ 386{ \ 387 register unsigned long __v0 asm("$2") = __NR_##name; \ 388 register unsigned long __a0 asm("$4") = (unsigned long) a; \ 389 register unsigned long __a1 asm("$5") = (unsigned long) b; \ 390 register unsigned long __a2 asm("$6") = (unsigned long) c; \ 391 register unsigned long __a3 asm("$7") = (unsigned long) d; \ 392 \ 393 __asm__ volatile ( \ 394 ".set\tnoreorder\n\t" \ 395 "lw\t$2, %6\n\t" \ 396 "subu\t$29, 32\n\t" \ 397 "sw\t$2, 16($29)\n\t" \ 398 "li\t$2, %5\t\t\t# " #name "\n\t" \ 399 "syscall\n\t" \ 400 "addiu\t$29, 32\n\t" \ 401 ".set\treorder" \ 402 : "=&r" (__v0), "+r" (__a3) \ 403 : "r" (__a0), "r" (__a1), "r" (__a2), "i" (__NR_##name), \ 404 "m" ((unsigned long)e) \ 405 : "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24"); \ 406 \ 407 if (__a3 == 0) \ 408 return (type) __v0; \ 409 errno = __v0; \ 410 return -1; \ 411} 412 413#define _syscall6(type,name,atype,a,btype,b,ctype,c,dtype,d,etype,e,ftype,f) \ 414type name(atype a, btype b, ctype c, dtype d, etype e, ftype f) \ 415{ \ 416 register unsigned long __v0 asm("$2") = __NR_##name; \ 417 register unsigned long __a0 asm("$4") = (unsigned long) a; \ 418 register unsigned long __a1 asm("$5") = (unsigned long) b; \ 419 register unsigned long __a2 asm("$6") = (unsigned long) c; \ 420 register unsigned long __a3 asm("$7") = (unsigned long) d; \ 421 \ 422 __asm__ volatile ( \ 423 ".set\tnoreorder\n\t" \ 424 "lw\t$2, %6\n\t" \ 425 "lw\t$8, %7\n\t" \ 426 "subu\t$29, 32\n\t" \ 427 "sw\t$2, 16($29)\n\t" \ 428 "sw\t$8, 20($29)\n\t" \ 429 "li\t$2, %5\t\t\t# " #name "\n\t" \ 430 "syscall\n\t" \ 431 "addiu\t$29, 32\n\t" \ 432 ".set\treorder" \ 433 : "=&r" (__v0), "+r" (__a3) \ 434 : "r" (__a0), "r" (__a1), "r" (__a2), "i" (__NR_##name), \ 435 "m" ((unsigned long)e), "m" ((unsigned long)f) \ 436 : "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24"); \ 437 \ 438 if (__a3 == 0) \ 439 return (type) __v0; \ 440 errno = __v0; \ 441 return -1; \ 442} 443 444#define _syscall7(type,name,atype,a,btype,b,ctype,c,dtype,d,etype,e,ftype,f,gtype,g) \ 445type name(atype a, btype b, ctype c, dtype d, etype e, ftype f, gtype g) \ 446{ \ 447 register unsigned long __v0 asm("$2") = __NR_##name; \ 448 register unsigned long __a0 asm("$4") = (unsigned long) a; \ 449 register unsigned long __a1 asm("$5") = (unsigned long) b; \ 450 register unsigned long __a2 asm("$6") = (unsigned long) c; \ 451 register unsigned long __a3 asm("$7") = (unsigned long) d; \ 452 \ 453 __asm__ volatile ( \ 454 ".set\tnoreorder\n\t" \ 455 "lw\t$2, %6\n\t" \ 456 "lw\t$8, %7\n\t" \ 457 "lw\t$9, %8\n\t" \ 458 "subu\t$29, 32\n\t" \ 459 "sw\t$2, 16($29)\n\t" \ 460 "sw\t$8, 20($29)\n\t" \ 461 "sw\t$9, 24($29)\n\t" \ 462 "li\t$2, %5\t\t\t# " #name "\n\t" \ 463 "syscall\n\t" \ 464 "addiu\t$29, 32\n\t" \ 465 ".set\treorder" \ 466 : "=&r" (__v0), "+r" (__a3) \ 467 : "r" (__a0), "r" (__a1), "r" (__a2), "i" (__NR_##name), \ 468 "m" ((unsigned long)e), "m" ((unsigned long)f), \ 469 "m" ((unsigned long)g), \ 470 : "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24"); \ 471 \ 472 if (__a3 == 0) \ 473 return (type) __v0; \ 474 errno = __v0; \ 475 return -1; \ 476} 477 478 479#ifdef __KERNEL_SYSCALLS__ 480 481/* 482 * we need this inline - forking from kernel space will result 483 * in NO COPY ON WRITE (!!!), until an execve is executed. This 484 * is no problem, but for the stack. This is handled by not letting 485 * main() use the stack at all after fork(). Thus, no function 486 * calls - which means inline code for fork too, as otherwise we 487 * would use the stack upon exit from 'fork()'. 488 * 489 * Actually only pause and fork are needed inline, so that there 490 * won't be any messing with the stack from main(), but we define 491 * some others too. 492 */ 493#define __NR__exit __NR_exit 494static inline _syscall0(int,sync) 495static inline _syscall0(pid_t,setsid) 496static inline _syscall3(int,write,int,fd,const char *,buf,off_t,count) 497static inline _syscall3(int,read,int,fd,char *,buf,off_t,count) 498static inline _syscall3(off_t,lseek,int,fd,off_t,offset,int,count) 499static inline _syscall1(int,dup,int,fd) 500static inline _syscall3(int,execve,const char *,file,char **,argv,char **,envp) 501static inline _syscall3(int,open,const char *,file,int,flag,int,mode) 502static inline _syscall1(int,close,int,fd) 503static inline _syscall1(int,_exit,int,exitcode) 504static inline _syscall3(pid_t,waitpid,pid_t,pid,int *,wait_stat,int,options) 505static inline _syscall1(int,delete_module,const char *,name) 506 507static inline pid_t wait(int * wait_stat) 508{ 509 return waitpid(-1,wait_stat,0); 510} 511 512#endif /* __KERNEL_SYSCALLS__ */ 513#endif /* !__ASSEMBLY__ */ 514 515#endif /* _ASM_UNISTD_H */ 516