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