|
|
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.