[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Enable VMX domains on a SMP dom0.
# HG changeset patch # User kaf24@xxxxxxxxxxxxxxxxxxxx # Node ID ce4b630067bb3544bdf3df2e84a451048e97e559 # Parent 50da9b240a1f331374758f92e50cee93fe2d4845 Enable VMX domains on a SMP dom0. Not all vectors go through do_IRQ(). It's possible to look up the handler in the IDT and call that one, but it'll result in two trap frames. Signed-off-by: Xiaofeng Ling <xiaofeng.ling@xxxxxxxxx> Signed-off-by: Arun Sharma <arun.sharma@xxxxxxxxx> diff -r 50da9b240a1f -r ce4b630067bb xen/arch/x86/vmx.c --- a/xen/arch/x86/vmx.c Fri Jul 15 08:30:22 2005 +++ b/xen/arch/x86/vmx.c Fri Jul 15 08:50:48 2005 @@ -1383,6 +1383,53 @@ raise_softirq(SCHEDULE_SOFTIRQ); } +static inline void vmx_vmexit_do_extint(struct cpu_user_regs *regs) +{ + unsigned int vector; + int error; + + asmlinkage void do_IRQ(struct cpu_user_regs *); + void smp_apic_timer_interrupt(struct cpu_user_regs *); + void timer_interrupt(int, void *, struct cpu_user_regs *); + void smp_event_check_interrupt(void); + void smp_invalidate_interrupt(void); + void smp_call_function_interrupt(void); + void smp_spurious_interrupt(struct cpu_user_regs *regs); + void smp_error_interrupt(struct cpu_user_regs *regs); + + if ((error = __vmread(VM_EXIT_INTR_INFO, &vector)) + && !(vector & INTR_INFO_VALID_MASK)) + __vmx_bug(regs); + + vector &= 0xff; + local_irq_disable(); + + switch(vector) { + case LOCAL_TIMER_VECTOR: + smp_apic_timer_interrupt(regs); + break; + case EVENT_CHECK_VECTOR: + smp_event_check_interrupt(); + break; + case INVALIDATE_TLB_VECTOR: + smp_invalidate_interrupt(); + break; + case CALL_FUNCTION_VECTOR: + smp_call_function_interrupt(); + break; + case SPURIOUS_APIC_VECTOR: + smp_spurious_interrupt(regs); + break; + case ERROR_APIC_VECTOR: + smp_error_interrupt(regs); + break; + default: + regs->entry_vector = vector; + do_IRQ(regs); + break; + } +} + static inline void vmx_vmexit_do_mwait(void) { #if VMX_DEBUG @@ -1586,27 +1633,8 @@ break; } case EXIT_REASON_EXTERNAL_INTERRUPT: - { - extern asmlinkage void do_IRQ(struct cpu_user_regs *); - extern void smp_apic_timer_interrupt(struct cpu_user_regs *); - extern void timer_interrupt(int, void *, struct cpu_user_regs *); - unsigned int vector; - - if ((error = __vmread(VM_EXIT_INTR_INFO, &vector)) - && !(vector & INTR_INFO_VALID_MASK)) - __vmx_bug(®s); - - vector &= 0xff; - local_irq_disable(); - - if (vector == LOCAL_TIMER_VECTOR) { - smp_apic_timer_interrupt(®s); - } else { - regs.entry_vector = vector; - do_IRQ(®s); - } - break; - } + vmx_vmexit_do_extint(®s); + break; case EXIT_REASON_PENDING_INTERRUPT: __vmwrite(CPU_BASED_VM_EXEC_CONTROL, MONITOR_CPU_BASED_EXEC_CONTROLS); _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |