|
|
|
|
|
|
|
|
|
|
xen-changelog
[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
|
<Prev in Thread] |
Current Thread |
[Next in Thread> |
- [Xen-changelog] Enable VMX domains on a SMP dom0.,
Xen patchbot -unstable <=
|
|
|
|
|