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