xref: /OK3568_Linux_fs/kernel/arch/parisc/include/asm/unistd.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef _ASM_PARISC_UNISTD_H_
3*4882a593Smuzhiyun #define _ASM_PARISC_UNISTD_H_
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #include <uapi/asm/unistd.h>
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #define __NR_Linux_syscalls	__NR_syscalls
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #ifndef __ASSEMBLY__
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #define SYS_ify(syscall_name)   __NR_##syscall_name
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #define __IGNORE_fadvise64		/* fadvise64_64 */
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun #ifndef ASM_LINE_SEP
16*4882a593Smuzhiyun # define ASM_LINE_SEP ;
17*4882a593Smuzhiyun #endif
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun /* Definition taken from glibc 2.3.3
20*4882a593Smuzhiyun  * sysdeps/unix/sysv/linux/hppa/sysdep.h
21*4882a593Smuzhiyun  */
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #ifdef PIC
24*4882a593Smuzhiyun /* WARNING: CANNOT BE USED IN A NOP! */
25*4882a593Smuzhiyun # define K_STW_ASM_PIC	"       copy %%r19, %%r4\n"
26*4882a593Smuzhiyun # define K_LDW_ASM_PIC	"       copy %%r4, %%r19\n"
27*4882a593Smuzhiyun # define K_USING_GR4	"%r4",
28*4882a593Smuzhiyun #else
29*4882a593Smuzhiyun # define K_STW_ASM_PIC	" \n"
30*4882a593Smuzhiyun # define K_LDW_ASM_PIC	" \n"
31*4882a593Smuzhiyun # define K_USING_GR4
32*4882a593Smuzhiyun #endif
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun /* GCC has to be warned that a syscall may clobber all the ABI
35*4882a593Smuzhiyun    registers listed as "caller-saves", see page 8, Table 2
36*4882a593Smuzhiyun    in section 2.2.6 of the PA-RISC RUN-TIME architecture
37*4882a593Smuzhiyun    document. However! r28 is the result and will conflict with
38*4882a593Smuzhiyun    the clobber list so it is left out. Also the input arguments
39*4882a593Smuzhiyun    registers r20 -> r26 will conflict with the list so they
40*4882a593Smuzhiyun    are treated specially. Although r19 is clobbered by the syscall
41*4882a593Smuzhiyun    we cannot say this because it would violate ABI, thus we say
42*4882a593Smuzhiyun    r4 is clobbered and use that register to save/restore r19
43*4882a593Smuzhiyun    across the syscall. */
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun #define K_CALL_CLOB_REGS "%r1", "%r2", K_USING_GR4 \
46*4882a593Smuzhiyun 	        	 "%r20", "%r29", "%r31"
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun #undef K_INLINE_SYSCALL
49*4882a593Smuzhiyun #define K_INLINE_SYSCALL(name, nr, args...)	({			\
50*4882a593Smuzhiyun 	long __sys_res;							\
51*4882a593Smuzhiyun 	{								\
52*4882a593Smuzhiyun 		register unsigned long __res __asm__("r28");		\
53*4882a593Smuzhiyun 		K_LOAD_ARGS_##nr(args)					\
54*4882a593Smuzhiyun 		/* FIXME: HACK stw/ldw r19 around syscall */		\
55*4882a593Smuzhiyun 		__asm__ volatile(					\
56*4882a593Smuzhiyun 			K_STW_ASM_PIC					\
57*4882a593Smuzhiyun 			"	ble  0x100(%%sr2, %%r0)\n"		\
58*4882a593Smuzhiyun 			"	ldi %1, %%r20\n"			\
59*4882a593Smuzhiyun 			K_LDW_ASM_PIC					\
60*4882a593Smuzhiyun 			: "=r" (__res)					\
61*4882a593Smuzhiyun 			: "i" (SYS_ify(name)) K_ASM_ARGS_##nr   	\
62*4882a593Smuzhiyun 			: "memory", K_CALL_CLOB_REGS K_CLOB_ARGS_##nr	\
63*4882a593Smuzhiyun 		);							\
64*4882a593Smuzhiyun 		__sys_res = (long)__res;				\
65*4882a593Smuzhiyun 	}								\
66*4882a593Smuzhiyun 	if ( (unsigned long)__sys_res >= (unsigned long)-4095 ){	\
67*4882a593Smuzhiyun 		errno = -__sys_res;		        		\
68*4882a593Smuzhiyun 		__sys_res = -1;						\
69*4882a593Smuzhiyun 	}								\
70*4882a593Smuzhiyun 	__sys_res;							\
71*4882a593Smuzhiyun })
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun #define K_LOAD_ARGS_0()
74*4882a593Smuzhiyun #define K_LOAD_ARGS_1(r26)					\
75*4882a593Smuzhiyun 	register unsigned long __r26 __asm__("r26") = (unsigned long)(r26);   \
76*4882a593Smuzhiyun 	K_LOAD_ARGS_0()
77*4882a593Smuzhiyun #define K_LOAD_ARGS_2(r26,r25)					\
78*4882a593Smuzhiyun 	register unsigned long __r25 __asm__("r25") = (unsigned long)(r25);   \
79*4882a593Smuzhiyun 	K_LOAD_ARGS_1(r26)
80*4882a593Smuzhiyun #define K_LOAD_ARGS_3(r26,r25,r24)				\
81*4882a593Smuzhiyun 	register unsigned long __r24 __asm__("r24") = (unsigned long)(r24);   \
82*4882a593Smuzhiyun 	K_LOAD_ARGS_2(r26,r25)
83*4882a593Smuzhiyun #define K_LOAD_ARGS_4(r26,r25,r24,r23)				\
84*4882a593Smuzhiyun 	register unsigned long __r23 __asm__("r23") = (unsigned long)(r23);   \
85*4882a593Smuzhiyun 	K_LOAD_ARGS_3(r26,r25,r24)
86*4882a593Smuzhiyun #define K_LOAD_ARGS_5(r26,r25,r24,r23,r22)			\
87*4882a593Smuzhiyun 	register unsigned long __r22 __asm__("r22") = (unsigned long)(r22);   \
88*4882a593Smuzhiyun 	K_LOAD_ARGS_4(r26,r25,r24,r23)
89*4882a593Smuzhiyun #define K_LOAD_ARGS_6(r26,r25,r24,r23,r22,r21)			\
90*4882a593Smuzhiyun 	register unsigned long __r21 __asm__("r21") = (unsigned long)(r21);   \
91*4882a593Smuzhiyun 	K_LOAD_ARGS_5(r26,r25,r24,r23,r22)
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun /* Even with zero args we use r20 for the syscall number */
94*4882a593Smuzhiyun #define K_ASM_ARGS_0
95*4882a593Smuzhiyun #define K_ASM_ARGS_1 K_ASM_ARGS_0, "r" (__r26)
96*4882a593Smuzhiyun #define K_ASM_ARGS_2 K_ASM_ARGS_1, "r" (__r25)
97*4882a593Smuzhiyun #define K_ASM_ARGS_3 K_ASM_ARGS_2, "r" (__r24)
98*4882a593Smuzhiyun #define K_ASM_ARGS_4 K_ASM_ARGS_3, "r" (__r23)
99*4882a593Smuzhiyun #define K_ASM_ARGS_5 K_ASM_ARGS_4, "r" (__r22)
100*4882a593Smuzhiyun #define K_ASM_ARGS_6 K_ASM_ARGS_5, "r" (__r21)
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun /* The registers not listed as inputs but clobbered */
103*4882a593Smuzhiyun #define K_CLOB_ARGS_6
104*4882a593Smuzhiyun #define K_CLOB_ARGS_5 K_CLOB_ARGS_6, "%r21"
105*4882a593Smuzhiyun #define K_CLOB_ARGS_4 K_CLOB_ARGS_5, "%r22"
106*4882a593Smuzhiyun #define K_CLOB_ARGS_3 K_CLOB_ARGS_4, "%r23"
107*4882a593Smuzhiyun #define K_CLOB_ARGS_2 K_CLOB_ARGS_3, "%r24"
108*4882a593Smuzhiyun #define K_CLOB_ARGS_1 K_CLOB_ARGS_2, "%r25"
109*4882a593Smuzhiyun #define K_CLOB_ARGS_0 K_CLOB_ARGS_1, "%r26"
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun #define _syscall0(type,name)						\
112*4882a593Smuzhiyun type name(void)								\
113*4882a593Smuzhiyun {									\
114*4882a593Smuzhiyun     return K_INLINE_SYSCALL(name, 0);	                                \
115*4882a593Smuzhiyun }
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun #define _syscall1(type,name,type1,arg1)					\
118*4882a593Smuzhiyun type name(type1 arg1)							\
119*4882a593Smuzhiyun {									\
120*4882a593Smuzhiyun     return K_INLINE_SYSCALL(name, 1, arg1);	                        \
121*4882a593Smuzhiyun }
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun #define _syscall2(type,name,type1,arg1,type2,arg2)			\
124*4882a593Smuzhiyun type name(type1 arg1, type2 arg2)					\
125*4882a593Smuzhiyun {									\
126*4882a593Smuzhiyun     return K_INLINE_SYSCALL(name, 2, arg1, arg2);	                \
127*4882a593Smuzhiyun }
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3)		\
130*4882a593Smuzhiyun type name(type1 arg1, type2 arg2, type3 arg3)				\
131*4882a593Smuzhiyun {									\
132*4882a593Smuzhiyun     return K_INLINE_SYSCALL(name, 3, arg1, arg2, arg3);	                \
133*4882a593Smuzhiyun }
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
136*4882a593Smuzhiyun type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4)		\
137*4882a593Smuzhiyun {									\
138*4882a593Smuzhiyun     return K_INLINE_SYSCALL(name, 4, arg1, arg2, arg3, arg4);	        \
139*4882a593Smuzhiyun }
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun /* select takes 5 arguments */
142*4882a593Smuzhiyun #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) \
143*4882a593Smuzhiyun type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5)	\
144*4882a593Smuzhiyun {									\
145*4882a593Smuzhiyun     return K_INLINE_SYSCALL(name, 5, arg1, arg2, arg3, arg4, arg5);	\
146*4882a593Smuzhiyun }
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun #define __ARCH_WANT_NEW_STAT
149*4882a593Smuzhiyun #define __ARCH_WANT_OLD_READDIR
150*4882a593Smuzhiyun #define __ARCH_WANT_STAT64
151*4882a593Smuzhiyun #define __ARCH_WANT_SYS_ALARM
152*4882a593Smuzhiyun #define __ARCH_WANT_SYS_GETHOSTNAME
153*4882a593Smuzhiyun #define __ARCH_WANT_SYS_PAUSE
154*4882a593Smuzhiyun #define __ARCH_WANT_SYS_SIGNAL
155*4882a593Smuzhiyun #define __ARCH_WANT_SYS_TIME32
156*4882a593Smuzhiyun #define __ARCH_WANT_COMPAT_SYS_SCHED_RR_GET_INTERVAL
157*4882a593Smuzhiyun #define __ARCH_WANT_SYS_UTIME32
158*4882a593Smuzhiyun #define __ARCH_WANT_SYS_WAITPID
159*4882a593Smuzhiyun #define __ARCH_WANT_SYS_SOCKETCALL
160*4882a593Smuzhiyun #define __ARCH_WANT_SYS_FADVISE64
161*4882a593Smuzhiyun #define __ARCH_WANT_SYS_GETPGRP
162*4882a593Smuzhiyun #define __ARCH_WANT_SYS_NICE
163*4882a593Smuzhiyun #define __ARCH_WANT_SYS_OLDUMOUNT
164*4882a593Smuzhiyun #define __ARCH_WANT_SYS_SIGPENDING
165*4882a593Smuzhiyun #define __ARCH_WANT_SYS_SIGPROCMASK
166*4882a593Smuzhiyun #define __ARCH_WANT_SYS_FORK
167*4882a593Smuzhiyun #define __ARCH_WANT_SYS_VFORK
168*4882a593Smuzhiyun #define __ARCH_WANT_SYS_CLONE
169*4882a593Smuzhiyun #define __ARCH_WANT_SYS_CLONE3
170*4882a593Smuzhiyun #define __ARCH_WANT_COMPAT_SYS_SENDFILE
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun #ifdef CONFIG_64BIT
173*4882a593Smuzhiyun #define __ARCH_WANT_SYS_TIME
174*4882a593Smuzhiyun #define __ARCH_WANT_SYS_UTIME
175*4882a593Smuzhiyun #endif
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun #endif /* __ASSEMBLY__ */
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun #undef STR
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun #endif /* _ASM_PARISC_UNISTD_H_ */
182