summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Moyer <jmoyer@redhat.com>2004-10-13 18:10:27 +0000
committerJeff Moyer <jmoyer@redhat.com>2004-10-13 18:10:27 +0000
commitdd5b8b0c94ba260662cdc91be7d4fdc2126ae6b0 (patch)
tree1d035c07b575dbf4fc27d8bc0d45a13415c748e0
parent165233d16674fc82f3525065f49faccd7a35a992 (diff)
downloadlibaio-dd5b8b0c94ba260662cdc91be7d4fdc2126ae6b0.tar.gz
- Revert syscall return values to be -ERRNO. This was an inadvertant buglibaio.0-3-101.1
introduced when clobber lists changed. - add ppc64pseries and ppc64iseries to exclusivearch
-rw-r--r--libaio.spec9
-rw-r--r--src/Makefile2
-rw-r--r--src/syscall-i386.h67
-rw-r--r--src/syscall-ia64.h39
-rw-r--r--src/syscall-ppc.h89
-rw-r--r--src/syscall-s390.h114
-rw-r--r--src/syscall-x86_64.h58
-rw-r--r--src/syscall.h31
8 files changed, 375 insertions, 34 deletions
diff --git a/libaio.spec b/libaio.spec
index 99fb0d3..af35b59 100644
--- a/libaio.spec
+++ b/libaio.spec
@@ -1,5 +1,5 @@
Name: libaio
-Version: 0.3.100
+Version: 0.3.101
Release: 1
Summary: Linux-native asynchronous I/O access library
Copyright: LGPL
@@ -7,7 +7,7 @@ Group: System Environment/Libraries
Source: %{name}-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-root
# Fix ExclusiveArch as we implement this functionality on more architectures
-ExclusiveArch: i386 x86_64 ia64 s390 s390x ppc ppc64
+ExclusiveArch: i386 x86_64 ia64 s390 s390x ppc ppc64 ppc64pseries ppc64iseries
%description
The Linux-native asynchronous I/O facility ("async I/O", or "aio") has a
@@ -59,6 +59,11 @@ make install prefix=$RPM_BUILD_ROOT/usr \
%attr(0644,root,root) %{_libdir}/libaio.a
%changelog
+* Wed Oct 13 2004 Jeff Moyer <jmoyer@redhat.com> - 0.3.101-1
+- Revert syscall return values to be -ERRNO. This was an inadvertant bug
+ introduced when clobber lists changed.
+- add ppc64pseries and ppc64iseries to exclusivearch
+
* Tue Sep 14 2004 Jeff Moyer <jmoyer@redhat.com> - 0.3.100-1
- Switch around the tests for _PPC_ and _powerpc64_ so that the ppc64
platforms get the right padding.
diff --git a/src/Makefile b/src/Makefile
index a1d6c84..773f13f 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -3,7 +3,7 @@ includedir=$(prefix)/include
libdir=$(prefix)/lib
ARCH := $(shell uname -m | sed -e s/i.86/i386/)
-CFLAGS := -nostdlib -nostartfiles -Wall -I. -g -fomit-frame-pointer -O2 -fpic
+CFLAGS := -nostdlib -nostartfiles -Wall -I. -g -fomit-frame-pointer -O2 -fPIC
SO_CFLAGS=-shared $(CFLAGS)
L_CFLAGS=$(CFLAGS)
LINK_FLAGS=
diff --git a/src/syscall-i386.h b/src/syscall-i386.h
index 266ed93..9576975 100644
--- a/src/syscall-i386.h
+++ b/src/syscall-i386.h
@@ -3,3 +3,70 @@
#define __NR_io_getevents 247
#define __NR_io_submit 248
#define __NR_io_cancel 249
+
+#define io_syscall1(type,fname,sname,type1,arg1) \
+type fname(type1 arg1) \
+{ \
+long __res; \
+__asm__ volatile ("xchgl %%edi,%%ebx\n" \
+ "int $0x80\n" \
+ "xchgl %%edi,%%ebx" \
+ : "=a" (__res) \
+ : "0" (__NR_##sname),"D" ((long)(arg1))); \
+return __res; \
+}
+
+#define io_syscall2(type,fname,sname,type1,arg1,type2,arg2) \
+type fname(type1 arg1,type2 arg2) \
+{ \
+long __res; \
+__asm__ volatile ("xchgl %%edi,%%ebx\n" \
+ "int $0x80\n" \
+ "xchgl %%edi,%%ebx" \
+ : "=a" (__res) \
+ : "0" (__NR_##sname),"D" ((long)(arg1)),"c" ((long)(arg2))); \
+return __res; \
+}
+
+#define io_syscall3(type,fname,sname,type1,arg1,type2,arg2,type3,arg3) \
+type fname(type1 arg1,type2 arg2,type3 arg3) \
+{ \
+long __res; \
+__asm__ volatile ("xchgl %%edi,%%ebx\n" \
+ "int $0x80\n" \
+ "xchgl %%edi,%%ebx" \
+ : "=a" (__res) \
+ : "0" (__NR_##sname),"D" ((long)(arg1)),"c" ((long)(arg2)), \
+ "d" ((long)(arg3))); \
+return __res; \
+}
+
+#define io_syscall4(type,fname,sname,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
+type fname (type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
+{ \
+long __res; \
+__asm__ volatile ("xchgl %%edi,%%ebx\n" \
+ "int $0x80\n" \
+ "xchgl %%edi,%%ebx" \
+ : "=a" (__res) \
+ : "0" (__NR_##sname),"D" ((long)(arg1)),"c" ((long)(arg2)), \
+ "d" ((long)(arg3)),"S" ((long)(arg4))); \
+return __res; \
+}
+
+#define io_syscall5(type,fname,sname,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
+ type5,arg5) \
+type fname (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \
+{ \
+long __res; \
+long tmp; \
+__asm__ volatile ("movl %%ebx,%7\n" \
+ "movl %2,%%ebx\n" \
+ "int $0x80\n" \
+ "movl %7,%%ebx" \
+ : "=a" (__res) \
+ : "0" (__NR_##sname),"rm" ((long)(arg1)),"c" ((long)(arg2)), \
+ "d" ((long)(arg3)),"S" ((long)(arg4)),"D" ((long)(arg5)), \
+ "m" (tmp)); \
+return __res; \
+}
diff --git a/src/syscall-ia64.h b/src/syscall-ia64.h
index a21e93b..2f6a01a 100644
--- a/src/syscall-ia64.h
+++ b/src/syscall-ia64.h
@@ -3,3 +3,42 @@
#define __NR_io_getevents 1240
#define __NR_io_submit 1241
#define __NR_io_cancel 1242
+
+#define __ia64_raw_syscall(fname, sname) \
+ __asm__ (".text\n" \
+ ".globl " SYMSTR(fname) "\n" \
+ SYMSTR(fname) ":\n" \
+ " mov r15=" SYMSTR( __NR_ ## sname ) "\n" \
+ " break 0x100000\n" \
+ " ;;\n" \
+ " cmp.eq p6,p0=-1,r10\n" \
+ " ;;\n" \
+ " (p6) sub r8=0,r8\n" \
+ " br.ret.sptk.few b0\n" \
+ ".size " SYMSTR(fname) ", . - " SYMSTR(fname) "\n" \
+ ".endp " SYMSTR(fname) "\n" \
+ );
+
+#define io_syscall0(type, name) \
+ extern type name(void); \
+ __ia64_raw_syscall(name);
+
+#define io_syscall1(type, fname, sname, type1, arg1) \
+ extern type fname(type1 arg1); \
+ __ia64_raw_syscall(fname, sname);
+
+#define io_syscall2(type, fname, sname, type1, arg1, type2, arg2) \
+ extern type fname(type1 arg1, type2 arg2); \
+ __ia64_raw_syscall(fname, sname);
+
+#define io_syscall3(type, fname, sname, type1, arg1, type2, arg2, type3, arg3) \
+ extern type fname(type1 arg1, type2 arg2, type3 arg3); \
+ __ia64_raw_syscall(fname, sname);
+
+#define io_syscall4(type, fname, sname, type1, arg1, type2, arg2, type3, arg3, type4, arg4) \
+ extern type fname(type1 arg1, type2 arg2, type3 arg3, type4 arg4); \
+ __ia64_raw_syscall(fname, sname);
+
+#define io_syscall5(type, fname, sname, type1, arg1, type2, arg2, type3, arg3, type4, arg4, type5, arg5) \
+ extern type fname(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5); \
+ __ia64_raw_syscall(fname, sname);
diff --git a/src/syscall-ppc.h b/src/syscall-ppc.h
index dcfb118..ca70dd2 100644
--- a/src/syscall-ppc.h
+++ b/src/syscall-ppc.h
@@ -3,3 +3,92 @@
#define __NR_io_getevents 229
#define __NR_io_submit 230
#define __NR_io_cancel 231
+
+/* On powerpc a system call basically clobbers the same registers like a
+ * function call, with the exception of LR (which is needed for the
+ * "sc; bnslr" sequence) and CR (where only CR0.SO is clobbered to signal
+ * an error return status).
+ */
+
+#define __syscall_nr(nr, type, name, args...) \
+ unsigned long __sc_ret, __sc_err; \
+ { \
+ register unsigned long __sc_0 __asm__ ("r0"); \
+ register unsigned long __sc_3 __asm__ ("r3"); \
+ register unsigned long __sc_4 __asm__ ("r4"); \
+ register unsigned long __sc_5 __asm__ ("r5"); \
+ register unsigned long __sc_6 __asm__ ("r6"); \
+ register unsigned long __sc_7 __asm__ ("r7"); \
+ register unsigned long __sc_8 __asm__ ("r8"); \
+ \
+ __sc_loadargs_##nr(name, args); \
+ __asm__ __volatile__ \
+ ("sc \n\t" \
+ "mfcr %0 " \
+ : "=&r" (__sc_0), \
+ "=&r" (__sc_3), "=&r" (__sc_4), \
+ "=&r" (__sc_5), "=&r" (__sc_6), \
+ "=&r" (__sc_7), "=&r" (__sc_8) \
+ : __sc_asm_input_##nr \
+ : "cr0", "ctr", "memory", \
+ "r9", "r10","r11", "r12"); \
+ __sc_ret = __sc_3; \
+ __sc_err = __sc_0; \
+ } \
+ if (__sc_err & 0x10000000) return -((int)__sc_ret); \
+ return (type) __sc_ret
+
+#define __sc_loadargs_0(name, dummy...) \
+ __sc_0 = __NR_##name
+#define __sc_loadargs_1(name, arg1) \
+ __sc_loadargs_0(name); \
+ __sc_3 = (unsigned long) (arg1)
+#define __sc_loadargs_2(name, arg1, arg2) \
+ __sc_loadargs_1(name, arg1); \
+ __sc_4 = (unsigned long) (arg2)
+#define __sc_loadargs_3(name, arg1, arg2, arg3) \
+ __sc_loadargs_2(name, arg1, arg2); \
+ __sc_5 = (unsigned long) (arg3)
+#define __sc_loadargs_4(name, arg1, arg2, arg3, arg4) \
+ __sc_loadargs_3(name, arg1, arg2, arg3); \
+ __sc_6 = (unsigned long) (arg4)
+#define __sc_loadargs_5(name, arg1, arg2, arg3, arg4, arg5) \
+ __sc_loadargs_4(name, arg1, arg2, arg3, arg4); \
+ __sc_7 = (unsigned long) (arg5)
+
+#define __sc_asm_input_0 "0" (__sc_0)
+#define __sc_asm_input_1 __sc_asm_input_0, "1" (__sc_3)
+#define __sc_asm_input_2 __sc_asm_input_1, "2" (__sc_4)
+#define __sc_asm_input_3 __sc_asm_input_2, "3" (__sc_5)
+#define __sc_asm_input_4 __sc_asm_input_3, "4" (__sc_6)
+#define __sc_asm_input_5 __sc_asm_input_4, "5" (__sc_7)
+
+#define io_syscall1(type,fname,sname,type1,arg1) \
+type fname(type1 arg1) \
+{ \
+ __syscall_nr(1, type, sname, arg1); \
+}
+
+#define io_syscall2(type,fname,sname,type1,arg1,type2,arg2) \
+type fname(type1 arg1, type2 arg2) \
+{ \
+ __syscall_nr(2, type, sname, arg1, arg2); \
+}
+
+#define io_syscall3(type,fname,sname,type1,arg1,type2,arg2,type3,arg3) \
+type fname(type1 arg1, type2 arg2, type3 arg3) \
+{ \
+ __syscall_nr(3, type, sname, arg1, arg2, arg3); \
+}
+
+#define io_syscall4(type,fname,sname,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
+type fname(type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
+{ \
+ __syscall_nr(4, type, sname, arg1, arg2, arg3, arg4); \
+}
+
+#define io_syscall5(type,fname,sname,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) \
+type fname(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \
+{ \
+ __syscall_nr(5, type, sname, arg1, arg2, arg3, arg4, arg5); \
+}
diff --git a/src/syscall-s390.h b/src/syscall-s390.h
index f0805f5..515c217 100644
--- a/src/syscall-s390.h
+++ b/src/syscall-s390.h
@@ -3,3 +3,117 @@
#define __NR_io_getevents 245
#define __NR_io_submit 246
#define __NR_io_cancel 247
+
+#define _svc_clobber "2", "cc", "memory"
+
+#ifdef __s390x__
+#define __LR "lgr " /* 64 bit load register */
+#else
+#define __LR "lr " /* 32 bit load register */
+#endif
+
+#define io_syscall0(type,fname,sname) \
+type fname(void) { \
+ long __res; \
+ __asm__ __volatile__ ( \
+ " svc %b1\n" \
+ " "__LR" %0,2" \
+ : "=d" (__res) \
+ : "i" (__NR_##sname) \
+ : _svc_clobber ); \
+ return (type) __res; \
+}
+
+#define io_syscall1(type,fname,sname,type1,arg1) \
+type fname(type1 arg1) { \
+ register type1 __arg1 asm("2") = arg1; \
+ long __res; \
+ __asm__ __volatile__ ( \
+ " svc %b1\n" \
+ " "__LR" %0,2" \
+ : "=d" (__res) \
+ : "i" (__NR_##sname), \
+ "d" (__arg1) \
+ : _svc_clobber ); \
+ return (type) __res; \
+}
+
+#define io_syscall2(type,fname,sname,type1,arg1,type2,arg2) \
+type fname(type1 arg1, type2 arg2) { \
+ register type1 __arg1 asm("2") = arg1; \
+ register type2 __arg2 asm("3") = arg2; \
+ long __res; \
+ __asm__ __volatile__ ( \
+ " svc %b1\n" \
+ " "__LR" %0,2" \
+ : "=d" (__res) \
+ : "i" (__NR_##sname), \
+ "d" (__arg1), \
+ "d" (__arg2) \
+ : _svc_clobber ); \
+ return (type) __res; \
+}
+
+#define io_syscall3(type,fname,sname,type1,arg1,type2,arg2, \
+ type3,arg3) \
+type fname(type1 arg1, type2 arg2, type3 arg3) { \
+ register type1 __arg1 asm("2") = arg1; \
+ register type2 __arg2 asm("3") = arg2; \
+ register type3 __arg3 asm("4") = arg3; \
+ long __res; \
+ __asm__ __volatile__ ( \
+ " svc %b1\n" \
+ " "__LR" %0,2" \
+ : "=d" (__res) \
+ : "i" (__NR_##sname), \
+ "d" (__arg1), \
+ "d" (__arg2), \
+ "d" (__arg3) \
+ : _svc_clobber ); \
+ return (type) __res; \
+}
+
+#define io_syscall4(type,fname,sname,type1,arg1,type2,arg2, \
+ type3,arg3,type4,arg4) \
+type fname(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \
+ register type1 __arg1 asm("2") = arg1; \
+ register type2 __arg2 asm("3") = arg2; \
+ register type3 __arg3 asm("4") = arg3; \
+ register type4 __arg4 asm("5") = arg4; \
+ long __res; \
+ __asm__ __volatile__ ( \
+ " svc %b1\n" \
+ " "__LR" %0,2" \
+ : "=d" (__res) \
+ : "i" (__NR_##sname), \
+ "d" (__arg1), \
+ "d" (__arg2), \
+ "d" (__arg3), \
+ "d" (__arg4) \
+ : _svc_clobber ); \
+ return (type) __res; \
+}
+
+#define io_syscall5(type,fname,sname,type1,arg1,type2,arg2, \
+ type3,arg3,type4,arg4,type5,arg5) \
+type fname(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \
+ type5 arg5) { \
+ register type1 __arg1 asm("2") = arg1; \
+ register type2 __arg2 asm("3") = arg2; \
+ register type3 __arg3 asm("4") = arg3; \
+ register type4 __arg4 asm("5") = arg4; \
+ register type5 __arg5 asm("6") = arg5; \
+ long __res; \
+ __asm__ __volatile__ ( \
+ " svc %b1\n" \
+ " "__LR" %0,2" \
+ : "=d" (__res) \
+ : "i" (__NR_##sname), \
+ "d" (__arg1), \
+ "d" (__arg2), \
+ "d" (__arg3), \
+ "d" (__arg4), \
+ "d" (__arg5) \
+ : _svc_clobber ); \
+ return (type) __res; \
+}
diff --git a/src/syscall-x86_64.h b/src/syscall-x86_64.h
index 84b2639..9361856 100644
--- a/src/syscall-x86_64.h
+++ b/src/syscall-x86_64.h
@@ -3,3 +3,61 @@
#define __NR_io_getevents 208
#define __NR_io_submit 209
#define __NR_io_cancel 210
+
+#define __syscall_clobber "r11","rcx","memory"
+#define __syscall "syscall"
+
+#define io_syscall1(type,fname,sname,type1,arg1) \
+type fname(type1 arg1) \
+{ \
+long __res; \
+__asm__ volatile (__syscall \
+ : "=a" (__res) \
+ : "0" (__NR_##sname),"D" ((long)(arg1)) : __syscall_clobber ); \
+return __res; \
+}
+
+#define io_syscall2(type,fname,sname,type1,arg1,type2,arg2) \
+type fname(type1 arg1,type2 arg2) \
+{ \
+long __res; \
+__asm__ volatile (__syscall \
+ : "=a" (__res) \
+ : "0" (__NR_##sname),"D" ((long)(arg1)),"S" ((long)(arg2)) : __syscall_clobber ); \
+return __res; \
+}
+
+#define io_syscall3(type,fname,sname,type1,arg1,type2,arg2,type3,arg3) \
+type fname(type1 arg1,type2 arg2,type3 arg3) \
+{ \
+long __res; \
+__asm__ volatile (__syscall \
+ : "=a" (__res) \
+ : "0" (__NR_##sname),"D" ((long)(arg1)),"S" ((long)(arg2)), \
+ "d" ((long)(arg3)) : __syscall_clobber); \
+return __res; \
+}
+
+#define io_syscall4(type,fname,sname,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
+type fname (type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
+{ \
+long __res; \
+__asm__ volatile ("movq %5,%%r10 ;" __syscall \
+ : "=a" (__res) \
+ : "0" (__NR_##sname),"D" ((long)(arg1)),"S" ((long)(arg2)), \
+ "d" ((long)(arg3)),"g" ((long)(arg4)) : __syscall_clobber,"r10" ); \
+return __res; \
+}
+
+#define io_syscall5(type,fname,sname,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
+ type5,arg5) \
+type fname (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \
+{ \
+long __res; \
+__asm__ volatile ("movq %5,%%r10 ; movq %6,%%r8 ; " __syscall \
+ : "=a" (__res) \
+ : "0" (__NR_##sname),"D" ((long)(arg1)),"S" ((long)(arg2)), \
+ "d" ((long)(arg3)),"g" ((long)(arg4)),"g" ((long)(arg5)) : \
+ __syscall_clobber,"r8","r10" ); \
+return __res; \
+}
diff --git a/src/syscall.h b/src/syscall.h
index 88ca7b8..4b8e794 100644
--- a/src/syscall.h
+++ b/src/syscall.h
@@ -23,34 +23,3 @@
#else
#error "add syscall-arch.h"
#endif
-
-
-#define io_syscall1(type, fname, sname, type1, arg1) \
- type fname(type1 arg1) \
- { \
- return syscall(__NR_##sname, arg1); \
- }
-
-#define io_syscall2(type, fname, sname, type1, arg1, type2, arg2) \
- type fname(type1 arg1, type2 arg2) \
- { \
- return syscall(__NR_##sname, arg1, arg2); \
- }
-
-#define io_syscall3(type, fname, sname, type1, arg1, type2, arg2, type3, arg3) \
- type fname(type1 arg1, type2 arg2, type3 arg3) \
- { \
- return syscall(__NR_##sname, arg1, arg2, arg3); \
- }
-
-#define io_syscall4(type, fname, sname, type1, arg1, type2, arg2, type3, arg3, type4, arg4) \
- type fname(type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
- { \
- return syscall(__NR_##sname, arg1, arg2, arg3, arg4); \
- }
-
-#define io_syscall5(type, fname, sname, type1, arg1, type2, arg2, type3, arg3, type4, arg4, type5, arg5) \
- type fname(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \
- { \
- return syscall(__NR_##sname, arg1, arg2, arg3, arg4, arg5); \
- }