1#ifndef _ASM_PPC_UNISTD_H_
2#define _ASM_PPC_UNISTD_H_
3
4/*
5 * This file contains the system call numbers.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version
10 * 2 of the License, or (at your option) any later version.
11 */
12
13#define __NR_exit		  1
14#define __NR_fork		  2
15#define __NR_read		  3
16#define __NR_write		  4
17#define __NR_open		  5
18#define __NR_close		  6
19#define __NR_waitpid		  7
20#define __NR_creat		  8
21#define __NR_link		  9
22#define __NR_unlink		 10
23#define __NR_execve		 11
24#define __NR_chdir		 12
25#define __NR_time		 13
26#define __NR_mknod		 14
27#define __NR_chmod		 15
28#define __NR_lchown		 16
29#define __NR_break		 17
30#define __NR_oldstat		 18
31#define __NR_lseek		 19
32#define __NR_getpid		 20
33#define __NR_mount		 21
34#define __NR_umount		 22
35#define __NR_setuid		 23
36#define __NR_getuid		 24
37#define __NR_stime		 25
38#define __NR_ptrace		 26
39#define __NR_alarm		 27
40#define __NR_oldfstat		 28
41#define __NR_pause		 29
42#define __NR_utime		 30
43#define __NR_stty		 31
44#define __NR_gtty		 32
45#define __NR_access		 33
46#define __NR_nice		 34
47#define __NR_ftime		 35
48#define __NR_sync		 36
49#define __NR_kill		 37
50#define __NR_rename		 38
51#define __NR_mkdir		 39
52#define __NR_rmdir		 40
53#define __NR_dup		 41
54#define __NR_pipe		 42
55#define __NR_times		 43
56#define __NR_prof		 44
57#define __NR_brk		 45
58#define __NR_setgid		 46
59#define __NR_getgid		 47
60#define __NR_signal		 48
61#define __NR_geteuid		 49
62#define __NR_getegid		 50
63#define __NR_acct		 51
64#define __NR_umount2		 52
65#define __NR_lock		 53
66#define __NR_ioctl		 54
67#define __NR_fcntl		 55
68#define __NR_mpx		 56
69#define __NR_setpgid		 57
70#define __NR_ulimit		 58
71#define __NR_oldolduname	 59
72#define __NR_umask		 60
73#define __NR_chroot		 61
74#define __NR_ustat		 62
75#define __NR_dup2		 63
76#define __NR_getppid		 64
77#define __NR_getpgrp		 65
78#define __NR_setsid		 66
79#define __NR_sigaction		 67
80#define __NR_sgetmask		 68
81#define __NR_ssetmask		 69
82#define __NR_setreuid		 70
83#define __NR_setregid		 71
84#define __NR_sigsuspend		 72
85#define __NR_sigpending		 73
86#define __NR_sethostname	 74
87#define __NR_setrlimit		 75
88#define __NR_getrlimit		 76
89#define __NR_getrusage		 77
90#define __NR_gettimeofday	 78
91#define __NR_settimeofday	 79
92#define __NR_getgroups		 80
93#define __NR_setgroups		 81
94#define __NR_select		 82
95#define __NR_symlink		 83
96#define __NR_oldlstat		 84
97#define __NR_readlink		 85
98#define __NR_uselib		 86
99#define __NR_swapon		 87
100#define __NR_reboot		 88
101#define __NR_readdir		 89
102#define __NR_mmap		 90
103#define __NR_munmap		 91
104#define __NR_truncate		 92
105#define __NR_ftruncate		 93
106#define __NR_fchmod		 94
107#define __NR_fchown		 95
108#define __NR_getpriority	 96
109#define __NR_setpriority	 97
110#define __NR_profil		 98
111#define __NR_statfs		 99
112#define __NR_fstatfs		100
113#define __NR_ioperm		101
114#define __NR_socketcall		102
115#define __NR_syslog		103
116#define __NR_setitimer		104
117#define __NR_getitimer		105
118#define __NR_stat		106
119#define __NR_lstat		107
120#define __NR_fstat		108
121#define __NR_olduname		109
122#define __NR_iopl		110
123#define __NR_vhangup		111
124#define __NR_idle		112
125#define __NR_vm86		113
126#define __NR_wait4		114
127#define __NR_swapoff		115
128#define __NR_sysinfo		116
129#define __NR_ipc		117
130#define __NR_fsync		118
131#define __NR_sigreturn		119
132#define __NR_clone		120
133#define __NR_setdomainname	121
134#define __NR_uname		122
135#define __NR_modify_ldt		123
136#define __NR_adjtimex		124
137#define __NR_mprotect		125
138#define __NR_sigprocmask	126
139#define __NR_create_module	127
140#define __NR_init_module	128
141#define __NR_delete_module	129
142#define __NR_get_kernel_syms	130
143#define __NR_quotactl		131
144#define __NR_getpgid		132
145#define __NR_fchdir		133
146#define __NR_bdflush		134
147#define __NR_sysfs		135
148#define __NR_personality	136
149#define __NR_afs_syscall	137 /* Syscall for Andrew File System */
150#define __NR_setfsuid		138
151#define __NR_setfsgid		139
152#define __NR__llseek		140
153#define __NR_getdents		141
154#define __NR__newselect		142
155#define __NR_flock		143
156#define __NR_msync		144
157#define __NR_readv		145
158#define __NR_writev		146
159#define __NR_getsid		147
160#define __NR_fdatasync		148
161#define __NR__sysctl		149
162#define __NR_mlock		150
163#define __NR_munlock		151
164#define __NR_mlockall		152
165#define __NR_munlockall		153
166#define __NR_sched_setparam		154
167#define __NR_sched_getparam		155
168#define __NR_sched_setscheduler		156
169#define __NR_sched_getscheduler		157
170#define __NR_sched_yield		158
171#define __NR_sched_get_priority_max	159
172#define __NR_sched_get_priority_min	160
173#define __NR_sched_rr_get_interval	161
174#define __NR_nanosleep		162
175#define __NR_mremap		163
176#define __NR_setresuid		164
177#define __NR_getresuid		165
178#define __NR_query_module	166
179#define __NR_poll		167
180#define __NR_nfsservctl		168
181#define __NR_setresgid		169
182#define __NR_getresgid		170
183#define __NR_prctl		171
184#define __NR_rt_sigreturn	172
185#define __NR_rt_sigaction	173
186#define __NR_rt_sigprocmask	174
187#define __NR_rt_sigpending	175
188#define __NR_rt_sigtimedwait	176
189#define __NR_rt_sigqueueinfo	177
190#define __NR_rt_sigsuspend	178
191#define __NR_pread		179
192#define __NR_pwrite		180
193#define __NR_chown		181
194#define __NR_getcwd		182
195#define __NR_capget		183
196#define __NR_capset		184
197#define __NR_sigaltstack	185
198#define __NR_sendfile		186
199#define __NR_getpmsg		187	/* some people actually want streams */
200#define __NR_putpmsg		188	/* some people actually want streams */
201#define __NR_vfork		189
202#define __NR_ugetrlimit		190	/* SuS compliant getrlimit */
203#define __NR_mmap2		192
204#define __NR_truncate64		193
205#define __NR_ftruncate64	194
206#define __NR_stat64		195
207#define __NR_lstat64		196
208#define __NR_fstat64		197
209#define __NR_pciconfig_read	198
210#define __NR_pciconfig_write	199
211#define __NR_pciconfig_iobase	200
212#define __NR_multiplexer	201
213#define __NR_getdents64		202
214#define __NR_pivot_root		203
215#define __NR_fcntl64		204
216#define __NR_madvise		205
217#define __NR_mincore		206
218#define __NR_gettid		207
219
220#define __NR(n)	#n
221
222
223#define __syscall_return(type) \
224	return (__sc_err & 0x10000000 ? errno = __sc_ret, __sc_ret = -1 : 0), \
225	       (type) __sc_ret
226
227#define __syscall_clobbers \
228	"r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
229
230#define _syscall0(type,name)						\
231type name(void)								\
232{									\
233	unsigned long __sc_ret, __sc_err;				\
234	{								\
235		register unsigned long __sc_0 __asm__ ("r0");		\
236		register unsigned long __sc_3 __asm__ ("r3");		\
237									\
238		__sc_0 = __NR_##name;					\
239		__asm__ __volatile__					\
240			("sc           \n\t"				\
241			 "mfcr %1      "				\
242			: "=&r" (__sc_3), "=&r" (__sc_0)		\
243			: "0"   (__sc_3), "1"   (__sc_0)		\
244			: __syscall_clobbers);				\
245		__sc_ret = __sc_3;					\
246		__sc_err = __sc_0;					\
247	}								\
248	__syscall_return (type);					\
249}
250
251#define _syscall1(type,name,type1,arg1)					\
252type name(type1 arg1)							\
253{									\
254	unsigned long __sc_ret, __sc_err;				\
255	{								\
256		register unsigned long __sc_0 __asm__ ("r0");		\
257		register unsigned long __sc_3 __asm__ ("r3");		\
258									\
259		__sc_3 = (unsigned long) (arg1);			\
260		__sc_0 = __NR_##name;					\
261		__asm__ __volatile__					\
262			("sc           \n\t"				\
263			 "mfcr %1      "				\
264			: "=&r" (__sc_3), "=&r" (__sc_0)		\
265			: "0"   (__sc_3), "1"   (__sc_0)		\
266			: __syscall_clobbers);				\
267		__sc_ret = __sc_3;					\
268		__sc_err = __sc_0;					\
269	}								\
270	__syscall_return (type);					\
271}
272
273#define _syscall2(type,name,type1,arg1,type2,arg2)			\
274type name(type1 arg1, type2 arg2)					\
275{									\
276	unsigned long __sc_ret, __sc_err;				\
277	{								\
278		register unsigned long __sc_0 __asm__ ("r0");		\
279		register unsigned long __sc_3 __asm__ ("r3");		\
280		register unsigned long __sc_4 __asm__ ("r4");		\
281									\
282		__sc_3 = (unsigned long) (arg1);			\
283		__sc_4 = (unsigned long) (arg2);			\
284		__sc_0 = __NR_##name;					\
285		__asm__ __volatile__					\
286			("sc           \n\t"				\
287			 "mfcr %1      "				\
288			: "=&r" (__sc_3), "=&r" (__sc_0)		\
289			: "0"   (__sc_3), "1"   (__sc_0),		\
290			  "r"   (__sc_4)				\
291			: __syscall_clobbers);				\
292		__sc_ret = __sc_3;					\
293		__sc_err = __sc_0;					\
294	}								\
295	__syscall_return (type);					\
296}
297
298#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3)		\
299type name(type1 arg1, type2 arg2, type3 arg3)				\
300{									\
301	unsigned long __sc_ret, __sc_err;				\
302	{								\
303		register unsigned long __sc_0 __asm__ ("r0");		\
304		register unsigned long __sc_3 __asm__ ("r3");		\
305		register unsigned long __sc_4 __asm__ ("r4");		\
306		register unsigned long __sc_5 __asm__ ("r5");		\
307									\
308		__sc_3 = (unsigned long) (arg1);			\
309		__sc_4 = (unsigned long) (arg2);			\
310		__sc_5 = (unsigned long) (arg3);			\
311		__sc_0 = __NR_##name;					\
312		__asm__ __volatile__					\
313			("sc           \n\t"				\
314			 "mfcr %1      "				\
315			: "=&r" (__sc_3), "=&r" (__sc_0)		\
316			: "0"   (__sc_3), "1"   (__sc_0),		\
317			  "r"   (__sc_4),				\
318			  "r"   (__sc_5)				\
319			: __syscall_clobbers);				\
320		__sc_ret = __sc_3;					\
321		__sc_err = __sc_0;					\
322	}								\
323	__syscall_return (type);					\
324}
325
326#define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
327type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4)		\
328{									\
329	unsigned long __sc_ret, __sc_err;				\
330	{								\
331		register unsigned long __sc_0 __asm__ ("r0");		\
332		register unsigned long __sc_3 __asm__ ("r3");		\
333		register unsigned long __sc_4 __asm__ ("r4");		\
334		register unsigned long __sc_5 __asm__ ("r5");		\
335		register unsigned long __sc_6 __asm__ ("r6");		\
336									\
337		__sc_3 = (unsigned long) (arg1);			\
338		__sc_4 = (unsigned long) (arg2);			\
339		__sc_5 = (unsigned long) (arg3);			\
340		__sc_6 = (unsigned long) (arg4);			\
341		__sc_0 = __NR_##name;					\
342		__asm__ __volatile__					\
343			("sc           \n\t"				\
344			 "mfcr %1      "				\
345			: "=&r" (__sc_3), "=&r" (__sc_0)		\
346			: "0"   (__sc_3), "1"   (__sc_0),		\
347			  "r"   (__sc_4),				\
348			  "r"   (__sc_5),				\
349			  "r"   (__sc_6)				\
350			: __syscall_clobbers);				\
351		__sc_ret = __sc_3;					\
352		__sc_err = __sc_0;					\
353	}								\
354	__syscall_return (type);					\
355}
356
357#define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) \
358type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5)	\
359{									\
360	unsigned long __sc_ret, __sc_err;				\
361	{								\
362		register unsigned long __sc_0 __asm__ ("r0");		\
363		register unsigned long __sc_3 __asm__ ("r3");		\
364		register unsigned long __sc_4 __asm__ ("r4");		\
365		register unsigned long __sc_5 __asm__ ("r5");		\
366		register unsigned long __sc_6 __asm__ ("r6");		\
367		register unsigned long __sc_7 __asm__ ("r7");		\
368									\
369		__sc_3 = (unsigned long) (arg1);			\
370		__sc_4 = (unsigned long) (arg2);			\
371		__sc_5 = (unsigned long) (arg3);			\
372		__sc_6 = (unsigned long) (arg4);			\
373		__sc_7 = (unsigned long) (arg5);			\
374		__sc_0 = __NR_##name;					\
375		__asm__ __volatile__					\
376			("sc           \n\t"				\
377			 "mfcr %1      "				\
378			: "=&r" (__sc_3), "=&r" (__sc_0)		\
379			: "0"   (__sc_3), "1"   (__sc_0),		\
380			  "r"   (__sc_4),				\
381			  "r"   (__sc_5),				\
382			  "r"   (__sc_6),				\
383			  "r"   (__sc_7)				\
384			: __syscall_clobbers);				\
385		__sc_ret = __sc_3;					\
386		__sc_err = __sc_0;					\
387	}								\
388	__syscall_return (type);					\
389}
390
391
392#ifdef __KERNEL_SYSCALLS__
393
394/*
395 * Forking from kernel space will result in the child getting a new,
396 * empty kernel stack area.  Thus the child cannot access automatic
397 * variables set in the parent unless they are in registers, and the
398 * procedure where the fork was done cannot return to its caller in
399 * the child.
400 */
401
402/*
403 * System call prototypes.
404 */
405#define __NR__exit __NR_exit
406static inline _syscall0(int,pause)
407static inline _syscall0(int,sync)
408static inline _syscall0(pid_t,setsid)
409static inline _syscall3(int,write,int,fd,const char *,buf,off_t,count)
410static inline _syscall3(int,read,int,fd,char *,buf,off_t,count)
411static inline _syscall3(off_t,lseek,int,fd,off_t,offset,int,count)
412static inline _syscall1(int,dup,int,fd)
413static inline _syscall3(int,execve,const char *,file,char **,argv,char **,envp)
414static inline _syscall3(int,open,const char *,file,int,flag,int,mode)
415static inline _syscall1(int,close,int,fd)
416static inline _syscall1(int,_exit,int,exitcode)
417static inline _syscall3(pid_t,waitpid,pid_t,pid,int *,wait_stat,int,options)
418static inline _syscall1(int,delete_module,const char *,name)
419
420static inline pid_t wait(int * wait_stat)
421{
422	return waitpid(-1,wait_stat,0);
423}
424
425#endif /* __KERNEL_SYSCALLS__ */
426
427#endif /* _ASM_PPC_UNISTD_H_ */
428