From 1c24a96864000887fbaff88072ee481c9c6ddc41 Mon Sep 17 00:00:00 2001 From: John Reiser Date: Sat, 20 May 2000 18:25:54 +0000 Subject: [PATCH] tail order the args for better compressability; special syscall1m for mmap because Z0 and Z1 don't work there. committer: jreiser 958847154 +0000 --- src/stub/linux.hh | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/stub/linux.hh b/src/stub/linux.hh index 83049cd3..c5d4c36a 100644 --- a/src/stub/linux.hh +++ b/src/stub/linux.hh @@ -132,12 +132,12 @@ type name(type1 arg1) \ long __res; \ if (Z1(__NR_##name)) { \ if (Z0(arg1)) { \ - __asm__ __volatile__ ("push %1; popl %0; xorl %%ebx,%%ebx; int $0x80" \ + __asm__ __volatile__ ("xorl %%ebx,%%ebx; push %1; popl %0; int $0x80" \ : "=a" (__res) \ : "g" (__NR_##name) \ : "ebx"); \ } else if (Z1(arg1)) { \ - __asm__ __volatile__ ("push %1; popl %0; push %2; popl %%ebx; int $0x80" \ + __asm__ __volatile__ ("push %2; popl %%ebx; push %1; popl %0; int $0x80" \ : "=a" (__res) \ : "g" (__NR_##name),"g" ((long)(arg1)) \ : "ebx"); \ @@ -154,33 +154,44 @@ type name(type1 arg1) \ return (type) __res; \ } +// special for mmap; somehow Z0(arg1) and Z1(arg1) don't work +#define _syscall1m(type,name,type1,arg1) \ +type name(type1 arg1) \ +{ \ + long __res; \ + __asm__ __volatile__ ("push %1; popl %0; int $0x80" \ + : "=a" (__res) \ + : "g" (__NR_##name),"b" ((long)(arg1))); \ + return (type) __res; \ +} + #define _syscall2(type,name,type1,arg1,type2,arg2) \ type name(type1 arg1,type2 arg2) \ { \ long __res; \ if (Z1(__NR_##name)) { \ if (Z0(arg1) && Z0(arg2)) { \ - __asm__ __volatile__ ("push %1; popl %0; xorl %%ebx,%%ebx; xorl %%ecx,%%ecx; int $0x80" \ + __asm__ __volatile__ ("xorl %%ecx,%%ecx; xorl %%ebx,%%ebx; push %1; popl %0; int $0x80" \ : "=a" (__res) \ : "g" (__NR_##name) \ : "ebx", "ecx"); \ } else if (Z0(arg1) && Z1(arg2)) { \ - __asm__ __volatile__ ("push %1; popl %0; xorl %%ebx,%%ebx; push %2; popl %%ecx; int $0x80" \ + __asm__ __volatile__ ("push %2; popl %%ecx; xorl %%ebx,%%ebx; push %1; popl %0; int $0x80" \ : "=a" (__res) \ : "g" (__NR_##name),"g" ((long)(arg2)) \ : "ebx", "ecx"); \ } else if (Z1(arg1) && Z0(arg2)) { \ - __asm__ __volatile__ ("push %1; popl %0; push %2; popl %%ebx; xorl %%ecx,%%ecx; int $0x80" \ + __asm__ __volatile__ ("xorl %%ecx,%%ecx; push %2; popl %%ebx; push %1; popl %0; int $0x80" \ : "=a" (__res) \ : "g" (__NR_##name),"g" ((long)(arg1)) \ : "ebx", "ecx"); \ } else if (Z1(arg1) && Z1(arg2)) { \ - __asm__ __volatile__ ("push %1; popl %0; push %2; popl %%ebx; push %3; popl %%ecx; int $0x80" \ + __asm__ __volatile__ ("push %3; popl %%ecx; push %2; popl %%ebx; push %1; popl %0; int $0x80" \ : "=a" (__res) \ : "g" (__NR_##name),"g" ((long)(arg1)),"g" ((long)(arg2)) \ : "ebx", "ecx"); \ } else if (Z0(arg1)) { \ - __asm__ __volatile__ ("push %1; popl %0; xorl %%ebx,%%ebx; int $0x80" \ + __asm__ __volatile__ ("xorl %%ebx,%%ebx; push %1; popl %0; int $0x80" \ : "=a" (__res) \ : "g" (__NR_##name),"c" ((long)(arg2)) \ : "ebx"); \ @@ -253,7 +264,7 @@ static inline _syscall0(pid_t,getpid) static inline _syscall2(int,getrusage,int,who,struct rusage *,usage); static inline _syscall2(int,gettimeofday,struct timeval *,tv,void *,tz) static inline _syscall3(off_t,lseek,int,fd,off_t,offset,int,whence) -static inline _syscall1(caddr_t,mmap,const int *,args) +static inline _syscall1m(caddr_t,mmap,const int *,args) static inline _syscall3(int,mprotect,void *,addr,size_t,len,int,prot) static inline _syscall3(int,msync,const void *,start,size_t,length,int,flags) static inline _syscall2(int,munmap,void *,start,size_t,length)