This patch fixes missing 6th param for 32bit syscalls in i386 and x86_64 
archs.

Note: I have to remove static from syscall32, because gcc messes up with 
inline asm becuase of that.

Signed-off-by: Ildar Muslukhov <[email protected]>

---
 include/syscall.h |  1 +
 syscall.c         | 44 +++++++++++++++++++++++++++++++++++---------
 2 files changed, 36 insertions(+), 9 deletions(-)

diff --git a/include/syscall.h b/include/syscall.h
index 9fc9885..faaeafc 100644
--- a/include/syscall.h
+++ b/include/syscall.h
@@ -134,6 +134,7 @@ void count_syscalls_enabled(void);
 void display_enabled_syscalls(void);
 void disable_non_net_syscalls(void);
 void init_syscalls(void);
+long syscall32(int num_args, unsigned int call, unsigned long a1, unsigned 
long a2, unsigned long a3, unsigned long a4, unsigned long a5, unsigned long 
a6);
 
 #define for_each_32bit_syscall(i) \
        for (i = 0; i < max_nr_32bit_syscalls; i++)
diff --git a/syscall.c b/syscall.c
index 866ac71..63f25a6 100644
--- a/syscall.c
+++ b/syscall.c
@@ -33,22 +33,48 @@
        return (type) (res); \
 } while (0)
 
-static long syscall32(int num_args, unsigned int call,
+long syscall32(int num_args, unsigned int call,
        unsigned long a1, unsigned long a2, unsigned long a3,
-       unsigned long a4, unsigned long a5, __unused__ unsigned long a6)
+       unsigned long a4, unsigned long a5, unsigned long a6)
 {
 #if defined(__i386__) || defined (__x86_64__)
-       if (num_args < 6) {
+
+       if (num_args <= 6) {
                long __res;
-               __asm__ volatile ("int $0x80"
+#if defined( __i386__)
+               __asm__ volatile (
+                       "pushl %%ebp\n\t"
+                       "movl %7, %%ebp\n\t"
+                       "int $0x80\n\t"
+                       "popl %%ebp\n\t"
+                       : "=a" (__res)
+                       : "0" (call),"b" ((long)(a1)),"c" ((long)(a2)),"d" 
((long)(a3)), "S" ((long)(a4)),"D" ((long)(a5)), "g" ((long)(a6))
+                       : "%ebp" /* mark EBP reg as dirty */
+                       );
+#elif defined(__x86_64__)
+               __asm__ volatile (
+                       "pushq %%rbp\n\t"
+                       "movq %7, %%rbp\n\t"
+                       "int $0x80\n\t"
+                       "popq %%rbp\n\t"
                        : "=a" (__res)
-                       : "0" (call),"b" ((long)(a1)),"c" ((long)(a2)),
-                       "d" ((long)(a3)), "S" ((long)(a4)),
-                       "D" ((long)(a5)));
+                       : "0" (call),"b" ((long)(a1)),"c" ((long)(a2)),"d" 
((long)(a3)), "S" ((long)(a4)),"D" ((long)(a5)), "g" ((long)(a6))
+                       : "%rbp" /* mark EBP reg as dirty */
+                       );
+#else
+       //To shut up gcc on unused args. This code should never be reached.
+       __res = 0;
+       UNUSED(num_args);
+       UNUSED(call);
+       UNUSED(a1);
+       UNUSED(a2);
+       UNUSED(a3);
+       UNUSED(a4);
+       UNUSED(a5);
+       UNUSED(a6);
+#endif
                __syscall_return(long,__res);
-               return __res;
        }
-/* TODO: 6 arg 32bit x86 syscall goes here.*/
 #else
 
 // TODO: 32-bit syscall entry for non-x86 archs goes here.
-- 
1.8.4

--
To unsubscribe from this list: send the line "unsubscribe trinity" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to