aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoland McGrath <roland@redhat.com>2008-10-13 18:40:04 -0700
committerIngo Molnar <mingo@elte.hu>2008-10-22 16:56:24 +0200
commit746e7cef1b3de5516e07f16a448f0d2a092e3d36 (patch)
treebc995074f9c359351bbf0b1707727a0b76f2f0f4
parentaef8f5b8c2da706cb3efe701e2a35e11221ea5bd (diff)
x86 syscall.h: fix argument order
Petr Tesarik noticed that I'd bungled the syscall_get_arguments code for 64-bit kernels, so it inverted the order of the syscall argument registers. Petr wrote a patch to fix that, and I've amended it to fix the same braino in the syscall_set_arguments code. Original-by: Petr Tesarik <ptesarik@suse.cz> Signed-off-by: Roland McGrath <roland@redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r--include/asm-x86/syscall.h106
1 files changed, 54 insertions, 52 deletions
diff --git a/include/asm-x86/syscall.h b/include/asm-x86/syscall.h
index 04c47dc5597..ec2a95e68e4 100644
--- a/include/asm-x86/syscall.h
+++ b/include/asm-x86/syscall.h
@@ -93,26 +93,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();
@@ -120,26 +120,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();
@@ -154,55 +154,57 @@ static inline void syscall_set_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;
- regs->bp = *args++;
- case 5:
+ regs->bx = *args++;
+ case 1:
if (!n--) break;
- regs->di = *args++;
- case 4:
+ regs->cx = *args++;
+ case 2:
if (!n--) break;
- regs->si = *args++;
+ regs->dx = *args++;
case 3:
if (!n--) break;
- regs->dx = *args++;
- case 2:
+ regs->si = *args++;
+ case 4:
if (!n--) break;
- regs->cx = *args++;
- case 1:
+ regs->di = *args++;
+ case 5:
if (!n--) break;
- regs->bx = *args++;
- case 0:
+ regs->bp = *args++;
+ case 6:
if (!n--) break;
default:
BUG();
+ break;
}
else
# endif
- switch (i + n) {
- case 6:
+ switch (i) {
+ case 0:
if (!n--) break;
- regs->r9 = *args++;
- case 5:
+ regs->di = *args++;
+ case 1:
if (!n--) break;
- regs->r8 = *args++;
- case 4:
+ regs->si = *args++;
+ case 2:
if (!n--) break;
- regs->r10 = *args++;
+ regs->dx = *args++;
case 3:
if (!n--) break;
- regs->dx = *args++;
- case 2:
+ regs->r10 = *args++;
+ case 4:
if (!n--) break;
- regs->si = *args++;
- case 1:
+ regs->r8 = *args++;
+ case 5:
if (!n--) break;
- regs->di = *args++;
- case 0:
+ regs->r9 = *args++;
+ case 6:
if (!n--) break;
default:
BUG();
+ break;
}
}