xref: /OK3568_Linux_fs/yocto/poky/meta/recipes-extended/libaio/libaio/00_arches.patch (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593SmuzhiyunFrom ceba1e03e5b57cdae0b3b2d2c9afebc085c986d8 Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Qing He <qing.he@intel.com>
3*4882a593SmuzhiyunDate: Fri, 27 Aug 2010 10:15:31 +0800
4*4882a593SmuzhiyunSubject: [PATCH] libaio: add new recipe
5*4882a593Smuzhiyun
6*4882a593SmuzhiyunUpstream-Status: Inappropriate [embedded specific]
7*4882a593Smuzhiyun
8*4882a593Smuzhiyunfrom openembedded, added by Qing He <qing.he@intel.com>
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun---
11*4882a593Smuzhiyun src/syscall-m68k.h   |  78 ++++++++++++++++++
12*4882a593Smuzhiyun src/syscall-mips.h   | 223 +++++++++++++++++++++++++++++++++++++++++++++++++++
13*4882a593Smuzhiyun src/syscall-parisc.h | 146 +++++++++++++++++++++++++++++++++
14*4882a593Smuzhiyun src/syscall.h        |   6 ++
15*4882a593Smuzhiyun 4 files changed, 453 insertions(+)
16*4882a593Smuzhiyun create mode 100644 src/syscall-m68k.h
17*4882a593Smuzhiyun create mode 100644 src/syscall-mips.h
18*4882a593Smuzhiyun create mode 100644 src/syscall-parisc.h
19*4882a593Smuzhiyun
20*4882a593Smuzhiyundiff --git a/src/syscall-m68k.h b/src/syscall-m68k.h
21*4882a593Smuzhiyunnew file mode 100644
22*4882a593Smuzhiyunindex 0000000..f440412
23*4882a593Smuzhiyun--- /dev/null
24*4882a593Smuzhiyun+++ b/src/syscall-m68k.h
25*4882a593Smuzhiyun@@ -0,0 +1,78 @@
26*4882a593Smuzhiyun+#define __NR_io_setup		241
27*4882a593Smuzhiyun+#define __NR_io_destroy		242
28*4882a593Smuzhiyun+#define __NR_io_getevents	243
29*4882a593Smuzhiyun+#define __NR_io_submit		244
30*4882a593Smuzhiyun+#define __NR_io_cancel		245
31*4882a593Smuzhiyun+
32*4882a593Smuzhiyun+#define io_syscall1(type,fname,sname,atype,a) \
33*4882a593Smuzhiyun+type fname(atype a) \
34*4882a593Smuzhiyun+{ \
35*4882a593Smuzhiyun+register long __res __asm__ ("%d0") = __NR_##sname; \
36*4882a593Smuzhiyun+register long __a __asm__ ("%d1") = (long)(a); \
37*4882a593Smuzhiyun+__asm__ __volatile__ ("trap  #0" \
38*4882a593Smuzhiyun+		      : "+d" (__res) \
39*4882a593Smuzhiyun+		      : "d" (__a)  ); \
40*4882a593Smuzhiyun+return (type) __res; \
41*4882a593Smuzhiyun+}
42*4882a593Smuzhiyun+
43*4882a593Smuzhiyun+#define io_syscall2(type,fname,sname,atype,a,btype,b) \
44*4882a593Smuzhiyun+type fname(atype a,btype b) \
45*4882a593Smuzhiyun+{ \
46*4882a593Smuzhiyun+register long __res __asm__ ("%d0") = __NR_##sname; \
47*4882a593Smuzhiyun+register long __a __asm__ ("%d1") = (long)(a); \
48*4882a593Smuzhiyun+register long __b __asm__ ("%d2") = (long)(b); \
49*4882a593Smuzhiyun+__asm__ __volatile__ ("trap  #0" \
50*4882a593Smuzhiyun+		      : "+d" (__res) \
51*4882a593Smuzhiyun+		      : "d" (__a), "d" (__b) \
52*4882a593Smuzhiyun+		     ); \
53*4882a593Smuzhiyun+return (type) __res; \
54*4882a593Smuzhiyun+}
55*4882a593Smuzhiyun+
56*4882a593Smuzhiyun+#define io_syscall3(type,fname,sname,atype,a,btype,b,ctype,c) \
57*4882a593Smuzhiyun+type fname(atype a,btype b,ctype c) \
58*4882a593Smuzhiyun+{ \
59*4882a593Smuzhiyun+register long __res __asm__ ("%d0") = __NR_##sname; \
60*4882a593Smuzhiyun+register long __a __asm__ ("%d1") = (long)(a); \
61*4882a593Smuzhiyun+register long __b __asm__ ("%d2") = (long)(b); \
62*4882a593Smuzhiyun+register long __c __asm__ ("%d3") = (long)(c); \
63*4882a593Smuzhiyun+__asm__ __volatile__ ("trap  #0" \
64*4882a593Smuzhiyun+		      : "+d" (__res) \
65*4882a593Smuzhiyun+		      : "d" (__a), "d" (__b), \
66*4882a593Smuzhiyun+			"d" (__c) \
67*4882a593Smuzhiyun+		     ); \
68*4882a593Smuzhiyun+return (type) __res; \
69*4882a593Smuzhiyun+}
70*4882a593Smuzhiyun+
71*4882a593Smuzhiyun+#define io_syscall4(type,fname,sname,atype,a,btype,b,ctype,c,dtype,d) \
72*4882a593Smuzhiyun+type fname (atype a, btype b, ctype c, dtype d) \
73*4882a593Smuzhiyun+{ \
74*4882a593Smuzhiyun+register long __res __asm__ ("%d0") = __NR_##sname; \
75*4882a593Smuzhiyun+register long __a __asm__ ("%d1") = (long)(a); \
76*4882a593Smuzhiyun+register long __b __asm__ ("%d2") = (long)(b); \
77*4882a593Smuzhiyun+register long __c __asm__ ("%d3") = (long)(c); \
78*4882a593Smuzhiyun+register long __d __asm__ ("%d4") = (long)(d); \
79*4882a593Smuzhiyun+__asm__ __volatile__ ("trap  #0" \
80*4882a593Smuzhiyun+		      : "+d" (__res) \
81*4882a593Smuzhiyun+		      : "d" (__a), "d" (__b), \
82*4882a593Smuzhiyun+			"d" (__c), "d" (__d)  \
83*4882a593Smuzhiyun+		     ); \
84*4882a593Smuzhiyun+return (type) __res; \
85*4882a593Smuzhiyun+}
86*4882a593Smuzhiyun+
87*4882a593Smuzhiyun+#define io_syscall5(type,fname,sname,atype,a,btype,b,ctype,c,dtype,d,etype,e) \
88*4882a593Smuzhiyun+type fname (atype a,btype b,ctype c,dtype d,etype e) \
89*4882a593Smuzhiyun+{ \
90*4882a593Smuzhiyun+register long __res __asm__ ("%d0") = __NR_##sname; \
91*4882a593Smuzhiyun+register long __a __asm__ ("%d1") = (long)(a); \
92*4882a593Smuzhiyun+register long __b __asm__ ("%d2") = (long)(b); \
93*4882a593Smuzhiyun+register long __c __asm__ ("%d3") = (long)(c); \
94*4882a593Smuzhiyun+register long __d __asm__ ("%d4") = (long)(d); \
95*4882a593Smuzhiyun+register long __e __asm__ ("%d5") = (long)(e); \
96*4882a593Smuzhiyun+__asm__ __volatile__ ("trap  #0" \
97*4882a593Smuzhiyun+		      : "+d" (__res) \
98*4882a593Smuzhiyun+		      : "d" (__a), "d" (__b), \
99*4882a593Smuzhiyun+			"d" (__c), "d" (__d), "d" (__e)  \
100*4882a593Smuzhiyun+		     ); \
101*4882a593Smuzhiyun+return (type) __res; \
102*4882a593Smuzhiyun+}
103*4882a593Smuzhiyun+
104*4882a593Smuzhiyundiff --git a/src/syscall-mips.h b/src/syscall-mips.h
105*4882a593Smuzhiyunnew file mode 100644
106*4882a593Smuzhiyunindex 0000000..4142499
107*4882a593Smuzhiyun--- /dev/null
108*4882a593Smuzhiyun+++ b/src/syscall-mips.h
109*4882a593Smuzhiyun@@ -0,0 +1,223 @@
110*4882a593Smuzhiyun+/*
111*4882a593Smuzhiyun+ * This file is subject to the terms and conditions of the GNU General Public
112*4882a593Smuzhiyun+ * License.  See the file "COPYING" in the main directory of this archive
113*4882a593Smuzhiyun+ * for more details.
114*4882a593Smuzhiyun+ *
115*4882a593Smuzhiyun+ * Copyright (C) 1995, 96, 97, 98, 99, 2000 by Ralf Baechle
116*4882a593Smuzhiyun+ * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
117*4882a593Smuzhiyun+ *
118*4882a593Smuzhiyun+ * Changed system calls macros _syscall5 - _syscall7 to push args 5 to 7 onto
119*4882a593Smuzhiyun+ * the stack. Robin Farine for ACN S.A, Copyright (C) 1996 by ACN S.A
120*4882a593Smuzhiyun+ */
121*4882a593Smuzhiyun+
122*4882a593Smuzhiyun+#ifndef _MIPS_SIM_ABI32
123*4882a593Smuzhiyun+#define _MIPS_SIM_ABI32			1
124*4882a593Smuzhiyun+#define _MIPS_SIM_NABI32		2
125*4882a593Smuzhiyun+#define _MIPS_SIM_ABI64			3
126*4882a593Smuzhiyun+#endif
127*4882a593Smuzhiyun+
128*4882a593Smuzhiyun+#if _MIPS_SIM == _MIPS_SIM_ABI32
129*4882a593Smuzhiyun+
130*4882a593Smuzhiyun+/*
131*4882a593Smuzhiyun+ * Linux o32 style syscalls are in the range from 4000 to 4999.
132*4882a593Smuzhiyun+ */
133*4882a593Smuzhiyun+#define __NR_Linux			4000
134*4882a593Smuzhiyun+#define __NR_io_setup			(__NR_Linux + 241)
135*4882a593Smuzhiyun+#define __NR_io_destroy			(__NR_Linux + 242)
136*4882a593Smuzhiyun+#define __NR_io_getevents		(__NR_Linux + 243)
137*4882a593Smuzhiyun+#define __NR_io_submit			(__NR_Linux + 244)
138*4882a593Smuzhiyun+#define __NR_io_cancel			(__NR_Linux + 245)
139*4882a593Smuzhiyun+
140*4882a593Smuzhiyun+#endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */
141*4882a593Smuzhiyun+
142*4882a593Smuzhiyun+#if _MIPS_SIM == _MIPS_SIM_ABI64
143*4882a593Smuzhiyun+
144*4882a593Smuzhiyun+/*
145*4882a593Smuzhiyun+ * Linux 64-bit syscalls are in the range from 5000 to 5999.
146*4882a593Smuzhiyun+ */
147*4882a593Smuzhiyun+#define __NR_Linux			5000
148*4882a593Smuzhiyun+#define __NR_io_setup			(__NR_Linux + 200)
149*4882a593Smuzhiyun+#define __NR_io_destroy			(__NR_Linux + 201)
150*4882a593Smuzhiyun+#define __NR_io_getevents		(__NR_Linux + 202)
151*4882a593Smuzhiyun+#define __NR_io_submit			(__NR_Linux + 203)
152*4882a593Smuzhiyun+#define __NR_io_cancel			(__NR_Linux + 204)
153*4882a593Smuzhiyun+#endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */
154*4882a593Smuzhiyun+
155*4882a593Smuzhiyun+#if _MIPS_SIM == _MIPS_SIM_NABI32
156*4882a593Smuzhiyun+
157*4882a593Smuzhiyun+/*
158*4882a593Smuzhiyun+ * Linux N32 syscalls are in the range from 6000 to 6999.
159*4882a593Smuzhiyun+ */
160*4882a593Smuzhiyun+#define __NR_Linux			6000
161*4882a593Smuzhiyun+#define __NR_io_setup			(__NR_Linux + 200)
162*4882a593Smuzhiyun+#define __NR_io_destroy			(__NR_Linux + 201)
163*4882a593Smuzhiyun+#define __NR_io_getevents		(__NR_Linux + 202)
164*4882a593Smuzhiyun+#define __NR_io_submit			(__NR_Linux + 203)
165*4882a593Smuzhiyun+#define __NR_io_cancel			(__NR_Linux + 204)
166*4882a593Smuzhiyun+#endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */
167*4882a593Smuzhiyun+
168*4882a593Smuzhiyun+#define io_syscall1(type,fname,sname,atype,a) \
169*4882a593Smuzhiyun+type fname(atype a) \
170*4882a593Smuzhiyun+{ \
171*4882a593Smuzhiyun+	register unsigned long __a0 asm("$4") = (unsigned long) a; \
172*4882a593Smuzhiyun+	register unsigned long __a3 asm("$7"); \
173*4882a593Smuzhiyun+	unsigned long __v0; \
174*4882a593Smuzhiyun+	\
175*4882a593Smuzhiyun+	__asm__ volatile ( \
176*4882a593Smuzhiyun+	".set\tnoreorder\n\t" \
177*4882a593Smuzhiyun+	"li\t$2, %3\t\t\t# " #fname "\n\t" \
178*4882a593Smuzhiyun+	"syscall\n\t" \
179*4882a593Smuzhiyun+	"move\t%0, $2\n\t" \
180*4882a593Smuzhiyun+	".set\treorder" \
181*4882a593Smuzhiyun+	: "=&r" (__v0), "=r" (__a3) \
182*4882a593Smuzhiyun+	: "r" (__a0), "i" (__NR_##sname) \
183*4882a593Smuzhiyun+	: "$2", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
184*4882a593Smuzhiyun+	  "memory"); \
185*4882a593Smuzhiyun+	\
186*4882a593Smuzhiyun+	if (__a3 == 0) \
187*4882a593Smuzhiyun+		return (type) __v0; \
188*4882a593Smuzhiyun+	return (type) -1; \
189*4882a593Smuzhiyun+}
190*4882a593Smuzhiyun+
191*4882a593Smuzhiyun+#define io_syscall2(type,fname,sname,atype,a,btype,b) \
192*4882a593Smuzhiyun+type fname(atype a, btype b) \
193*4882a593Smuzhiyun+{ \
194*4882a593Smuzhiyun+	register unsigned long __a0 asm("$4") = (unsigned long) a; \
195*4882a593Smuzhiyun+	register unsigned long __a1 asm("$5") = (unsigned long) b; \
196*4882a593Smuzhiyun+	register unsigned long __a3 asm("$7"); \
197*4882a593Smuzhiyun+	unsigned long __v0; \
198*4882a593Smuzhiyun+	\
199*4882a593Smuzhiyun+	__asm__ volatile ( \
200*4882a593Smuzhiyun+	".set\tnoreorder\n\t" \
201*4882a593Smuzhiyun+	"li\t$2, %4\t\t\t# " #fname "\n\t" \
202*4882a593Smuzhiyun+	"syscall\n\t" \
203*4882a593Smuzhiyun+	"move\t%0, $2\n\t" \
204*4882a593Smuzhiyun+	".set\treorder" \
205*4882a593Smuzhiyun+	: "=&r" (__v0), "=r" (__a3) \
206*4882a593Smuzhiyun+	: "r" (__a0), "r" (__a1), "i" (__NR_##sname) \
207*4882a593Smuzhiyun+	: "$2", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
208*4882a593Smuzhiyun+	  "memory"); \
209*4882a593Smuzhiyun+	\
210*4882a593Smuzhiyun+	if (__a3 == 0) \
211*4882a593Smuzhiyun+		return (type) __v0; \
212*4882a593Smuzhiyun+	return (type) -1; \
213*4882a593Smuzhiyun+}
214*4882a593Smuzhiyun+
215*4882a593Smuzhiyun+#define io_syscall3(type,fname,sname,atype,a,btype,b,ctype,c) \
216*4882a593Smuzhiyun+type fname(atype a, btype b, ctype c) \
217*4882a593Smuzhiyun+{ \
218*4882a593Smuzhiyun+	register unsigned long __a0 asm("$4") = (unsigned long) a; \
219*4882a593Smuzhiyun+	register unsigned long __a1 asm("$5") = (unsigned long) b; \
220*4882a593Smuzhiyun+	register unsigned long __a2 asm("$6") = (unsigned long) c; \
221*4882a593Smuzhiyun+	register unsigned long __a3 asm("$7"); \
222*4882a593Smuzhiyun+	unsigned long __v0; \
223*4882a593Smuzhiyun+	\
224*4882a593Smuzhiyun+	__asm__ volatile ( \
225*4882a593Smuzhiyun+	".set\tnoreorder\n\t" \
226*4882a593Smuzhiyun+	"li\t$2, %5\t\t\t# " #fname "\n\t" \
227*4882a593Smuzhiyun+	"syscall\n\t" \
228*4882a593Smuzhiyun+	"move\t%0, $2\n\t" \
229*4882a593Smuzhiyun+	".set\treorder" \
230*4882a593Smuzhiyun+	: "=&r" (__v0), "=r" (__a3) \
231*4882a593Smuzhiyun+	: "r" (__a0), "r" (__a1), "r" (__a2), "i" (__NR_##sname) \
232*4882a593Smuzhiyun+	: "$2", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
233*4882a593Smuzhiyun+	  "memory"); \
234*4882a593Smuzhiyun+	\
235*4882a593Smuzhiyun+	if (__a3 == 0) \
236*4882a593Smuzhiyun+		return (type) __v0; \
237*4882a593Smuzhiyun+	return (type) -1; \
238*4882a593Smuzhiyun+}
239*4882a593Smuzhiyun+
240*4882a593Smuzhiyun+#define io_syscall4(type,fname,sname,atype,a,btype,b,ctype,c,dtype,d) \
241*4882a593Smuzhiyun+type fname(atype a, btype b, ctype c, dtype d) \
242*4882a593Smuzhiyun+{ \
243*4882a593Smuzhiyun+	register unsigned long __a0 asm("$4") = (unsigned long) a; \
244*4882a593Smuzhiyun+	register unsigned long __a1 asm("$5") = (unsigned long) b; \
245*4882a593Smuzhiyun+	register unsigned long __a2 asm("$6") = (unsigned long) c; \
246*4882a593Smuzhiyun+	register unsigned long __a3 asm("$7") = (unsigned long) d; \
247*4882a593Smuzhiyun+	unsigned long __v0; \
248*4882a593Smuzhiyun+	\
249*4882a593Smuzhiyun+	__asm__ volatile ( \
250*4882a593Smuzhiyun+	".set\tnoreorder\n\t" \
251*4882a593Smuzhiyun+	"li\t$2, %5\t\t\t# " #fname "\n\t" \
252*4882a593Smuzhiyun+	"syscall\n\t" \
253*4882a593Smuzhiyun+	"move\t%0, $2\n\t" \
254*4882a593Smuzhiyun+	".set\treorder" \
255*4882a593Smuzhiyun+	: "=&r" (__v0), "+r" (__a3) \
256*4882a593Smuzhiyun+	: "r" (__a0), "r" (__a1), "r" (__a2), "i" (__NR_##sname) \
257*4882a593Smuzhiyun+	: "$2", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
258*4882a593Smuzhiyun+	  "memory"); \
259*4882a593Smuzhiyun+	\
260*4882a593Smuzhiyun+	if (__a3 == 0) \
261*4882a593Smuzhiyun+		return (type) __v0; \
262*4882a593Smuzhiyun+	return (type) -1; \
263*4882a593Smuzhiyun+}
264*4882a593Smuzhiyun+
265*4882a593Smuzhiyun+#if (_MIPS_SIM == _MIPS_SIM_ABI32)
266*4882a593Smuzhiyun+
267*4882a593Smuzhiyun+/*
268*4882a593Smuzhiyun+ * Using those means your brain needs more than an oil change ;-)
269*4882a593Smuzhiyun+ */
270*4882a593Smuzhiyun+
271*4882a593Smuzhiyun+#define io_syscall5(type,fname,sname,atype,a,btype,b,ctype,c,dtype,d,etype,e) \
272*4882a593Smuzhiyun+type fname(atype a, btype b, ctype c, dtype d, etype e) \
273*4882a593Smuzhiyun+{ \
274*4882a593Smuzhiyun+	register unsigned long __a0 asm("$4") = (unsigned long) a; \
275*4882a593Smuzhiyun+	register unsigned long __a1 asm("$5") = (unsigned long) b; \
276*4882a593Smuzhiyun+	register unsigned long __a2 asm("$6") = (unsigned long) c; \
277*4882a593Smuzhiyun+	register unsigned long __a3 asm("$7") = (unsigned long) d; \
278*4882a593Smuzhiyun+	unsigned long __v0; \
279*4882a593Smuzhiyun+	\
280*4882a593Smuzhiyun+	__asm__ volatile ( \
281*4882a593Smuzhiyun+	".set\tnoreorder\n\t" \
282*4882a593Smuzhiyun+	"lw\t$2, %6\n\t" \
283*4882a593Smuzhiyun+	"subu\t$29, 32\n\t" \
284*4882a593Smuzhiyun+	"sw\t$2, 16($29)\n\t" \
285*4882a593Smuzhiyun+	"li\t$2, %5\t\t\t# " #fname "\n\t" \
286*4882a593Smuzhiyun+	"syscall\n\t" \
287*4882a593Smuzhiyun+	"move\t%0, $2\n\t" \
288*4882a593Smuzhiyun+	"addiu\t$29, 32\n\t" \
289*4882a593Smuzhiyun+	".set\treorder" \
290*4882a593Smuzhiyun+	: "=&r" (__v0), "+r" (__a3) \
291*4882a593Smuzhiyun+	: "r" (__a0), "r" (__a1), "r" (__a2), "i" (__NR_##sname), \
292*4882a593Smuzhiyun+	  "m" ((unsigned long)e) \
293*4882a593Smuzhiyun+	: "$2", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
294*4882a593Smuzhiyun+	  "memory"); \
295*4882a593Smuzhiyun+	\
296*4882a593Smuzhiyun+	if (__a3 == 0) \
297*4882a593Smuzhiyun+		return (type) __v0; \
298*4882a593Smuzhiyun+	return (type) -1; \
299*4882a593Smuzhiyun+}
300*4882a593Smuzhiyun+
301*4882a593Smuzhiyun+#endif /* (_MIPS_SIM == _MIPS_SIM_ABI32) */
302*4882a593Smuzhiyun+
303*4882a593Smuzhiyun+#if (_MIPS_SIM == _MIPS_SIM_NABI32) || (_MIPS_SIM == _MIPS_SIM_ABI64)
304*4882a593Smuzhiyun+
305*4882a593Smuzhiyun+#define io_syscall5(type,fname,sname,atype,a,btype,b,ctype,c,dtype,d,etype,e) \
306*4882a593Smuzhiyun+type fname (atype a,btype b,ctype c,dtype d,etype e) \
307*4882a593Smuzhiyun+{ \
308*4882a593Smuzhiyun+	register unsigned long __a0 asm("$4") = (unsigned long) a; \
309*4882a593Smuzhiyun+	register unsigned long __a1 asm("$5") = (unsigned long) b; \
310*4882a593Smuzhiyun+	register unsigned long __a2 asm("$6") = (unsigned long) c; \
311*4882a593Smuzhiyun+	register unsigned long __a3 asm("$7") = (unsigned long) d; \
312*4882a593Smuzhiyun+	register unsigned long __a4 asm("$8") = (unsigned long) e; \
313*4882a593Smuzhiyun+	unsigned long __v0; \
314*4882a593Smuzhiyun+	\
315*4882a593Smuzhiyun+	__asm__ volatile ( \
316*4882a593Smuzhiyun+	".set\tnoreorder\n\t" \
317*4882a593Smuzhiyun+	"li\t$2, %6\t\t\t# " #fname "\n\t" \
318*4882a593Smuzhiyun+	"syscall\n\t" \
319*4882a593Smuzhiyun+	"move\t%0, $2\n\t" \
320*4882a593Smuzhiyun+	".set\treorder" \
321*4882a593Smuzhiyun+	: "=&r" (__v0), "+r" (__a3) \
322*4882a593Smuzhiyun+	: "r" (__a0), "r" (__a1), "r" (__a2), "r" (__a4), "i" (__NR_##sname) \
323*4882a593Smuzhiyun+	: "$2", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
324*4882a593Smuzhiyun+	  "memory"); \
325*4882a593Smuzhiyun+	\
326*4882a593Smuzhiyun+	if (__a3 == 0) \
327*4882a593Smuzhiyun+		return (type) __v0; \
328*4882a593Smuzhiyun+	return (type) -1; \
329*4882a593Smuzhiyun+}
330*4882a593Smuzhiyun+
331*4882a593Smuzhiyun+#endif /* (_MIPS_SIM == _MIPS_SIM_NABI32) || (_MIPS_SIM == _MIPS_SIM_ABI64) */
332*4882a593Smuzhiyun+
333*4882a593Smuzhiyundiff --git a/src/syscall-parisc.h b/src/syscall-parisc.h
334*4882a593Smuzhiyunnew file mode 100644
335*4882a593Smuzhiyunindex 0000000..ff61746
336*4882a593Smuzhiyun--- /dev/null
337*4882a593Smuzhiyun+++ b/src/syscall-parisc.h
338*4882a593Smuzhiyun@@ -0,0 +1,146 @@
339*4882a593Smuzhiyun+/*
340*4882a593Smuzhiyun+ * Linux system call numbers.
341*4882a593Smuzhiyun+ *
342*4882a593Smuzhiyun+ * Cary Coutant says that we should just use another syscall gateway
343*4882a593Smuzhiyun+ * page to avoid clashing with the HPUX space, and I think he's right:
344*4882a593Smuzhiyun+ * it will would keep a branch out of our syscall entry path, at the
345*4882a593Smuzhiyun+ * very least.  If we decide to change it later, we can ``just'' tweak
346*4882a593Smuzhiyun+ * the LINUX_GATEWAY_ADDR define at the bottom and make __NR_Linux be
347*4882a593Smuzhiyun+ * 1024 or something.  Oh, and recompile libc. =)
348*4882a593Smuzhiyun+ *
349*4882a593Smuzhiyun+ * 64-bit HPUX binaries get the syscall gateway address passed in a register
350*4882a593Smuzhiyun+ * from the kernel at startup, which seems a sane strategy.
351*4882a593Smuzhiyun+ */
352*4882a593Smuzhiyun+
353*4882a593Smuzhiyun+#define __NR_Linux                0
354*4882a593Smuzhiyun+#define __NR_io_setup           (__NR_Linux + 215)
355*4882a593Smuzhiyun+#define __NR_io_destroy         (__NR_Linux + 216)
356*4882a593Smuzhiyun+#define __NR_io_getevents       (__NR_Linux + 217)
357*4882a593Smuzhiyun+#define __NR_io_submit          (__NR_Linux + 218)
358*4882a593Smuzhiyun+#define __NR_io_cancel          (__NR_Linux + 219)
359*4882a593Smuzhiyun+
360*4882a593Smuzhiyun+#define SYS_ify(syscall_name)   __NR_##syscall_name
361*4882a593Smuzhiyun+
362*4882a593Smuzhiyun+/* Assume all syscalls are done from PIC code just to be
363*4882a593Smuzhiyun+ * safe. The worst case scenario is that you lose a register
364*4882a593Smuzhiyun+ * and save/restore r19 across the syscall. */
365*4882a593Smuzhiyun+#define PIC
366*4882a593Smuzhiyun+
367*4882a593Smuzhiyun+/* Definition taken from glibc 2.3.3
368*4882a593Smuzhiyun+ * sysdeps/unix/sysv/linux/hppa/sysdep.h
369*4882a593Smuzhiyun+ */
370*4882a593Smuzhiyun+
371*4882a593Smuzhiyun+#ifdef PIC
372*4882a593Smuzhiyun+/* WARNING: CANNOT BE USED IN A NOP! */
373*4882a593Smuzhiyun+# define K_STW_ASM_PIC	"       copy %%r19, %%r4\n"
374*4882a593Smuzhiyun+# define K_LDW_ASM_PIC	"       copy %%r4, %%r19\n"
375*4882a593Smuzhiyun+# define K_USING_GR4	"%r4",
376*4882a593Smuzhiyun+#else
377*4882a593Smuzhiyun+# define K_STW_ASM_PIC	" \n"
378*4882a593Smuzhiyun+# define K_LDW_ASM_PIC	" \n"
379*4882a593Smuzhiyun+# define K_USING_GR4
380*4882a593Smuzhiyun+#endif
381*4882a593Smuzhiyun+
382*4882a593Smuzhiyun+/* GCC has to be warned that a syscall may clobber all the ABI
383*4882a593Smuzhiyun+   registers listed as "caller-saves", see page 8, Table 2
384*4882a593Smuzhiyun+   in section 2.2.6 of the PA-RISC RUN-TIME architecture
385*4882a593Smuzhiyun+   document. However! r28 is the result and will conflict with
386*4882a593Smuzhiyun+   the clobber list so it is left out. Also the input arguments
387*4882a593Smuzhiyun+   registers r20 -> r26 will conflict with the list so they
388*4882a593Smuzhiyun+   are treated specially. Although r19 is clobbered by the syscall
389*4882a593Smuzhiyun+   we cannot say this because it would violate ABI, thus we say
390*4882a593Smuzhiyun+   r4 is clobbered and use that register to save/restore r19
391*4882a593Smuzhiyun+   across the syscall. */
392*4882a593Smuzhiyun+
393*4882a593Smuzhiyun+#define K_CALL_CLOB_REGS "%r1", "%r2", K_USING_GR4 \
394*4882a593Smuzhiyun+			 "%r20", "%r29", "%r31"
395*4882a593Smuzhiyun+
396*4882a593Smuzhiyun+#undef K_INLINE_SYSCALL
397*4882a593Smuzhiyun+#define K_INLINE_SYSCALL(name, nr, args...)	({			\
398*4882a593Smuzhiyun+	long __sys_res;							\
399*4882a593Smuzhiyun+	{								\
400*4882a593Smuzhiyun+		register unsigned long __res __asm__("r28");		\
401*4882a593Smuzhiyun+		K_LOAD_ARGS_##nr(args)					\
402*4882a593Smuzhiyun+		/* FIXME: HACK stw/ldw r19 around syscall */		\
403*4882a593Smuzhiyun+		__asm__ volatile(					\
404*4882a593Smuzhiyun+			K_STW_ASM_PIC					\
405*4882a593Smuzhiyun+			"	ble  0x100(%%sr2, %%r0)\n"		\
406*4882a593Smuzhiyun+			"	ldi %1, %%r20\n"			\
407*4882a593Smuzhiyun+			K_LDW_ASM_PIC					\
408*4882a593Smuzhiyun+			: "=r" (__res)					\
409*4882a593Smuzhiyun+			: "i" (SYS_ify(name)) K_ASM_ARGS_##nr		\
410*4882a593Smuzhiyun+			: "memory", K_CALL_CLOB_REGS K_CLOB_ARGS_##nr	\
411*4882a593Smuzhiyun+		);							\
412*4882a593Smuzhiyun+		__sys_res = (long)__res;				\
413*4882a593Smuzhiyun+	}								\
414*4882a593Smuzhiyun+	__sys_res;							\
415*4882a593Smuzhiyun+})
416*4882a593Smuzhiyun+
417*4882a593Smuzhiyun+#define K_LOAD_ARGS_0()
418*4882a593Smuzhiyun+#define K_LOAD_ARGS_1(r26)					\
419*4882a593Smuzhiyun+	register unsigned long __r26 __asm__("r26") = (unsigned long)(r26);   \
420*4882a593Smuzhiyun+	K_LOAD_ARGS_0()
421*4882a593Smuzhiyun+#define K_LOAD_ARGS_2(r26,r25)					\
422*4882a593Smuzhiyun+	register unsigned long __r25 __asm__("r25") = (unsigned long)(r25);   \
423*4882a593Smuzhiyun+	K_LOAD_ARGS_1(r26)
424*4882a593Smuzhiyun+#define K_LOAD_ARGS_3(r26,r25,r24)				\
425*4882a593Smuzhiyun+	register unsigned long __r24 __asm__("r24") = (unsigned long)(r24);   \
426*4882a593Smuzhiyun+	K_LOAD_ARGS_2(r26,r25)
427*4882a593Smuzhiyun+#define K_LOAD_ARGS_4(r26,r25,r24,r23)				\
428*4882a593Smuzhiyun+	register unsigned long __r23 __asm__("r23") = (unsigned long)(r23);   \
429*4882a593Smuzhiyun+	K_LOAD_ARGS_3(r26,r25,r24)
430*4882a593Smuzhiyun+#define K_LOAD_ARGS_5(r26,r25,r24,r23,r22)			\
431*4882a593Smuzhiyun+	register unsigned long __r22 __asm__("r22") = (unsigned long)(r22);   \
432*4882a593Smuzhiyun+	K_LOAD_ARGS_4(r26,r25,r24,r23)
433*4882a593Smuzhiyun+#define K_LOAD_ARGS_6(r26,r25,r24,r23,r22,r21)			\
434*4882a593Smuzhiyun+	register unsigned long __r21 __asm__("r21") = (unsigned long)(r21);   \
435*4882a593Smuzhiyun+	K_LOAD_ARGS_5(r26,r25,r24,r23,r22)
436*4882a593Smuzhiyun+
437*4882a593Smuzhiyun+/* Even with zero args we use r20 for the syscall number */
438*4882a593Smuzhiyun+#define K_ASM_ARGS_0
439*4882a593Smuzhiyun+#define K_ASM_ARGS_1 K_ASM_ARGS_0, "r" (__r26)
440*4882a593Smuzhiyun+#define K_ASM_ARGS_2 K_ASM_ARGS_1, "r" (__r25)
441*4882a593Smuzhiyun+#define K_ASM_ARGS_3 K_ASM_ARGS_2, "r" (__r24)
442*4882a593Smuzhiyun+#define K_ASM_ARGS_4 K_ASM_ARGS_3, "r" (__r23)
443*4882a593Smuzhiyun+#define K_ASM_ARGS_5 K_ASM_ARGS_4, "r" (__r22)
444*4882a593Smuzhiyun+#define K_ASM_ARGS_6 K_ASM_ARGS_5, "r" (__r21)
445*4882a593Smuzhiyun+
446*4882a593Smuzhiyun+/* The registers not listed as inputs but clobbered */
447*4882a593Smuzhiyun+#define K_CLOB_ARGS_6
448*4882a593Smuzhiyun+#define K_CLOB_ARGS_5 K_CLOB_ARGS_6, "%r21"
449*4882a593Smuzhiyun+#define K_CLOB_ARGS_4 K_CLOB_ARGS_5, "%r22"
450*4882a593Smuzhiyun+#define K_CLOB_ARGS_3 K_CLOB_ARGS_4, "%r23"
451*4882a593Smuzhiyun+#define K_CLOB_ARGS_2 K_CLOB_ARGS_3, "%r24"
452*4882a593Smuzhiyun+#define K_CLOB_ARGS_1 K_CLOB_ARGS_2, "%r25"
453*4882a593Smuzhiyun+#define K_CLOB_ARGS_0 K_CLOB_ARGS_1, "%r26"
454*4882a593Smuzhiyun+
455*4882a593Smuzhiyun+#define io_syscall1(type,fname,sname,type1,arg1)			\
456*4882a593Smuzhiyun+type fname(type1 arg1)							\
457*4882a593Smuzhiyun+{									\
458*4882a593Smuzhiyun+    return K_INLINE_SYSCALL(sname, 1, arg1);				\
459*4882a593Smuzhiyun+}
460*4882a593Smuzhiyun+
461*4882a593Smuzhiyun+#define io_syscall2(type,fname,sname,type1,arg1,type2,arg2)		\
462*4882a593Smuzhiyun+type fname(type1 arg1, type2 arg2)					\
463*4882a593Smuzhiyun+{									\
464*4882a593Smuzhiyun+    return K_INLINE_SYSCALL(sname, 2, arg1, arg2);			\
465*4882a593Smuzhiyun+}
466*4882a593Smuzhiyun+
467*4882a593Smuzhiyun+#define io_syscall3(type,fname,sname,type1,arg1,type2,arg2,type3,arg3)	\
468*4882a593Smuzhiyun+type fname(type1 arg1, type2 arg2, type3 arg3)				\
469*4882a593Smuzhiyun+{									\
470*4882a593Smuzhiyun+    return K_INLINE_SYSCALL(sname, 3, arg1, arg2, arg3);		\
471*4882a593Smuzhiyun+}
472*4882a593Smuzhiyun+
473*4882a593Smuzhiyun+#define io_syscall4(type,fname,sname,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
474*4882a593Smuzhiyun+type fname(type1 arg1, type2 arg2, type3 arg3, type4 arg4)		\
475*4882a593Smuzhiyun+{									\
476*4882a593Smuzhiyun+    return K_INLINE_SYSCALL(sname, 4, arg1, arg2, arg3, arg4);		\
477*4882a593Smuzhiyun+}
478*4882a593Smuzhiyun+
479*4882a593Smuzhiyun+#define io_syscall5(type,fname,sname,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) \
480*4882a593Smuzhiyun+type fname(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5)	\
481*4882a593Smuzhiyun+{									\
482*4882a593Smuzhiyun+    return K_INLINE_SYSCALL(sname, 5, arg1, arg2, arg3, arg4, arg5);	\
483*4882a593Smuzhiyun+}
484*4882a593Smuzhiyun+
485*4882a593Smuzhiyundiff --git a/src/syscall.h b/src/syscall.h
486*4882a593Smuzhiyunindex 9b9e9c1..9ecd3b4 100644
487*4882a593Smuzhiyun--- a/src/syscall.h
488*4882a593Smuzhiyun+++ b/src/syscall.h
489*4882a593Smuzhiyun@@ -29,6 +29,12 @@
490*4882a593Smuzhiyun #include "syscall-sparc.h"
491*4882a593Smuzhiyun #elif defined(__aarch64__) || defined(__riscv)
492*4882a593Smuzhiyun #include "syscall-generic.h"
493*4882a593Smuzhiyun+#elif defined(__m68k__)
494*4882a593Smuzhiyun+#include "syscall-m68k.h"
495*4882a593Smuzhiyun+#elif defined(__hppa__)
496*4882a593Smuzhiyun+#include "syscall-parisc.h"
497*4882a593Smuzhiyun+#elif defined(__mips__)
498*4882a593Smuzhiyun+#include "syscall-mips.h"
499*4882a593Smuzhiyun #else
500*4882a593Smuzhiyun #warning "using system call numbers from sys/syscall.h"
501*4882a593Smuzhiyun #endif
502