1
2#ifndef _ASM_PARISC_UNISTD_H_
3#define _ASM_PARISC_UNISTD_H_
4
5#include <uapi/asm/unistd.h>
6
7#ifndef __ASSEMBLY__
8
9#define SYS_ify(syscall_name) __NR_##syscall_name
10
11#ifndef ASM_LINE_SEP
12# define ASM_LINE_SEP ;
13#endif
14
15
16
17
18
19#ifdef PIC
20
21# define K_STW_ASM_PIC " copy %%r19, %%r4\n"
22# define K_LDW_ASM_PIC " copy %%r4, %%r19\n"
23# define K_USING_GR4 "%r4",
24#else
25# define K_STW_ASM_PIC " \n"
26# define K_LDW_ASM_PIC " \n"
27# define K_USING_GR4
28#endif
29
30
31
32
33
34
35
36
37
38
39
40
41#define K_CALL_CLOB_REGS "%r1", "%r2", K_USING_GR4 \
42 "%r20", "%r29", "%r31"
43
44#undef K_INLINE_SYSCALL
45#define K_INLINE_SYSCALL(name, nr, args...) ({ \
46 long __sys_res; \
47 { \
48 register unsigned long __res __asm__("r28"); \
49 K_LOAD_ARGS_##nr(args) \
50 \
51 __asm__ volatile( \
52 K_STW_ASM_PIC \
53 " ble 0x100(%%sr2, %%r0)\n" \
54 " ldi %1, %%r20\n" \
55 K_LDW_ASM_PIC \
56 : "=r" (__res) \
57 : "i" (SYS_ify(name)) K_ASM_ARGS_##nr \
58 : "memory", K_CALL_CLOB_REGS K_CLOB_ARGS_##nr \
59 ); \
60 __sys_res = (long)__res; \
61 } \
62 if ( (unsigned long)__sys_res >= (unsigned long)-4095 ){ \
63 errno = -__sys_res; \
64 __sys_res = -1; \
65 } \
66 __sys_res; \
67})
68
69#define K_LOAD_ARGS_0()
70#define K_LOAD_ARGS_1(r26) \
71 register unsigned long __r26 __asm__("r26") = (unsigned long)(r26); \
72 K_LOAD_ARGS_0()
73#define K_LOAD_ARGS_2(r26,r25) \
74 register unsigned long __r25 __asm__("r25") = (unsigned long)(r25); \
75 K_LOAD_ARGS_1(r26)
76#define K_LOAD_ARGS_3(r26,r25,r24) \
77 register unsigned long __r24 __asm__("r24") = (unsigned long)(r24); \
78 K_LOAD_ARGS_2(r26,r25)
79#define K_LOAD_ARGS_4(r26,r25,r24,r23) \
80 register unsigned long __r23 __asm__("r23") = (unsigned long)(r23); \
81 K_LOAD_ARGS_3(r26,r25,r24)
82#define K_LOAD_ARGS_5(r26,r25,r24,r23,r22) \
83 register unsigned long __r22 __asm__("r22") = (unsigned long)(r22); \
84 K_LOAD_ARGS_4(r26,r25,r24,r23)
85#define K_LOAD_ARGS_6(r26,r25,r24,r23,r22,r21) \
86 register unsigned long __r21 __asm__("r21") = (unsigned long)(r21); \
87 K_LOAD_ARGS_5(r26,r25,r24,r23,r22)
88
89
90#define K_ASM_ARGS_0
91#define K_ASM_ARGS_1 K_ASM_ARGS_0, "r" (__r26)
92#define K_ASM_ARGS_2 K_ASM_ARGS_1, "r" (__r25)
93#define K_ASM_ARGS_3 K_ASM_ARGS_2, "r" (__r24)
94#define K_ASM_ARGS_4 K_ASM_ARGS_3, "r" (__r23)
95#define K_ASM_ARGS_5 K_ASM_ARGS_4, "r" (__r22)
96#define K_ASM_ARGS_6 K_ASM_ARGS_5, "r" (__r21)
97
98
99#define K_CLOB_ARGS_6
100#define K_CLOB_ARGS_5 K_CLOB_ARGS_6, "%r21"
101#define K_CLOB_ARGS_4 K_CLOB_ARGS_5, "%r22"
102#define K_CLOB_ARGS_3 K_CLOB_ARGS_4, "%r23"
103#define K_CLOB_ARGS_2 K_CLOB_ARGS_3, "%r24"
104#define K_CLOB_ARGS_1 K_CLOB_ARGS_2, "%r25"
105#define K_CLOB_ARGS_0 K_CLOB_ARGS_1, "%r26"
106
107#define _syscall0(type,name) \
108type name(void) \
109{ \
110 return K_INLINE_SYSCALL(name, 0); \
111}
112
113#define _syscall1(type,name,type1,arg1) \
114type name(type1 arg1) \
115{ \
116 return K_INLINE_SYSCALL(name, 1, arg1); \
117}
118
119#define _syscall2(type,name,type1,arg1,type2,arg2) \
120type name(type1 arg1, type2 arg2) \
121{ \
122 return K_INLINE_SYSCALL(name, 2, arg1, arg2); \
123}
124
125#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
126type name(type1 arg1, type2 arg2, type3 arg3) \
127{ \
128 return K_INLINE_SYSCALL(name, 3, arg1, arg2, arg3); \
129}
130
131#define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
132type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
133{ \
134 return K_INLINE_SYSCALL(name, 4, arg1, arg2, arg3, arg4); \
135}
136
137
138#define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) \
139type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \
140{ \
141 return K_INLINE_SYSCALL(name, 5, arg1, arg2, arg3, arg4, arg5); \
142}
143
144#define __ARCH_WANT_OLD_READDIR
145#define __ARCH_WANT_STAT64
146#define __ARCH_WANT_SYS_ALARM
147#define __ARCH_WANT_SYS_GETHOSTNAME
148#define __ARCH_WANT_SYS_PAUSE
149#define __ARCH_WANT_SYS_SIGNAL
150#define __ARCH_WANT_SYS_TIME
151#define __ARCH_WANT_COMPAT_SYS_TIME
152#define __ARCH_WANT_COMPAT_SYS_SCHED_RR_GET_INTERVAL
153#define __ARCH_WANT_SYS_UTIME
154#define __ARCH_WANT_SYS_WAITPID
155#define __ARCH_WANT_SYS_SOCKETCALL
156#define __ARCH_WANT_SYS_FADVISE64
157#define __ARCH_WANT_SYS_GETPGRP
158#define __ARCH_WANT_SYS_LLSEEK
159#define __ARCH_WANT_SYS_NICE
160#define __ARCH_WANT_SYS_OLDUMOUNT
161#define __ARCH_WANT_SYS_SIGPENDING
162#define __ARCH_WANT_SYS_SIGPROCMASK
163#define __ARCH_WANT_SYS_FORK
164#define __ARCH_WANT_SYS_VFORK
165#define __ARCH_WANT_SYS_CLONE
166#define __ARCH_WANT_COMPAT_SYS_SENDFILE
167
168#endif
169
170#undef STR
171
172#endif
173