diff options
-rw-r--r-- | xen/arch/x86/hvm/svm/svm.c | 3 | ||||
-rw-r--r-- | xen/arch/x86/hvm/vmx/vmx.c | 3 | ||||
-rw-r--r-- | xen/arch/x86/x86_64/compat/traps.c | 3 | ||||
-rw-r--r-- | xen/arch/x86/x86_64/traps.c | 7 |
4 files changed, 14 insertions, 2 deletions
diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c index e52c18cb87..eb8e5779bb 100644 --- a/xen/arch/x86/hvm/svm/svm.c +++ b/xen/arch/x86/hvm/svm/svm.c @@ -759,6 +759,9 @@ static void svm_init_hypercall_page(struct domain *d, void *hypercall_page) for ( i = 0; i < (PAGE_SIZE / 32); i++ ) { + if ( i == __HYPERVISOR_iret ) + continue; + p = (char *)(hypercall_page + (i * 32)); *(u8 *)(p + 0) = 0xb8; /* mov imm32, %eax */ *(u32 *)(p + 1) = i; diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index a99f65b6f8..0e5d3b4e16 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -950,6 +950,9 @@ static void vmx_init_hypercall_page(struct domain *d, void *hypercall_page) for ( i = 0; i < (PAGE_SIZE / 32); i++ ) { + if ( i == __HYPERVISOR_iret ) + continue; + p = (char *)(hypercall_page + (i * 32)); *(u8 *)(p + 0) = 0xb8; /* mov imm32, %eax */ *(u32 *)(p + 1) = i; diff --git a/xen/arch/x86/x86_64/compat/traps.c b/xen/arch/x86/x86_64/compat/traps.c index 6816b0ed6a..21a82b91eb 100644 --- a/xen/arch/x86/x86_64/compat/traps.c +++ b/xen/arch/x86/x86_64/compat/traps.c @@ -367,6 +367,9 @@ static void hypercall_page_initialise_ring1_kernel(void *hypercall_page) for ( i = 0; i < (PAGE_SIZE / 32); i++ ) { + if ( i == __HYPERVISOR_iret ) + continue; + p = (char *)(hypercall_page + (i * 32)); *(u8 *)(p+ 0) = 0xb8; /* mov $<i>,%eax */ *(u32 *)(p+ 1) = i; diff --git a/xen/arch/x86/x86_64/traps.c b/xen/arch/x86/x86_64/traps.c index eec919aebb..bcd760908e 100644 --- a/xen/arch/x86/x86_64/traps.c +++ b/xen/arch/x86/x86_64/traps.c @@ -590,6 +590,9 @@ static void hypercall_page_initialise_ring3_kernel(void *hypercall_page) /* Fill in all the transfer points with template machine code. */ for ( i = 0; i < (PAGE_SIZE / 32); i++ ) { + if ( i == __HYPERVISOR_iret ) + continue; + p = (char *)(hypercall_page + (i * 32)); *(u8 *)(p+ 0) = 0x51; /* push %rcx */ *(u16 *)(p+ 1) = 0x5341; /* push %r11 */ @@ -602,8 +605,8 @@ static void hypercall_page_initialise_ring3_kernel(void *hypercall_page) } /* - * HYPERVISOR_iret is special because it doesn't return and expects a - * special stack frame. Guests jump at this transfer point instead of + * HYPERVISOR_iret is special because it doesn't return and expects a + * special stack frame. Guests jump at this transfer point instead of * calling it. */ p = (char *)(hypercall_page + (__HYPERVISOR_iret * 32)); |