Commit bf41dcac authored by Cyrill Gorcunov's avatar Cyrill Gorcunov

syscalls: Get rid of register variables

It's been found that gcc 4.1.2 20080704 (Red Hat 4.1.2-48)
ignores register variables so to be on a safe side rewrite
syscalls with inline assembly without them.

nb: gcc version 4.6.1 20110908 (Red Hat 4.6.1-9) (GCC)
compiles them correctly.
Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@gmail.com>
parent 5b6748b4
...@@ -52,14 +52,19 @@ static always_inline long syscall3(int nr, unsigned long arg0, unsigned long arg ...@@ -52,14 +52,19 @@ static always_inline long syscall3(int nr, unsigned long arg0, unsigned long arg
static always_inline long syscall4(int nr, unsigned long arg0, unsigned long arg1, static always_inline long syscall4(int nr, unsigned long arg0, unsigned long arg1,
unsigned long arg2, unsigned long arg3) unsigned long arg2, unsigned long arg3)
{ {
register unsigned long r10 asm("r10") = r10;
long ret; long ret;
asm volatile(
r10 = arg3; "movl %1, %%eax \t\n"
asm volatile("syscall" "movq %2, %%rdi \t\n"
: "=a" (ret) "movq %3, %%rsi \t\n"
: "a" (nr), "D" (arg0), "S" (arg1), "d" (arg2) "movq %4, %%rdx \t\n"
: "memory"); "movq %5, %%r10 \t\n"
"syscall \t\n"
"movq %%rax, %0 \t\n"
: "=r"(ret)
: "g" ((int)nr), "g" (arg0), "g" (arg1), "g" (arg2),
"g" (arg3)
: "rax", "rdi", "rsi", "rdx", "r10", "memory");
return ret; return ret;
} }
...@@ -67,16 +72,20 @@ static long always_inline syscall5(int nr, unsigned long arg0, unsigned long arg ...@@ -67,16 +72,20 @@ static long always_inline syscall5(int nr, unsigned long arg0, unsigned long arg
unsigned long arg2, unsigned long arg3, unsigned long arg2, unsigned long arg3,
unsigned long arg4) unsigned long arg4)
{ {
register unsigned long r10 asm("r10") = r10;
register unsigned long r8 asm("r8") = r8;
long ret; long ret;
asm volatile(
r10 = arg3; "movl %1, %%eax \t\n"
r8 = arg4; "movq %2, %%rdi \t\n"
asm volatile("syscall" "movq %3, %%rsi \t\n"
: "=a" (ret) "movq %4, %%rdx \t\n"
: "a" (nr), "D" (arg0), "S" (arg1), "d" (arg2) "movq %5, %%r10 \t\n"
: "memory"); "movq %6, %%r8 \t\n"
"syscall \t\n"
"movq %%rax, %0 \t\n"
: "=r"(ret)
: "g" ((int)nr), "g" (arg0), "g" (arg1), "g" (arg2),
"g" (arg3), "g" (arg4)
: "rax", "rdi", "rsi", "rdx", "r10", "r8", "memory");
return ret; return ret;
} }
...@@ -84,18 +93,21 @@ static long always_inline syscall6(int nr, unsigned long arg0, unsigned long arg ...@@ -84,18 +93,21 @@ static long always_inline syscall6(int nr, unsigned long arg0, unsigned long arg
unsigned long arg2, unsigned long arg3, unsigned long arg2, unsigned long arg3,
unsigned long arg4, unsigned long arg5) unsigned long arg4, unsigned long arg5)
{ {
register unsigned long r10 asm("r10") = r10;
register unsigned long r8 asm("r8") = r8;
register unsigned long r9 asm("r9") = r9;
long ret; long ret;
asm volatile(
r10 = arg3; "movl %1, %%eax \t\n"
r8 = arg4; "movq %2, %%rdi \t\n"
r9 = arg5; "movq %3, %%rsi \t\n"
asm volatile("syscall" "movq %4, %%rdx \t\n"
: "=a" (ret) "movq %5, %%r10 \t\n"
: "a" (nr), "D" (arg0), "S" (arg1), "d" (arg2) "movq %6, %%r8 \t\n"
: "memory"); "movq %7, %%r9 \t\n"
"syscall \t\n"
"movq %%rax, %0 \t\n"
: "=r"(ret)
: "g" ((int)nr), "g" (arg0), "g" (arg1), "g" (arg2),
"g" (arg3), "g" (arg4), "g" (arg5)
: "rax", "rdi", "rsi", "rdx", "r10", "r8", "r9", "memory");
return ret; return ret;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment