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>
This commit is contained in:
Roland McGrath 2008-10-13 18:40:04 -07:00 committed by Ingo Molnar
parent aef8f5b8c2
commit 746e7cef1b
1 changed files with 74 additions and 72 deletions

View File

@ -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:
if (!n--) break;
*args++ = regs->bp;
case 5:
if (!n--) break;
*args++ = regs->di;
case 4:
if (!n--) break;
*args++ = regs->si;
case 3:
if (!n--) break;
*args++ = regs->dx;
case 2:
if (!n--) break;
*args++ = regs->cx;
case 1:
switch (i) {
case 0:
if (!n--) break;
*args++ = regs->bx;
case 0:
case 1:
if (!n--) break;
*args++ = regs->cx;
case 2:
if (!n--) break;
*args++ = regs->dx;
case 3:
if (!n--) break;
*args++ = regs->si;
case 4:
if (!n--) break;
*args++ = regs->di;
case 5:
if (!n--) break;
*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:
if (!n--) break;
*args++ = regs->r9;
case 5:
if (!n--) break;
*args++ = regs->r8;
case 4:
if (!n--) break;
*args++ = regs->r10;
case 3:
if (!n--) break;
*args++ = regs->dx;
case 2:
if (!n--) break;
*args++ = regs->si;
case 1:
switch (i) {
case 0:
if (!n--) break;
*args++ = regs->di;
case 0:
case 1:
if (!n--) break;
*args++ = regs->si;
case 2:
if (!n--) break;
*args++ = regs->dx;
case 3:
if (!n--) break;
*args++ = regs->r10;
case 4:
if (!n--) break;
*args++ = regs->r8;
case 5:
if (!n--) break;
*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:
if (!n--) break;
regs->bp = *args++;
case 5:
if (!n--) break;
regs->di = *args++;
case 4:
if (!n--) break;
regs->si = *args++;
case 3:
if (!n--) break;
regs->dx = *args++;
case 2:
if (!n--) break;
regs->cx = *args++;
case 1:
switch (i) {
case 0:
if (!n--) break;
regs->bx = *args++;
case 0:
case 1:
if (!n--) break;
regs->cx = *args++;
case 2:
if (!n--) break;
regs->dx = *args++;
case 3:
if (!n--) break;
regs->si = *args++;
case 4:
if (!n--) break;
regs->di = *args++;
case 5:
if (!n--) break;
regs->bp = *args++;
case 6:
if (!n--) break;
default:
BUG();
break;
}
else
# endif
switch (i + n) {
case 6:
if (!n--) break;
regs->r9 = *args++;
case 5:
if (!n--) break;
regs->r8 = *args++;
case 4:
if (!n--) break;
regs->r10 = *args++;
case 3:
if (!n--) break;
regs->dx = *args++;
case 2:
if (!n--) break;
regs->si = *args++;
case 1:
switch (i) {
case 0:
if (!n--) break;
regs->di = *args++;
case 0:
case 1:
if (!n--) break;
regs->si = *args++;
case 2:
if (!n--) break;
regs->dx = *args++;
case 3:
if (!n--) break;
regs->r10 = *args++;
case 4:
if (!n--) break;
regs->r8 = *args++;
case 5:
if (!n--) break;
regs->r9 = *args++;
case 6:
if (!n--) break;
default:
BUG();
break;
}
}