5a86f8e976ec35b26182abe9c06b366b37949b37
[safe/jmp/linux-2.6] / include / asm-v850 / unistd.h
1 /*
2  * include/asm-v850/unistd.h -- System call numbers and invocation mechanism
3  *
4  *  Copyright (C) 2001,02,03,04  NEC Electronics Corporation
5  *  Copyright (C) 2001,02,03,04  Miles Bader <miles@gnu.org>
6  *
7  * This file is subject to the terms and conditions of the GNU General
8  * Public License.  See the file COPYING in the main directory of this
9  * archive for more details.
10  *
11  * Written by Miles Bader <miles@gnu.org>
12  */
13
14 #ifndef __V850_UNISTD_H__
15 #define __V850_UNISTD_H__
16
17 #include <asm/clinkage.h>
18
19 #define __NR_restart_syscall      0
20 #define __NR_exit                 1
21 #define __NR_fork                 2
22 #define __NR_read                 3
23 #define __NR_write                4
24 #define __NR_open                 5
25 #define __NR_close                6
26 #define __NR_waitpid              7
27 #define __NR_creat                8
28 #define __NR_link                 9
29 #define __NR_unlink              10
30 #define __NR_execve              11
31 #define __NR_chdir               12
32 #define __NR_time                13
33 #define __NR_mknod               14
34 #define __NR_chmod               15
35 #define __NR_chown               16
36 #define __NR_break               17
37 #define __NR_lseek               19
38 #define __NR_getpid              20
39 #define __NR_mount               21
40 #define __NR_umount              22
41 #define __NR_setuid              23
42 #define __NR_getuid              24
43 #define __NR_stime               25
44 #define __NR_ptrace              26
45 #define __NR_alarm               27
46 #define __NR_pause               29
47 #define __NR_utime               30
48 #define __NR_stty                31
49 #define __NR_gtty                32
50 #define __NR_access              33
51 #define __NR_nice                34
52 #define __NR_ftime               35
53 #define __NR_sync                36
54 #define __NR_kill                37
55 #define __NR_rename              38
56 #define __NR_mkdir               39
57 #define __NR_rmdir               40
58 #define __NR_dup                 41
59 #define __NR_pipe                42
60 #define __NR_times               43
61 #define __NR_prof                44
62 #define __NR_brk                 45
63 #define __NR_setgid              46
64 #define __NR_getgid              47
65 #define __NR_signal              48
66 #define __NR_geteuid             49
67 #define __NR_getegid             50
68 #define __NR_acct                51
69 #define __NR_umount2             52
70 #define __NR_lock                53
71 #define __NR_ioctl               54
72 #define __NR_fcntl               55
73 #define __NR_setpgid             57
74 #define __NR_umask               60
75 #define __NR_chroot              61
76 #define __NR_ustat               62
77 #define __NR_dup2                63
78 #define __NR_getppid             64
79 #define __NR_getpgrp             65
80 #define __NR_setsid              66
81 #define __NR_sigaction           67
82 #define __NR_sgetmask            68
83 #define __NR_ssetmask            69
84 #define __NR_setreuid            70
85 #define __NR_setregid            71
86 #define __NR_sigsuspend          72
87 #define __NR_sigpending          73
88 #define __NR_sethostname         74
89 #define __NR_setrlimit           75
90 #define __NR_ugetrlimit          76
91 #define __NR_getrusage           77
92 #define __NR_gettimeofday        78
93 #define __NR_settimeofday        79
94 #define __NR_getgroups           80
95 #define __NR_setgroups           81
96 #define __NR_select              82
97 #define __NR_symlink             83
98 #define __NR_readlink            85
99 #define __NR_uselib              86
100 #define __NR_swapon              87
101 #define __NR_reboot              88
102 #define __NR_readdir             89
103 #define __NR_mmap                90
104 #define __NR_munmap              91
105 #define __NR_truncate            92
106 #define __NR_ftruncate           93
107 #define __NR_fchmod              94
108 #define __NR_fchown              95
109 #define __NR_getpriority         96
110 #define __NR_setpriority         97
111 #define __NR_profil              98
112 #define __NR_statfs              99
113 #define __NR_fstatfs            100
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_vhangup            111
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_cacheflush         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_flock              143
151 #define __NR_msync              144
152 #define __NR_readv              145
153 #define __NR_writev             146
154 #define __NR_getsid             147
155 #define __NR_fdatasync          148
156 #define __NR__sysctl            149
157 #define __NR_mlock              150
158 #define __NR_munlock            151
159 #define __NR_mlockall           152
160 #define __NR_munlockall         153
161 #define __NR_sched_setparam             154
162 #define __NR_sched_getparam             155
163 #define __NR_sched_setscheduler         156
164 #define __NR_sched_getscheduler         157
165 #define __NR_sched_yield                158
166 #define __NR_sched_get_priority_max     159
167 #define __NR_sched_get_priority_min     160
168 #define __NR_sched_rr_get_interval      161
169 #define __NR_nanosleep          162
170 #define __NR_mremap             163
171 #define __NR_setresuid          164
172 #define __NR_getresuid          165
173 #define __NR_query_module       167
174 #define __NR_poll               168
175 #define __NR_nfsservctl         169
176 #define __NR_setresgid          170
177 #define __NR_getresgid          171
178 #define __NR_prctl              172
179 #define __NR_rt_sigreturn       173
180 #define __NR_rt_sigaction       174
181 #define __NR_rt_sigprocmask     175
182 #define __NR_rt_sigpending      176
183 #define __NR_rt_sigtimedwait    177
184 #define __NR_rt_sigqueueinfo    178
185 #define __NR_rt_sigsuspend      179
186 #define __NR_pread              180
187 #define __NR_pwrite             181
188 #define __NR_lchown             182
189 #define __NR_getcwd             183
190 #define __NR_capget             184
191 #define __NR_capset             185
192 #define __NR_sigaltstack        186
193 #define __NR_sendfile           187
194 #define __NR_getpmsg            188     /* some people actually want streams */
195 #define __NR_putpmsg            189     /* some people actually want streams */
196 #define __NR_vfork              190
197 #define __NR_mmap2              192
198 #define __NR_truncate64         193
199 #define __NR_ftruncate64        194
200 #define __NR_stat64             195
201 #define __NR_lstat64            196
202 #define __NR_fstat64            197
203 #define __NR_fcntl64            198
204 #define __NR_getdents64         199
205 #define __NR_pivot_root         200
206 #define __NR_gettid             201
207 #define __NR_tkill              202
208
209
210 /* Syscall protocol:
211    Syscall number in r12, args in r6-r9, r13-r14
212    Return value in r10
213    Trap 0 for `short' syscalls, where all the args can fit in function
214    call argument registers, and trap 1 when there are additional args in
215    r13-r14.  */
216
217 #define SYSCALL_NUM     "r12"
218 #define SYSCALL_ARG0    "r6"
219 #define SYSCALL_ARG1    "r7"
220 #define SYSCALL_ARG2    "r8"
221 #define SYSCALL_ARG3    "r9"
222 #define SYSCALL_ARG4    "r13"
223 #define SYSCALL_ARG5    "r14"
224 #define SYSCALL_RET     "r10"
225
226 #define SYSCALL_SHORT_TRAP      "0"
227 #define SYSCALL_LONG_TRAP       "1"
228
229 /* Registers clobbered by any syscall.  This _doesn't_ include the syscall
230    number (r12) or the `extended arg' registers (r13, r14), even though
231    they are actually clobbered too (this is because gcc's `asm' statement
232    doesn't allow a clobber to be used as an input or output).  */
233 #define SYSCALL_CLOBBERS        "r1", "r5", "r11", "r15", "r16", \
234                                 "r17", "r18", "r19"
235
236 /* Registers clobbered by a `short' syscall.  This includes all clobbers
237    except the syscall number (r12).  */
238 #define SYSCALL_SHORT_CLOBBERS  SYSCALL_CLOBBERS, "r13", "r14"
239
240
241 /* User programs sometimes end up including this header file
242    (indirectly, via uClibc header files), so I'm a bit nervous just
243    including <linux/compiler.h>.  */
244 #if !defined(__builtin_expect) && __GNUC__ == 2 && __GNUC_MINOR__ < 96
245 #define __builtin_expect(x, expected_value) (x)
246 #endif
247
248 #define __syscall_return(type, res)                                           \
249   do {                                                                        \
250           /* user-visible error numbers are in the range -1 - -124:           \
251              see <asm-v850/errno.h> */                                        \
252           if (__builtin_expect ((unsigned long)(res) >= (unsigned long)(-125), 0)) { \
253                   errno = -(res);                                             \
254                   res = -1;                                                   \
255           }                                                                   \
256           return (type) (res);                                                \
257   } while (0)
258
259
260 #define _syscall0(type, name)                                                 \
261 type name (void)                                                              \
262 {                                                                             \
263   register unsigned long __syscall __asm__ (SYSCALL_NUM) = __NR_##name;       \
264   register unsigned long __ret __asm__ (SYSCALL_RET);                         \
265   __asm__ __volatile__ ("trap " SYSCALL_SHORT_TRAP                            \
266                         : "=r" (__ret), "=r" (__syscall)                      \
267                         : "1" (__syscall)                                     \
268                         : SYSCALL_SHORT_CLOBBERS);                            \
269   __syscall_return (type, __ret);                                             \
270 }
271
272 #define _syscall1(type, name, atype, a)                                       \
273 type name (atype a)                                                           \
274 {                                                                             \
275   register atype __a __asm__ (SYSCALL_ARG0) = a;                              \
276   register unsigned long __syscall __asm__ (SYSCALL_NUM) = __NR_##name;       \
277   register unsigned long __ret __asm__ (SYSCALL_RET);                         \
278   __asm__ __volatile__ ("trap " SYSCALL_SHORT_TRAP                            \
279                         : "=r" (__ret), "=r" (__syscall)                      \
280                         : "1" (__syscall), "r" (__a)                          \
281                         : SYSCALL_SHORT_CLOBBERS);                            \
282   __syscall_return (type, __ret);                                             \
283 }
284
285 #define _syscall2(type, name, atype, a, btype, b)                             \
286 type name (atype a, btype b)                                                  \
287 {                                                                             \
288   register atype __a __asm__ (SYSCALL_ARG0) = a;                              \
289   register btype __b __asm__ (SYSCALL_ARG1) = b;                              \
290   register unsigned long __syscall __asm__ (SYSCALL_NUM) = __NR_##name;       \
291   register unsigned long __ret __asm__ (SYSCALL_RET);                         \
292   __asm__ __volatile__ ("trap " SYSCALL_SHORT_TRAP                            \
293                         : "=r" (__ret), "=r" (__syscall)                      \
294                         : "1" (__syscall), "r" (__a), "r" (__b)               \
295                         : SYSCALL_SHORT_CLOBBERS);                            \
296   __syscall_return (type, __ret);                                             \
297 }
298
299 #define _syscall3(type, name, atype, a, btype, b, ctype, c)                   \
300 type name (atype a, btype b, ctype c)                                         \
301 {                                                                             \
302   register atype __a __asm__ (SYSCALL_ARG0) = a;                              \
303   register btype __b __asm__ (SYSCALL_ARG1) = b;                              \
304   register ctype __c __asm__ (SYSCALL_ARG2) = c;                              \
305   register unsigned long __syscall __asm__ (SYSCALL_NUM) = __NR_##name;       \
306   register unsigned long __ret __asm__ (SYSCALL_RET);                         \
307   __asm__ __volatile__ ("trap " SYSCALL_SHORT_TRAP                            \
308                         : "=r" (__ret), "=r" (__syscall)                      \
309                         : "1" (__syscall), "r" (__a), "r" (__b), "r" (__c)    \
310                         : SYSCALL_SHORT_CLOBBERS);                            \
311   __syscall_return (type, __ret);                                             \
312 }
313
314 #define _syscall4(type, name, atype, a, btype, b, ctype, c, dtype, d)         \
315 type name (atype a, btype b, ctype c, dtype d)                                \
316 {                                                                             \
317   register atype __a __asm__ (SYSCALL_ARG0) = a;                              \
318   register btype __b __asm__ (SYSCALL_ARG1) = b;                              \
319   register ctype __c __asm__ (SYSCALL_ARG2) = c;                              \
320   register dtype __d __asm__ (SYSCALL_ARG3) = d;                              \
321   register unsigned long __syscall __asm__ (SYSCALL_NUM) = __NR_##name;       \
322   register unsigned long __ret __asm__ (SYSCALL_RET);                         \
323   __asm__ __volatile__ ("trap " SYSCALL_SHORT_TRAP                            \
324                         : "=r" (__ret), "=r" (__syscall)                      \
325                         : "1" (__syscall),                                    \
326                         "r" (__a), "r" (__b), "r" (__c), "r" (__d)            \
327                         : SYSCALL_SHORT_CLOBBERS);                            \
328   __syscall_return (type, __ret);                                             \
329 }
330
331 #define _syscall5(type, name, atype, a, btype, b, ctype, c, dtype, d, etype,e)\
332 type name (atype a, btype b, ctype c, dtype d, etype e)                       \
333 {                                                                             \
334   register atype __a __asm__ (SYSCALL_ARG0) = a;                              \
335   register btype __b __asm__ (SYSCALL_ARG1) = b;                              \
336   register ctype __c __asm__ (SYSCALL_ARG2) = c;                              \
337   register dtype __d __asm__ (SYSCALL_ARG3) = d;                              \
338   register etype __e __asm__ (SYSCALL_ARG4) = e;                              \
339   register unsigned long __syscall __asm__ (SYSCALL_NUM) = __NR_##name;       \
340   register unsigned long __ret __asm__ (SYSCALL_RET);                         \
341   __asm__ __volatile__ ("trap " SYSCALL_LONG_TRAP                             \
342                         : "=r" (__ret), "=r" (__syscall), "=r" (__e)          \
343                         : "1" (__syscall),                                    \
344                         "r" (__a), "r" (__b), "r" (__c), "r" (__d), "2" (__e) \
345                         : SYSCALL_CLOBBERS);                                  \
346   __syscall_return (type, __ret);                                             \
347 }
348
349 #if __GNUC__ < 3
350 /* In older versions of gcc, `asm' statements with more than 10
351    input/output arguments produce a fatal error.  To work around this
352    problem, we use two versions, one for gcc-3.x and one for earlier
353    versions of gcc (the `earlier gcc' version doesn't work with gcc-3.x
354    because gcc-3.x doesn't allow clobbers to also be input arguments).  */
355 #define __SYSCALL6_TRAP(syscall, ret, a, b, c, d, e, f)                       \
356   __asm__ __volatile__ ("trap " SYSCALL_LONG_TRAP                             \
357                         : "=r" (ret), "=r" (syscall)                          \
358                         : "1" (syscall),                                      \
359                         "r" (a), "r" (b), "r" (c), "r" (d),                   \
360                         "r" (e), "r" (f)                                      \
361                         : SYSCALL_CLOBBERS, SYSCALL_ARG4, SYSCALL_ARG5);
362 #else /* __GNUC__ >= 3 */
363 #define __SYSCALL6_TRAP(syscall, ret, a, b, c, d, e, f)                       \
364   __asm__ __volatile__ ("trap " SYSCALL_LONG_TRAP                             \
365                         : "=r" (ret), "=r" (syscall),                         \
366                         "=r" (e), "=r" (f)                                    \
367                         : "1" (syscall),                                      \
368                         "r" (a), "r" (b), "r" (c), "r" (d),                   \
369                         "2" (e), "3" (f)                                      \
370                         : SYSCALL_CLOBBERS);
371 #endif
372
373 #define _syscall6(type, name, atype, a, btype, b, ctype, c, dtype, d, etype, e, ftype, f) \
374 type name (atype a, btype b, ctype c, dtype d, etype e, ftype f)              \
375 {                                                                             \
376   register atype __a __asm__ (SYSCALL_ARG0) = a;                              \
377   register btype __b __asm__ (SYSCALL_ARG1) = b;                              \
378   register ctype __c __asm__ (SYSCALL_ARG2) = c;                              \
379   register dtype __d __asm__ (SYSCALL_ARG3) = d;                              \
380   register etype __e __asm__ (SYSCALL_ARG4) = e;                              \
381   register etype __f __asm__ (SYSCALL_ARG5) = f;                              \
382   register unsigned long __syscall __asm__ (SYSCALL_NUM) = __NR_##name;       \
383   register unsigned long __ret __asm__ (SYSCALL_RET);                         \
384   __SYSCALL6_TRAP(__syscall, __ret, __a, __b, __c, __d, __e, __f);            \
385   __syscall_return (type, __ret);                                             \
386 }
387                 
388
389 #ifdef __KERNEL__
390 #define __ARCH_WANT_IPC_PARSE_VERSION
391 #define __ARCH_WANT_OLD_READDIR
392 #define __ARCH_WANT_STAT64
393 #define __ARCH_WANT_SYS_ALARM
394 #define __ARCH_WANT_SYS_GETHOSTNAME
395 #define __ARCH_WANT_SYS_PAUSE
396 #define __ARCH_WANT_SYS_SGETMASK
397 #define __ARCH_WANT_SYS_SIGNAL
398 #define __ARCH_WANT_SYS_TIME
399 #define __ARCH_WANT_SYS_UTIME
400 #define __ARCH_WANT_SYS_WAITPID
401 #define __ARCH_WANT_SYS_SOCKETCALL
402 #define __ARCH_WANT_SYS_FADVISE64
403 #define __ARCH_WANT_SYS_GETPGRP
404 #define __ARCH_WANT_SYS_LLSEEK
405 #define __ARCH_WANT_SYS_NICE
406 #define __ARCH_WANT_SYS_OLDUMOUNT
407 #define __ARCH_WANT_SYS_SIGPENDING
408 #define __ARCH_WANT_SYS_SIGPROCMASK
409 #define __ARCH_WANT_SYS_RT_SIGACTION
410 #endif
411
412 #ifdef __KERNEL_SYSCALLS__
413
414 #include <linux/compiler.h>
415 #include <linux/types.h>
416
417 /*
418  * we need this inline - forking from kernel space will result
419  * in NO COPY ON WRITE (!!!), until an execve is executed. This
420  * is no problem, but for the stack. This is handled by not letting
421  * main() use the stack at all after fork(). Thus, no function
422  * calls - which means inline code for fork too, as otherwise we
423  * would use the stack upon exit from 'fork()'.
424  *
425  * Actually only pause and fork are needed inline, so that there
426  * won't be any messing with the stack from main(), but we define
427  * some others too.
428  */
429 #define __NR__exit __NR_exit
430 extern inline _syscall0(pid_t,setsid)
431 extern inline _syscall3(int,write,int,fd,const char *,buf,off_t,count)
432 extern inline _syscall3(int,read,int,fd,char *,buf,off_t,count)
433 extern inline _syscall3(off_t,lseek,int,fd,off_t,offset,int,count)
434 extern inline _syscall1(int,dup,int,fd)
435 extern inline _syscall3(int,execve,const char *,file,char **,argv,char **,envp)
436 extern inline _syscall3(int,open,const char *,file,int,flag,int,mode)
437 extern inline _syscall1(int,close,int,fd)
438 extern inline _syscall1(int,_exit,int,exitcode)
439 extern inline _syscall3(pid_t,waitpid,pid_t,pid,int *,wait_stat,int,options)
440
441 extern inline pid_t wait(int * wait_stat)
442 {
443         return waitpid (-1, wait_stat, 0);
444 }
445
446 unsigned long sys_mmap(unsigned long addr, size_t len,
447                         unsigned long prot, unsigned long flags,
448                         unsigned long fd, off_t offset);
449 unsigned long sys_mmap2(unsigned long addr, size_t len,
450                         unsigned long prot, unsigned long flags,
451                         unsigned long fd, unsigned long pgoff);
452 struct pt_regs;
453 int sys_execve (char *name, char **argv, char **envp, struct pt_regs *regs);
454 int sys_pipe (int *fildes);
455 struct sigaction;
456 asmlinkage long sys_rt_sigaction(int sig,
457                                 const struct sigaction __user *act,
458                                 struct sigaction __user *oact,
459                                 size_t sigsetsize);
460
461 #endif
462
463 /*
464  * "Conditional" syscalls
465  */
466 #define cond_syscall(name)                                                    \
467   asm (".weak\t" C_SYMBOL_STRING(name) ";"                                    \
468        ".set\t" C_SYMBOL_STRING(name) "," C_SYMBOL_STRING(sys_ni_syscall))
469 #if 0
470 /* This doesn't work if there's a function prototype for NAME visible,
471    because the argument types probably won't match.  */
472 #define cond_syscall(name)  \
473   void name (void) __attribute__ ((weak, alias ("sys_ni_syscall")));
474 #endif
475
476 #endif /* __V850_UNISTD_H__ */