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:
parent
aef8f5b8c2
commit
746e7cef1b
1 changed files with 74 additions and 72 deletions
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue