Hello Roland,

I noticed that the order of arguments in /proc/$pid/syscall is reversed
on x86_64 (both 32-bit and 64-bit processes).

I've CCed Ingo and Thomas, because x86-tracehook is now in x86/tip,
IIRC.

The following patch fixes it:

Get syscall arguments for syscall_get_arguments() in correct order on
x86_64.

Signed-off-by: Petr Tesarik <[EMAIL PROTECTED]>

diff --git a/include/asm-x86/syscall.h b/include/asm-x86/syscall.h
index 6f29389..f877d41 100644
--- a/include/asm-x86/syscall.h
+++ b/include/asm-x86/syscall.h
@@ -92,26 +92,26 @@ static inline void syscall_get_arguments(struct task_struct 
*task,
 {
 # ifdef CONFIG_IA32_EMULATION
        if (task_thread_info(task)->status & TS_COMPAT)
-               switch (i + n) {
-               case 6:
+               switch (i) {
+               case 0:
                        if (!n--) break;
-                       *args++ = regs->bp;
-               case 5:
+                       *args++ = regs->bx;
+               case 1:
                        if (!n--) break;
-                       *args++ = regs->di;
-               case 4:
+                       *args++ = regs->cx;
+               case 2:
                        if (!n--) break;
-                       *args++ = regs->si;
+                       *args++ = regs->dx;
                case 3:
                        if (!n--) break;
-                       *args++ = regs->dx;
-               case 2:
+                       *args++ = regs->si;
+               case 4:
                        if (!n--) break;
-                       *args++ = regs->cx;
-               case 1:
+                       *args++ = regs->di;
+               case 5:
                        if (!n--) break;
-                       *args++ = regs->bx;
-               case 0:
+                       *args++ = regs->bp;
+               case 6:
                        if (!n--) break;
                default:
                        BUG();
@@ -119,26 +119,26 @@ static inline void syscall_get_arguments(struct 
task_struct *task,
                }
        else
 # endif
-               switch (i + n) {
-               case 6:
+               switch (i) {
+               case 0:
                        if (!n--) break;
-                       *args++ = regs->r9;
-               case 5:
+                       *args++ = regs->di;
+               case 1:
                        if (!n--) break;
-                       *args++ = regs->r8;
-               case 4:
+                       *args++ = regs->si;
+               case 2:
                        if (!n--) break;
-                       *args++ = regs->r10;
+                       *args++ = regs->dx;
                case 3:
                        if (!n--) break;
-                       *args++ = regs->dx;
-               case 2:
+                       *args++ = regs->r10;
+               case 4:
                        if (!n--) break;
-                       *args++ = regs->si;
-               case 1:
+                       *args++ = regs->r8;
+               case 5:
                        if (!n--) break;
-                       *args++ = regs->di;
-               case 0:
+                       *args++ = regs->r9;
+               case 6:
                        if (!n--) break;
                default:
                        BUG();


Reply via email to