diff -r 5b92eed96bd3 drivers/xen/privcmd/privcmd.c --- a/drivers/xen/privcmd/privcmd.c Tue Sep 18 10:08:36 2007 +0100 +++ b/drivers/xen/privcmd/privcmd.c Tue Sep 18 10:21:42 2007 +0100 @@ -69,7 +69,25 @@ static long privcmd_ioctl(struct file *f "popl %%ecx; popl %%ebx" : "=a" (ret) : "0" (&hypercall) : "memory" ); #elif defined (__x86_64__) - if (hypercall.op < (PAGE_SIZE >> 5)) { + if (hypercall.op >= (PAGE_SIZE >> 5)) + break; + + if (test_tsk_thread_flag(current, TIF_IA32)) { + __asm__ __volatile__ ( + "pushq %%rbx; pushq %%rcx; pushq %%rdx; " + "pushq %%rsi; pushq %%rdi; pushq %%rbp; " + "xorq %%rbp,%%rbp ;" + "movl 8(%%rax),%%ebx ;" + "movl 16(%%rax),%%ecx ;" + "movl 24(%%rax),%%edx ;" + "movl 32(%%rax),%%esi ;" + "movl 40(%%rax),%%edi ;" + "movl (%%rax),%%eax ;" + "int $0x83;" + "popq %%rbp; popq %%rdi; popq %%rsi; popq %%rdx; " + "popq %%rcx; popq %%rbx" + : "=a" (ret) : "0" (&hypercall) : "memory" ); + } else { long ign1, ign2, ign3; __asm__ __volatile__ ( "movq %8,%%r10; movq %9,%%r8;"