# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID 21d175472d55522cdbecd2a1018ad5eb35e7d487
# Parent 1a5861311b04698744fb426c18a0af48bbdad4c7
This is a fix for some device model corner cases including:
1: mistake sequence of set/clr to virtual IRQ line.
2: wrong sequence of IRQ request clear
3: Add one more place to enable_irq_window.
Signed-off-by: Eddie Dong <eddie.dong@xxxxxxxxx>
diff -r 1a5861311b04 -r 21d175472d55 tools/ioemu/hw/i8259_stub.c
--- a/tools/ioemu/hw/i8259_stub.c Fri Nov 4 10:06:41 2005
+++ b/tools/ioemu/hw/i8259_stub.c Fri Nov 4 10:08:45 2005
@@ -55,13 +55,13 @@
if ( gio->pic_elcr & mask ) {
/* level */
if ( level ) {
+ atomic_clear_bit(irq, &gio->pic_clear_irr);
atomic_set_bit(irq, &gio->pic_irr);
- atomic_clear_bit(irq, &gio->pic_clear_irr);
global_env->send_event = 1;
}
else {
+ atomic_clear_bit(irq, &gio->pic_irr);
atomic_set_bit(irq, &gio->pic_clear_irr);
- atomic_clear_bit(irq, &gio->pic_irr);
global_env->send_event = 1;
}
}
diff -r 1a5861311b04 -r 21d175472d55 xen/arch/x86/dm/i8259.c
--- a/xen/arch/x86/dm/i8259.c Fri Nov 4 10:06:41 2005
+++ b/xen/arch/x86/dm/i8259.c Fri Nov 4 10:08:45 2005
@@ -512,10 +512,10 @@
if ( !plat->interrupt_request )
return -1;
+ plat->interrupt_request = 0;
/* read the irq from the PIC */
intno = pic_read_irq(s);
*type = VLAPIC_DELIV_MODE_EXT;
- plat->interrupt_request = 0;
return intno;
}
diff -r 1a5861311b04 -r 21d175472d55 xen/arch/x86/vmx_io.c
--- a/xen/arch/x86/vmx_io.c Fri Nov 4 10:06:41 2005
+++ b/xen/arch/x86/vmx_io.c Fri Nov 4 10:08:45 2005
@@ -881,6 +881,7 @@
__vmread(VM_ENTRY_INTR_INFO_FIELD, &intr_fields);
if (intr_fields & INTR_INFO_VALID_MASK) {
+ enable_irq_window(cpu_exec_control);
VMX_DBG_LOG(DBG_LEVEL_1, "vmx_intr_assist: intr_fields: %lx",
intr_fields);
return;
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|