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