Commit 81e103f1 authored by Jeremy Fitzhardinge's avatar Jeremy Fitzhardinge Committed by Ingo Molnar

xen: use iret instruction all the time

Change iret implementation to not be dependent on direct-access vcpu
structure.
Signed-off-by: default avatarJeremy Fitzhardinge <jeremy@xensource.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent c9cf39ae
...@@ -890,7 +890,6 @@ void __init xen_setup_vcpu_info_placement(void) ...@@ -890,7 +890,6 @@ void __init xen_setup_vcpu_info_placement(void)
pv_irq_ops.irq_disable = xen_irq_disable_direct; pv_irq_ops.irq_disable = xen_irq_disable_direct;
pv_irq_ops.irq_enable = xen_irq_enable_direct; pv_irq_ops.irq_enable = xen_irq_enable_direct;
pv_mmu_ops.read_cr2 = xen_read_cr2_direct; pv_mmu_ops.read_cr2 = xen_read_cr2_direct;
pv_cpu_ops.iret = xen_iret_direct;
} }
} }
...@@ -994,7 +993,7 @@ static const struct pv_cpu_ops xen_cpu_ops __initdata = { ...@@ -994,7 +993,7 @@ static const struct pv_cpu_ops xen_cpu_ops __initdata = {
.read_tsc = native_read_tsc, .read_tsc = native_read_tsc,
.read_pmc = native_read_pmc, .read_pmc = native_read_pmc,
.iret = (void *)&hypercall_page[__HYPERVISOR_iret], .iret = xen_iret,
.irq_enable_syscall_ret = NULL, /* never called */ .irq_enable_syscall_ret = NULL, /* never called */
.load_tr_desc = paravirt_nop, .load_tr_desc = paravirt_nop,
......
...@@ -135,13 +135,8 @@ ENDPATCH(xen_restore_fl_direct) ...@@ -135,13 +135,8 @@ ENDPATCH(xen_restore_fl_direct)
current stack state in whatever form its in, we keep things current stack state in whatever form its in, we keep things
simple by only using a single register which is pushed/popped simple by only using a single register which is pushed/popped
on the stack. on the stack.
Non-direct iret could be done in the same way, but it would
require an annoying amount of code duplication. We'll assume
that direct mode will be the common case once the hypervisor
support becomes commonplace.
*/ */
ENTRY(xen_iret_direct) ENTRY(xen_iret)
/* test eflags for special cases */ /* test eflags for special cases */
testl $(X86_EFLAGS_VM | XEN_EFLAGS_NMI), 8(%esp) testl $(X86_EFLAGS_VM | XEN_EFLAGS_NMI), 8(%esp)
jnz hyper_iret jnz hyper_iret
...@@ -155,9 +150,9 @@ ENTRY(xen_iret_direct) ...@@ -155,9 +150,9 @@ ENTRY(xen_iret_direct)
GET_THREAD_INFO(%eax) GET_THREAD_INFO(%eax)
movl TI_cpu(%eax),%eax movl TI_cpu(%eax),%eax
movl __per_cpu_offset(,%eax,4),%eax movl __per_cpu_offset(,%eax,4),%eax
lea per_cpu__xen_vcpu_info(%eax),%eax mov per_cpu__xen_vcpu(%eax),%eax
#else #else
movl $per_cpu__xen_vcpu_info, %eax movl per_cpu__xen_vcpu, %eax
#endif #endif
/* check IF state we're restoring */ /* check IF state we're restoring */
......
...@@ -63,5 +63,5 @@ DECL_ASM(void, xen_irq_disable_direct, void); ...@@ -63,5 +63,5 @@ DECL_ASM(void, xen_irq_disable_direct, void);
DECL_ASM(unsigned long, xen_save_fl_direct, void); DECL_ASM(unsigned long, xen_save_fl_direct, void);
DECL_ASM(void, xen_restore_fl_direct, unsigned long); DECL_ASM(void, xen_restore_fl_direct, unsigned long);
void xen_iret_direct(void); void xen_iret(void);
#endif /* XEN_OPS_H */ #endif /* XEN_OPS_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment