From 72dbddab6bee0379fe272a9cb3e386666f7cbad5 Mon Sep 17 00:00:00 2001 From: Jeff Moyer Date: Tue, 24 Feb 2004 20:17:19 +0000 Subject: update syscall calling mechanism to be more generic. add -fpic to i386 build. fix s390 build errors for rh9 --- libaio.spec | 12 +++- src/Makefile | 3 +- src/io_queue_wait.c | 2 +- src/libaio.h | 2 +- src/syscall-i386.h | 52 ------------------ src/syscall-ia64.h | 41 -------------- src/syscall-ppc.h | 152 --------------------------------------------------- src/syscall-s390.h | 114 -------------------------------------- src/syscall-x86_64.h | 52 ------------------ src/syscall.h | 32 +++++++++++ 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 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 to . Fixes a build + issue on s390. + * Wed Jul 7 2003 Bill Nottingham 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 +#include #include #include #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 +#include #include 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 + #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); \ + } -- cgit v1.2.1