|
|
1.1 ! root 1: #ifndef _ASM_I386_UNISTD_H_ ! 2: #define _ASM_I386_UNISTD_H_ ! 3: ! 4: /* ! 5: * This file contains the system call numbers. ! 6: */ ! 7: ! 8: #define __NR_setup 0 /* used only by init, to get system going */ ! 9: #define __NR_exit 1 ! 10: #define __NR_fork 2 ! 11: #define __NR_read 3 ! 12: #define __NR_write 4 ! 13: #define __NR_open 5 ! 14: #define __NR_close 6 ! 15: #define __NR_waitpid 7 ! 16: #define __NR_creat 8 ! 17: #define __NR_link 9 ! 18: #define __NR_unlink 10 ! 19: #define __NR_execve 11 ! 20: #define __NR_chdir 12 ! 21: #define __NR_time 13 ! 22: #define __NR_mknod 14 ! 23: #define __NR_chmod 15 ! 24: #define __NR_chown 16 ! 25: #define __NR_break 17 ! 26: #define __NR_oldstat 18 ! 27: #define __NR_lseek 19 ! 28: #define __NR_getpid 20 ! 29: #define __NR_mount 21 ! 30: #define __NR_umount 22 ! 31: #define __NR_setuid 23 ! 32: #define __NR_getuid 24 ! 33: #define __NR_stime 25 ! 34: #define __NR_ptrace 26 ! 35: #define __NR_alarm 27 ! 36: #define __NR_oldfstat 28 ! 37: #define __NR_pause 29 ! 38: #define __NR_utime 30 ! 39: #define __NR_stty 31 ! 40: #define __NR_gtty 32 ! 41: #define __NR_access 33 ! 42: #define __NR_nice 34 ! 43: #define __NR_ftime 35 ! 44: #define __NR_sync 36 ! 45: #define __NR_kill 37 ! 46: #define __NR_rename 38 ! 47: #define __NR_mkdir 39 ! 48: #define __NR_rmdir 40 ! 49: #define __NR_dup 41 ! 50: #define __NR_pipe 42 ! 51: #define __NR_times 43 ! 52: #define __NR_prof 44 ! 53: #define __NR_brk 45 ! 54: #define __NR_setgid 46 ! 55: #define __NR_getgid 47 ! 56: #define __NR_signal 48 ! 57: #define __NR_geteuid 49 ! 58: #define __NR_getegid 50 ! 59: #define __NR_acct 51 ! 60: #define __NR_phys 52 ! 61: #define __NR_lock 53 ! 62: #define __NR_ioctl 54 ! 63: #define __NR_fcntl 55 ! 64: #define __NR_mpx 56 ! 65: #define __NR_setpgid 57 ! 66: #define __NR_ulimit 58 ! 67: #define __NR_oldolduname 59 ! 68: #define __NR_umask 60 ! 69: #define __NR_chroot 61 ! 70: #define __NR_ustat 62 ! 71: #define __NR_dup2 63 ! 72: #define __NR_getppid 64 ! 73: #define __NR_getpgrp 65 ! 74: #define __NR_setsid 66 ! 75: #define __NR_sigaction 67 ! 76: #define __NR_sgetmask 68 ! 77: #define __NR_ssetmask 69 ! 78: #define __NR_setreuid 70 ! 79: #define __NR_setregid 71 ! 80: #define __NR_sigsuspend 72 ! 81: #define __NR_sigpending 73 ! 82: #define __NR_sethostname 74 ! 83: #define __NR_setrlimit 75 ! 84: #define __NR_getrlimit 76 ! 85: #define __NR_getrusage 77 ! 86: #define __NR_gettimeofday 78 ! 87: #define __NR_settimeofday 79 ! 88: #define __NR_getgroups 80 ! 89: #define __NR_setgroups 81 ! 90: #define __NR_select 82 ! 91: #define __NR_symlink 83 ! 92: #define __NR_oldlstat 84 ! 93: #define __NR_readlink 85 ! 94: #define __NR_uselib 86 ! 95: #define __NR_swapon 87 ! 96: #define __NR_reboot 88 ! 97: #define __NR_readdir 89 ! 98: #define __NR_mmap 90 ! 99: #define __NR_munmap 91 ! 100: #define __NR_truncate 92 ! 101: #define __NR_ftruncate 93 ! 102: #define __NR_fchmod 94 ! 103: #define __NR_fchown 95 ! 104: #define __NR_getpriority 96 ! 105: #define __NR_setpriority 97 ! 106: #define __NR_profil 98 ! 107: #define __NR_statfs 99 ! 108: #define __NR_fstatfs 100 ! 109: #define __NR_ioperm 101 ! 110: #define __NR_socketcall 102 ! 111: #define __NR_syslog 103 ! 112: #define __NR_setitimer 104 ! 113: #define __NR_getitimer 105 ! 114: #define __NR_stat 106 ! 115: #define __NR_lstat 107 ! 116: #define __NR_fstat 108 ! 117: #define __NR_olduname 109 ! 118: #define __NR_iopl 110 ! 119: #define __NR_vhangup 111 ! 120: #define __NR_idle 112 ! 121: #define __NR_vm86 113 ! 122: #define __NR_wait4 114 ! 123: #define __NR_swapoff 115 ! 124: #define __NR_sysinfo 116 ! 125: #define __NR_ipc 117 ! 126: #define __NR_fsync 118 ! 127: #define __NR_sigreturn 119 ! 128: #define __NR_clone 120 ! 129: #define __NR_setdomainname 121 ! 130: #define __NR_uname 122 ! 131: #define __NR_modify_ldt 123 ! 132: #define __NR_adjtimex 124 ! 133: #define __NR_mprotect 125 ! 134: #define __NR_sigprocmask 126 ! 135: #define __NR_create_module 127 ! 136: #define __NR_init_module 128 ! 137: #define __NR_delete_module 129 ! 138: #define __NR_get_kernel_syms 130 ! 139: #define __NR_quotactl 131 ! 140: #define __NR_getpgid 132 ! 141: #define __NR_fchdir 133 ! 142: #define __NR_bdflush 134 ! 143: #define __NR_sysfs 135 ! 144: #define __NR_personality 136 ! 145: #define __NR_afs_syscall 137 /* Syscall for Andrew File System */ ! 146: #define __NR_setfsuid 138 ! 147: #define __NR_setfsgid 139 ! 148: #define __NR__llseek 140 ! 149: #define __NR_getdents 141 ! 150: #define __NR__newselect 142 ! 151: #define __NR_flock 143 ! 152: #define __NR_msync 144 ! 153: #define __NR_readv 145 ! 154: #define __NR_writev 146 ! 155: #define __NR_getsid 147 ! 156: #define __NR_fdatasync 148 ! 157: #define __NR__sysctl 149 ! 158: #define __NR_mlock 150 ! 159: #define __NR_munlock 151 ! 160: #define __NR_mlockall 152 ! 161: #define __NR_munlockall 153 ! 162: #define __NR_sched_setparam 154 ! 163: #define __NR_sched_getparam 155 ! 164: #define __NR_sched_setscheduler 156 ! 165: #define __NR_sched_getscheduler 157 ! 166: #define __NR_sched_yield 158 ! 167: #define __NR_sched_get_priority_max 159 ! 168: #define __NR_sched_get_priority_min 160 ! 169: #define __NR_sched_rr_get_interval 161 ! 170: #define __NR_nanosleep 162 ! 171: #define __NR_mremap 163 ! 172: #define __NR_poll 168 ! 173: #define __NR_getpmsg 188 ! 174: #define __NR_putpmsg 189 ! 175: ! 176: /* XXX - _foo needs to be __foo, while __NR_bar could be _NR_bar. */ ! 177: #define _syscall0(type,name) \ ! 178: type name(void) \ ! 179: { \ ! 180: long __res; \ ! 181: __asm__ volatile ("int $0x80" \ ! 182: : "=a" (__res) \ ! 183: : "0" (__NR_##name)); \ ! 184: if (__res >= 0) \ ! 185: return (type) __res; \ ! 186: errno = -__res; \ ! 187: return -1; \ ! 188: } ! 189: ! 190: #define _syscall1(type,name,type1,arg1) \ ! 191: type name(type1 arg1) \ ! 192: { \ ! 193: long __res; \ ! 194: __asm__ volatile ("int $0x80" \ ! 195: : "=a" (__res) \ ! 196: : "0" (__NR_##name),"b" ((long)(arg1))); \ ! 197: if (__res >= 0) \ ! 198: return (type) __res; \ ! 199: errno = -__res; \ ! 200: return -1; \ ! 201: } ! 202: ! 203: #define _syscall2(type,name,type1,arg1,type2,arg2) \ ! 204: type name(type1 arg1,type2 arg2) \ ! 205: { \ ! 206: long __res; \ ! 207: __asm__ volatile ("int $0x80" \ ! 208: : "=a" (__res) \ ! 209: : "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2))); \ ! 210: if (__res >= 0) \ ! 211: return (type) __res; \ ! 212: errno = -__res; \ ! 213: return -1; \ ! 214: } ! 215: ! 216: #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \ ! 217: type name(type1 arg1,type2 arg2,type3 arg3) \ ! 218: { \ ! 219: long __res; \ ! 220: __asm__ volatile ("int $0x80" \ ! 221: : "=a" (__res) \ ! 222: : "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \ ! 223: "d" ((long)(arg3))); \ ! 224: if (__res>=0) \ ! 225: return (type) __res; \ ! 226: errno=-__res; \ ! 227: return -1; \ ! 228: } ! 229: ! 230: #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ ! 231: type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4) \ ! 232: { \ ! 233: long __res; \ ! 234: __asm__ volatile ("int $0x80" \ ! 235: : "=a" (__res) \ ! 236: : "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \ ! 237: "d" ((long)(arg3)),"S" ((long)(arg4))); \ ! 238: if (__res>=0) \ ! 239: return (type) __res; \ ! 240: errno=-__res; \ ! 241: return -1; \ ! 242: } ! 243: ! 244: #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ ! 245: type5,arg5) \ ! 246: type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \ ! 247: { \ ! 248: long __res; \ ! 249: __asm__ volatile ("int $0x80" \ ! 250: : "=a" (__res) \ ! 251: : "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \ ! 252: "d" ((long)(arg3)),"S" ((long)(arg4)),"D" ((long)(arg5))); \ ! 253: if (__res>=0) \ ! 254: return (type) __res; \ ! 255: errno=-__res; \ ! 256: return -1; \ ! 257: } ! 258: ! 259: #ifdef __KERNEL_SYSCALLS__ ! 260: ! 261: /* ! 262: * we need this inline - forking from kernel space will result ! 263: * in NO COPY ON WRITE (!!!), until an execve is executed. This ! 264: * is no problem, but for the stack. This is handled by not letting ! 265: * main() use the stack at all after fork(). Thus, no function ! 266: * calls - which means inline code for fork too, as otherwise we ! 267: * would use the stack upon exit from 'fork()'. ! 268: * ! 269: * Actually only pause and fork are needed inline, so that there ! 270: * won't be any messing with the stack from main(), but we define ! 271: * some others too. ! 272: */ ! 273: #define __NR__exit __NR_exit ! 274: static inline _syscall0(int,idle) ! 275: static inline _syscall0(int,fork) ! 276: static inline _syscall2(int,clone,unsigned long,flags,char *,esp) ! 277: static inline _syscall0(int,pause) ! 278: static inline _syscall0(int,setup) ! 279: static inline _syscall0(int,sync) ! 280: static inline _syscall0(pid_t,setsid) ! 281: static inline _syscall3(int,read,int,fd,char *,buf,off_t,count) ! 282: static inline _syscall3(off_t,lseek,int,fd,off_t,offset,int,count) ! 283: static inline _syscall3(int,write,int,fd,const char *,buf,off_t,count) ! 284: static inline _syscall1(int,dup,int,fd) ! 285: static inline _syscall3(int,execve,const char *,file,char **,argv,char **,envp) ! 286: static inline _syscall3(int,open,const char *,file,int,flag,int,mode) ! 287: static inline _syscall1(int,close,int,fd) ! 288: static inline _syscall1(int,_exit,int,exitcode) ! 289: static inline _syscall3(pid_t,waitpid,pid_t,pid,int *,wait_stat,int,options) ! 290: ! 291: static inline pid_t wait(int * wait_stat) ! 292: { ! 293: return waitpid(-1,wait_stat,0); ! 294: } ! 295: ! 296: /* ! 297: * This is the mechanism for creating a new kernel thread. ! 298: * ! 299: * NOTE! Only a kernel-only process(ie the swapper or direct descendants ! 300: * who haven't done an "execve()") should use this: it will work within ! 301: * a system call from a "real" process, but the process memory space will ! 302: * not be free'd until both the parent and the child have exited. ! 303: */ ! 304: static inline pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) ! 305: { ! 306: long retval; ! 307: ! 308: __asm__ __volatile__( ! 309: "movl %%esp,%%esi\n\t" ! 310: "int $0x80\n\t" /* Linux/i386 system call */ ! 311: "cmpl %%esp,%%esi\n\t" /* child or parent? */ ! 312: "je 1f\n\t" /* parent - jump */ ! 313: "pushl %3\n\t" /* push argument */ ! 314: "call *%4\n\t" /* call fn */ ! 315: "movl %2,%0\n\t" /* exit */ ! 316: "int $0x80\n" ! 317: "1:\t" ! 318: :"=a" (retval) ! 319: :"0" (__NR_clone), "i" (__NR_exit), ! 320: "r" (arg), "r" (fn), ! 321: "b" (flags | CLONE_VM) ! 322: :"si"); ! 323: return retval; ! 324: } ! 325: ! 326: #endif ! 327: ! 328: #endif /* _ASM_I386_UNISTD_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.