|
|
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: ! 172: /* XXX - _foo needs to be __foo, while __NR_bar could be _NR_bar. */ ! 173: #define _syscall0(type,name) \ ! 174: type name(void) \ ! 175: { \ ! 176: long __res; \ ! 177: __asm__ volatile ("int $0x80" \ ! 178: : "=a" (__res) \ ! 179: : "0" (__NR_##name)); \ ! 180: if (__res >= 0) \ ! 181: return (type) __res; \ ! 182: errno = -__res; \ ! 183: return -1; \ ! 184: } ! 185: ! 186: #define _syscall1(type,name,type1,arg1) \ ! 187: type name(type1 arg1) \ ! 188: { \ ! 189: long __res; \ ! 190: __asm__ volatile ("int $0x80" \ ! 191: : "=a" (__res) \ ! 192: : "0" (__NR_##name),"b" ((long)(arg1))); \ ! 193: if (__res >= 0) \ ! 194: return (type) __res; \ ! 195: errno = -__res; \ ! 196: return -1; \ ! 197: } ! 198: ! 199: #define _syscall2(type,name,type1,arg1,type2,arg2) \ ! 200: type name(type1 arg1,type2 arg2) \ ! 201: { \ ! 202: long __res; \ ! 203: __asm__ volatile ("int $0x80" \ ! 204: : "=a" (__res) \ ! 205: : "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2))); \ ! 206: if (__res >= 0) \ ! 207: return (type) __res; \ ! 208: errno = -__res; \ ! 209: return -1; \ ! 210: } ! 211: ! 212: #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \ ! 213: type name(type1 arg1,type2 arg2,type3 arg3) \ ! 214: { \ ! 215: long __res; \ ! 216: __asm__ volatile ("int $0x80" \ ! 217: : "=a" (__res) \ ! 218: : "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \ ! 219: "d" ((long)(arg3))); \ ! 220: if (__res>=0) \ ! 221: return (type) __res; \ ! 222: errno=-__res; \ ! 223: return -1; \ ! 224: } ! 225: ! 226: #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ ! 227: type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4) \ ! 228: { \ ! 229: long __res; \ ! 230: __asm__ volatile ("int $0x80" \ ! 231: : "=a" (__res) \ ! 232: : "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \ ! 233: "d" ((long)(arg3)),"S" ((long)(arg4))); \ ! 234: if (__res>=0) \ ! 235: return (type) __res; \ ! 236: errno=-__res; \ ! 237: return -1; \ ! 238: } ! 239: ! 240: #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ ! 241: type5,arg5) \ ! 242: type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \ ! 243: { \ ! 244: long __res; \ ! 245: __asm__ volatile ("int $0x80" \ ! 246: : "=a" (__res) \ ! 247: : "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \ ! 248: "d" ((long)(arg3)),"S" ((long)(arg4)),"D" ((long)(arg5))); \ ! 249: if (__res>=0) \ ! 250: return (type) __res; \ ! 251: errno=-__res; \ ! 252: return -1; \ ! 253: } ! 254: ! 255: #ifdef __KERNEL_SYSCALLS__ ! 256: ! 257: /* ! 258: * we need this inline - forking from kernel space will result ! 259: * in NO COPY ON WRITE (!!!), until an execve is executed. This ! 260: * is no problem, but for the stack. This is handled by not letting ! 261: * main() use the stack at all after fork(). Thus, no function ! 262: * calls - which means inline code for fork too, as otherwise we ! 263: * would use the stack upon exit from 'fork()'. ! 264: * ! 265: * Actually only pause and fork are needed inline, so that there ! 266: * won't be any messing with the stack from main(), but we define ! 267: * some others too. ! 268: */ ! 269: #define __NR__exit __NR_exit ! 270: static inline _syscall0(int,idle) ! 271: static inline _syscall0(int,fork) ! 272: static inline _syscall2(int,clone,unsigned long,flags,char *,esp) ! 273: static inline _syscall0(int,pause) ! 274: static inline _syscall0(int,setup) ! 275: static inline _syscall0(int,sync) ! 276: static inline _syscall0(pid_t,setsid) ! 277: static inline _syscall3(int,write,int,fd,const char *,buf,off_t,count) ! 278: static inline _syscall1(int,dup,int,fd) ! 279: static inline _syscall3(int,execve,const char *,file,char **,argv,char **,envp) ! 280: static inline _syscall3(int,open,const char *,file,int,flag,int,mode) ! 281: static inline _syscall1(int,close,int,fd) ! 282: static inline _syscall1(int,_exit,int,exitcode) ! 283: static inline _syscall3(pid_t,waitpid,pid_t,pid,int *,wait_stat,int,options) ! 284: ! 285: static inline pid_t wait(int * wait_stat) ! 286: { ! 287: return waitpid(-1,wait_stat,0); ! 288: } ! 289: ! 290: /* ! 291: * This is the mechanism for creating a new kernel thread. ! 292: * ! 293: * NOTE! Only a kernel-only process(ie the swapper or direct descendants ! 294: * who haven't done an "execve()") should use this: it will work within ! 295: * a system call from a "real" process, but the process memory space will ! 296: * not be free'd until both the parent and the child have exited. ! 297: */ ! 298: static inline pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) ! 299: { ! 300: long retval; ! 301: ! 302: __asm__ __volatile__( ! 303: "movl %%esp,%%esi\n\t" ! 304: "int $0x80\n\t" /* Linux/i386 system call */ ! 305: "cmpl %%esp,%%esi\n\t" /* child or parent? */ ! 306: "je 1f\n\t" /* parent - jump */ ! 307: "pushl %3\n\t" /* push argument */ ! 308: "call *%4\n\t" /* call fn */ ! 309: "movl %2,%0\n\t" /* exit */ ! 310: "int $0x80\n" ! 311: "1:\t" ! 312: :"=a" (retval) ! 313: :"0" (__NR_clone), "i" (__NR_exit), ! 314: "r" (arg), "r" (fn), ! 315: "b" (flags | CLONE_VM) ! 316: :"si"); ! 317: return retval; ! 318: } ! 319: ! 320: #endif ! 321: ! 322: #endif /* _ASM_I386_UNISTD_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.