xen: use iret instruction all the time
Change iret implementation to not be dependent on direct-access vcpu structure. Signed-off-by: Jeremy Fitzhardinge <jeremy@xensource.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
c9cf39ae64
commit
81e103f1f1
@ -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 = {
|
|||||||
.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)
|
|||||||
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)
|
|||||||
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);
|
|||||||
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 */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user