summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Moyer <jmoyer@redhat.com>2004-02-24 20:17:19 +0000
committerJeff Moyer <jmoyer@redhat.com>2004-02-24 20:17:19 +0000
commit72dbddab6bee0379fe272a9cb3e386666f7cbad5 (patch)
tree380947aed44bf0dddb2edcc269717909c21919fd
parent95d2cfdfeaa8ab6ebb44a455f2c12702429dd294 (diff)
downloadlibaio-72dbddab6bee0379fe272a9cb3e386666f7cbad5.tar.gz
update syscall calling mechanism to be more generic. add -fpic to i386 build. fix s390 build errors for rh9libaio.0-3-97.1
-rw-r--r--libaio.spec12
-rw-r--r--src/Makefile3
-rw-r--r--src/io_queue_wait.c2
-rw-r--r--src/libaio.h2
-rw-r--r--src/syscall-i386.h52
-rw-r--r--src/syscall-ia64.h41
-rw-r--r--src/syscall-ppc.h152
-rw-r--r--src/syscall-s390.h114
-rw-r--r--src/syscall-x86_64.h52
-rw-r--r--src/syscall.h32
10 files changed, 45 insertions, 417 deletions
diff --git a/libaio.spec b/libaio.spec
index 23520f1..7468df4 100644
--- a/libaio.spec
+++ b/libaio.spec
@@ -1,6 +1,6 @@
Name: libaio
-Version: 0.3.96
-Release: 3
+Version: 0.3.97
+Release: 1
Summary: Linux-native asynchronous I/O access library
Copyright: LGPL
Group: System Environment/Libraries
@@ -58,6 +58,14 @@ make install prefix=$RPM_BUILD_ROOT/usr \
%attr(0644,root,root) %{_libdir}/libaio.a
%changelog
+* Tue Feb 24 2004 Jeff Moyer <jmoyer@redhat.com> 0.3.97-1
+- Use libc syscall(2) instead of rolling our own calling mechanism. This
+ change is inspired due to a failure to build with newer gcc, since clobber
+ lists were wrong.
+- Add -fpic to the CFLAGS for all architectures. Should address bz #109457.
+- change a #include from <linux/types.h> to <sys/types.h>. Fixes a build
+ issue on s390.
+
* Wed Jul 7 2003 Bill Nottingham <notting@redhat.com> 0.3.96-3
- fix paths on lib64 arches
diff --git a/src/Makefile b/src/Makefile
index 3d3e6cd..9971d40 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -3,8 +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
-CFLAGS += $(shell if [ "$(ARCH)" != "i386" ] ; then echo -fPIC ; fi)
+CFLAGS := -nostdlib -nostartfiles -Wall -I. -g -fomit-frame-pointer -O2 -fpic
SO_CFLAGS=-shared $(CFLAGS)
L_CFLAGS=$(CFLAGS)
LINK_FLAGS=
diff --git a/src/io_queue_wait.c b/src/io_queue_wait.c
index 89c8072..538d2f3 100644
--- a/src/io_queue_wait.c
+++ b/src/io_queue_wait.c
@@ -17,7 +17,7 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#define NO_SYSCALL_ERRNO
-#include <linux/types.h>
+#include <sys/types.h>
#include <libaio.h>
#include <errno.h>
#include "syscall.h"
diff --git a/src/libaio.h b/src/libaio.h
index a41c296..fd2e626 100644
--- a/src/libaio.h
+++ b/src/libaio.h
@@ -22,7 +22,7 @@
*/
#ifndef __LIBAIO_H
#define __LIBAIO_H
-#include <asm/types.h>
+#include <sys/types.h>
#include <string.h>
struct timespec;
diff --git a/src/syscall-i386.h b/src/syscall-i386.h
index 9c9ea50..266ed93 100644
--- a/src/syscall-i386.h
+++ b/src/syscall-i386.h
@@ -3,55 +3,3 @@
#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 __ret; \
- __asm__ __volatile__("int $0x80" : "=a" (__ret) : \
- "0" (__NR_##sname), "b" (arg1)); \
- return __ret; \
- }
-
-#define io_syscall2(type, fname, sname, type1, arg1, type2, arg2) \
- type fname(type1 arg1, type2 arg2) \
- { \
- long __ret; \
- __asm__ __volatile__("int $0x80" : "=a" (__ret) : \
- "0" (__NR_##sname), "b" (arg1), "c" (arg2)); \
- return __ret; \
- }
-
-#define io_syscall3(type, fname, sname, type1, arg1, type2, arg2, type3, arg3) \
- type fname(type1 arg1, type2 arg2, type3 arg3) \
- { \
- long __ret; \
- __asm__ __volatile__("int $0x80" : "=a" (__ret) : \
- "0" (__NR_##sname), "b" (arg1), "c" (arg2), \
- "d" (arg3) \
- ); \
- return __ret; \
- }
-
-#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 __ret; \
- __asm__ __volatile__("int $0x80" : "=a" (__ret) : \
- "0" (__NR_##sname), "b" (arg1), "c" (arg2), \
- "d" (arg3), "S" (arg4) \
- ); \
- return __ret; \
- }
-
-#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 __ret; \
- __asm__ __volatile__("int $0x80" : "=a" (__ret) : \
- "0" (__NR_##sname), "b" (arg1), "c" (arg2), \
- "d" (arg3), "S" (arg4), "D" (arg5) \
- ); \
- return __ret; \
- }
-
diff --git a/src/syscall-ia64.h b/src/syscall-ia64.h
index 1bba742..a21e93b 100644
--- a/src/syscall-ia64.h
+++ b/src/syscall-ia64.h
@@ -3,44 +3,3 @@
#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 ae26166..dcfb118 100644
--- a/src/syscall-ppc.h
+++ b/src/syscall-ppc.h
@@ -3,155 +3,3 @@
#define __NR_io_getevents 229
#define __NR_io_submit 230
#define __NR_io_cancel 231
-
-#define __syscall_return(type) \
- return (__sc_err & 0x10000000 ? errno = __sc_ret, __sc_ret = -1 : 0), \
- (type) __sc_ret
-
-#define __syscall_clobbers \
- "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
-
-#define io_syscall1(type,fname,sname,type1,arg1) \
-type fname(type1 arg1) \
-{ \
- unsigned long __sc_ret, __sc_err; \
- { \
- register unsigned long __sc_0 __asm__ ("r0"); \
- register unsigned long __sc_3 __asm__ ("r3"); \
- \
- __sc_3 = (unsigned long) (arg1); \
- __sc_0 = __NR_##sname; \
- __asm__ __volatile__ \
- ("sc \n\t" \
- "mfcr %1 " \
- : "=&r" (__sc_3), "=&r" (__sc_0) \
- : "0" (__sc_3), "1" (__sc_0) \
- : __syscall_clobbers); \
- __sc_ret = __sc_3; \
- __sc_err = __sc_0; \
- } \
- if ( __sc_err & 0x10000000 ) return -((int)__sc_ret); \
- return (type) __sc_ret; \
-}
-
-#define io_syscall2(type,fname,sname,type1,arg1,type2,arg2) \
-type fname(type1 arg1, type2 arg2) \
-{ \
- 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"); \
- \
- __sc_3 = (unsigned long) (arg1); \
- __sc_4 = (unsigned long) (arg2); \
- __sc_0 = __NR_##sname; \
- __asm__ __volatile__ \
- ("sc \n\t" \
- "mfcr %1 " \
- : "=&r" (__sc_3), "=&r" (__sc_0) \
- : "0" (__sc_3), "1" (__sc_0), \
- "r" (__sc_4) \
- : __syscall_clobbers); \
- __sc_ret = __sc_3; \
- __sc_err = __sc_0; \
- } \
- if ( __sc_err & 0x10000000 ) return -((int)__sc_ret); \
- return (type) __sc_ret; \
-}
-
-#define io_syscall3(type,fname,sname,type1,arg1,type2,arg2,type3,arg3) \
-type fname(type1 arg1, type2 arg2, type3 arg3) \
-{ \
- 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"); \
- \
- __sc_3 = (unsigned long) (arg1); \
- __sc_4 = (unsigned long) (arg2); \
- __sc_5 = (unsigned long) (arg3); \
- __sc_0 = __NR_##sname; \
- __asm__ __volatile__ \
- ("sc \n\t" \
- "mfcr %1 " \
- : "=&r" (__sc_3), "=&r" (__sc_0) \
- : "0" (__sc_3), "1" (__sc_0), \
- "r" (__sc_4), \
- "r" (__sc_5) \
- : __syscall_clobbers); \
- __sc_ret = __sc_3; \
- __sc_err = __sc_0; \
- } \
- if ( __sc_err & 0x10000000 ) return -((int)__sc_ret); \
- return (type) __sc_ret; \
-}
-
-#define io_syscall4(type,fname,sname,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
-type fname(type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
-{ \
- 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"); \
- \
- __sc_3 = (unsigned long) (arg1); \
- __sc_4 = (unsigned long) (arg2); \
- __sc_5 = (unsigned long) (arg3); \
- __sc_6 = (unsigned long) (arg4); \
- __sc_0 = __NR_##sname; \
- __asm__ __volatile__ \
- ("sc \n\t" \
- "mfcr %1 " \
- : "=&r" (__sc_3), "=&r" (__sc_0) \
- : "0" (__sc_3), "1" (__sc_0), \
- "r" (__sc_4), \
- "r" (__sc_5), \
- "r" (__sc_6) \
- : __syscall_clobbers); \
- __sc_ret = __sc_3; \
- __sc_err = __sc_0; \
- } \
- if ( __sc_err & 0x10000000 ) return -((int)__sc_ret); \
- return (type) __sc_ret; \
-}
-
-#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) \
-{ \
- 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"); \
- \
- __sc_3 = (unsigned long) (arg1); \
- __sc_4 = (unsigned long) (arg2); \
- __sc_5 = (unsigned long) (arg3); \
- __sc_6 = (unsigned long) (arg4); \
- __sc_7 = (unsigned long) (arg5); \
- __sc_0 = __NR_##sname; \
- __asm__ __volatile__ \
- ("sc \n\t" \
- "mfcr %1 " \
- : "=&r" (__sc_3), "=&r" (__sc_0) \
- : "0" (__sc_3), "1" (__sc_0), \
- "r" (__sc_4), \
- "r" (__sc_5), \
- "r" (__sc_6), \
- "r" (__sc_7) \
- : __syscall_clobbers); \
- __sc_ret = __sc_3; \
- __sc_err = __sc_0; \
- } \
- if ( __sc_err & 0x10000000 ) return -((int)__sc_ret); \
- return (type) __sc_ret; \
-}
diff --git a/src/syscall-s390.h b/src/syscall-s390.h
index 515c217..f0805f5 100644
--- a/src/syscall-s390.h
+++ b/src/syscall-s390.h
@@ -3,117 +3,3 @@
#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 fd301a4..84b2639 100644
--- a/src/syscall-x86_64.h
+++ b/src/syscall-x86_64.h
@@ -3,55 +3,3 @@
#define __NR_io_getevents 208
#define __NR_io_submit 209
#define __NR_io_cancel 210
-
-#define io_syscall1(type, fname, sname, type1, arg1) \
- type fname(type1 arg1) \
- { \
- long __ret; \
- __asm__ __volatile__("syscall" : "=a" (__ret) : \
- "0" (__NR_##sname), "D" (arg1)); \
- return __ret; \
- }
-
-#define io_syscall2(type, fname, sname, type1, arg1, type2, arg2) \
- type fname(type1 arg1, type2 arg2) \
- { \
- long __ret; \
- __asm__ __volatile__("syscall" : "=a" (__ret) : \
- "0" (__NR_##sname), "D" (arg1), "S" (arg2)); \
- return __ret; \
- }
-
-#define io_syscall3(type, fname, sname, type1, arg1, type2, arg2, type3, arg3) \
- type fname(type1 arg1, type2 arg2, type3 arg3) \
- { \
- long __ret; \
- __asm__ __volatile__("syscall" : "=a" (__ret) : \
- "0" (__NR_##sname), "D" (arg1), "S" (arg2), \
- "d" (arg3) \
- ); \
- return __ret; \
- }
-
-#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 __ret; \
- __asm__ __volatile__("movq %5,%%r10 ; syscall" : "=a" (__ret) : \
- "0" (__NR_##sname), "D" (arg1), "S" (arg2), \
- "d" (arg3), "g" (arg4) \
- ); \
- return __ret; \
- }
-
-#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 __ret; \
- __asm__ __volatile__("movq %5,%%r10 ; movq %6,%%r8 ; syscall" : "=a" (__ret) : \
- "0" (__NR_##sname), "D" (arg1), "S" (arg2), \
- "d" (arg3), "g" (arg4), "g" (arg5) \
- ); \
- return __ret; \
- }
-
diff --git a/src/syscall.h b/src/syscall.h
index e1edf80..fab279a 100644
--- a/src/syscall.h
+++ b/src/syscall.h
@@ -1,3 +1,5 @@
+#include <sys/syscall.h>
+
#define _SYMSTR(str) #str
#define SYMSTR(str) _SYMSTR(str)
@@ -21,3 +23,33 @@
#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); \
+ }