Inject call back irq when there are event pending.
If there are still event pending after dealing with the device
model evtchn, then these are for virtual device(ctrl_if, xenbus,
blfront,etc) so inject the call back irq.
The irq handler in event channel pci device will deliver the event
to frontend driver.
Signed-off-by: Xiaofeng Ling <xiaofeng.ling@xxxxxxxxx>
Signed-off-by: Arun Sharma <arun.sharma@xxxxxxxxx>
diff -r 287d36b46fa3 xen/arch/x86/vmx_io.c
--- a/xen/arch/x86/vmx_io.c Tue Aug 30 20:36:49 2005
+++ b/xen/arch/x86/vmx_io.c Fri Sep 2 22:46:13 2005
@@ -631,6 +631,51 @@
return ((eflags & X86_EFLAGS_IF) == 0);
}
+int vmx_event_to_irq(struct vcpu *v)
+{
+
+ global_iodata_t *spg;
+ unsigned long callback_irq;
+
+ spg = &get_sp(v->domain)->sp_global;
+
+ callback_irq = v->domain->arch.vmx_platform.callback_irq;
+ if(unlikely( callback_irq == 0)) {
+ printk("try to inject callback =0!!!\n");
+ printk("pending: %x, sel: %x, pending[0]:%x\n",
+ v->vcpu_info->evtchn_upcall_pending,
+ v->vcpu_info->evtchn_pending_sel,
+ v->domain->shared_info->evtchn_pending[0]);
+ return 0;
+ }
+
+ /*
+ * the event is only for guest, just set callback interrupt
+ * bit and return
+ */
+
+ return test_and_set_bit(callback_irq, &spg->pic_intr[0]);
+
+}
+
+void vmx_check_guest_event(struct vcpu *v)
+{
+
+ int port = iopacket_port(v->domain);
+
+ if (!v->domain->shared_info->evtchn_pending[port>>5])
+ clear_bit(port>>5, &v->vcpu_info->evtchn_pending_sel);
+
+ /* Note: VMX domains may need upcalls as well */
+ if (!v->vcpu_info->evtchn_pending_sel)
+ v->vcpu_info->evtchn_upcall_pending = 0;
+
+ if(event_pending(v) && !v->vcpu_info->callback_mask &&
+ !test_bit(port, &v->domain->shared_info->evtchn_pending[0]) )
+ vmx_event_to_irq(v);
+}
+
+
asmlinkage void vmx_intr_assist(void)
{
int intr_type = 0;
@@ -640,6 +685,10 @@
highest_vector = find_highest_pending_irq(v, &intr_type);
__vmread(CPU_BASED_VM_EXEC_CONTROL, &cpu_exec_control);
+
+ vmx_check_guest_event(v); /*inject para-device call back irq*/
+
+ highest_vector = find_highest_pending_irq(v, &intr_type);
if (highest_vector == -1) {
disable_irq_window(cpu_exec_control);
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|