[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] [HVM] Replace shared-memory PIC state with a set-irq-level hypercall.



# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Node ID 9a6fb3e2f12d17e4b8cf58cd8755135e161562d6
# Parent  6f551093f0689c7c914ddfe2ad268bd15aa0ba37
[HVM] Replace shared-memory PIC state with a set-irq-level hypercall.
This simplifies the IRQ logic significantly and avoids the bogus
hvm_pic_assist() on domain resume path.

There is more work to be done here. At least:
 1. set-irq-level should really be set-interrupt-wire-level. Wire
    state needs to be distinguished from PIC (in particular, PIC IRR)
    state.
 2. Hypercalls can be batched in qemu and pushed down in one
    multicall.

Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
 tools/ioemu/target-i386-dm/i8259-dm.c |   42 ------------------
 tools/libxc/xc_misc.c                 |   28 ++++++++++++
 tools/libxc/xenctrl.h                 |    2 
 xen/arch/ia64/vmx/vlsapic.c           |   33 --------------
 xen/arch/ia64/vmx/vmx_init.c          |    5 --
 xen/arch/ia64/vmx/vmx_process.c       |    4 -
 xen/arch/ia64/vmx/vmx_support.c       |   21 ---------
 xen/arch/x86/hvm/hvm.c                |   49 +++++++++++----------
 xen/arch/x86/hvm/i8259.c              |   73 +++++--------------------------
 xen/arch/x86/hvm/svm/intr.c           |   78 ++++++++++++++++------------------
 xen/arch/x86/hvm/vioapic.c            |   26 +----------
 xen/arch/x86/hvm/vmx/io.c             |    3 -
 xen/include/asm-ia64/vlsapic.h        |    1 
 xen/include/asm-ia64/vmx.h            |    2 
 xen/include/asm-ia64/vmx_vpd.h        |    1 
 xen/include/asm-x86/hvm/io.h          |    1 
 xen/include/asm-x86/hvm/vioapic.h     |    2 
 xen/include/asm-x86/hvm/vpic.h        |    3 -
 xen/include/public/hvm/hvm_op.h       |   25 ++++++++++
 xen/include/public/hvm/ioreq.h        |    9 ---
 xen/include/public/hvm/params.h       |   16 +-----
 21 files changed, 139 insertions(+), 285 deletions(-)

diff -r 6f551093f068 -r 9a6fb3e2f12d tools/ioemu/target-i386-dm/i8259-dm.c
--- a/tools/ioemu/target-i386-dm/i8259-dm.c     Tue Nov 07 12:31:17 2006 +0000
+++ b/tools/ioemu/target-i386-dm/i8259-dm.c     Tue Nov 07 13:13:52 2006 +0000
@@ -22,58 +22,18 @@
  * THE SOFTWARE.
  */
 #include "vl.h"
-
-/* debug PIC */
-//#define DEBUG_PIC
-
-//#define DEBUG_IRQ_LATENCY
-//#define DEBUG_IRQ_COUNT
-
 #include "xenctrl.h"
 #include <xen/hvm/ioreq.h>
 #include <stdio.h>
 #include "cpu.h"
 #include "cpu-all.h"
 
-extern shared_iopage_t *shared_page;
-
 struct PicState2 {
 };
 
 void pic_set_irq_new(void *opaque, int irq, int level)
 {
-    /* PicState2 *s = opaque; */
-    global_iodata_t  *gio;
-    int  mask;
-
-    gio = &shared_page->sp_global;
-    mask = 1 << irq;
-    if ( gio->pic_elcr & mask ) {
-        /* level */
-       if ( level ) {
-           atomic_clear_bit(irq, &gio->pic_clear_irr);
-           atomic_set_bit(irq, &gio->pic_irr);
-           cpu_single_env->send_event = 1;
-       }
-       else {
-           atomic_clear_bit(irq, &gio->pic_irr);
-           atomic_set_bit(irq, &gio->pic_clear_irr);
-           cpu_single_env->send_event = 1;
-       }
-    }
-    else {
-       /* edge */
-       if ( level ) {
-           if ( (mask & gio->pic_last_irr) == 0 ) { 
-               atomic_set_bit(irq, &gio->pic_irr);
-               atomic_set_bit(irq, &gio->pic_last_irr);
-               cpu_single_env->send_event = 1;
-           }
-       }
-       else {
-           atomic_clear_bit(irq, &gio->pic_last_irr);
-       }
-    }
+    xc_hvm_set_irq_level(xc_handle, domid, irq, level);
 }
 
 /* obsolete function */
diff -r 6f551093f068 -r 9a6fb3e2f12d tools/libxc/xc_misc.c
--- a/tools/libxc/xc_misc.c     Tue Nov 07 12:31:17 2006 +0000
+++ b/tools/libxc/xc_misc.c     Tue Nov 07 13:13:52 2006 +0000
@@ -5,6 +5,7 @@
  */
 
 #include "xc_private.h"
+#include <xen/hvm/hvm_op.h>
 
 int xc_readconsolering(int xc_handle,
                        char **pbuffer,
@@ -89,6 +90,33 @@ int xc_perfc_control(int xc_handle,
     return rc;
 }
 
+int xc_hvm_set_irq_level(int xc_handle, domid_t dom, int irq, int level)
+{
+    DECLARE_HYPERCALL;
+    struct xen_hvm_set_irq_level arg;
+    int rc;
+
+    hypercall.op     = __HYPERVISOR_hvm_op;
+    hypercall.arg[0] = HVMOP_set_irq_level;
+    hypercall.arg[1] = (unsigned long)&arg;
+
+    arg.domid = dom;
+    arg.irq   = irq;
+    arg.level = level;
+
+    if ( mlock(&arg, sizeof(arg)) != 0 )
+    {
+        PERROR("Could not lock memory");
+        return -1;
+    }
+
+    rc = do_xen_hypercall(xc_handle, &hypercall);
+
+    safe_munlock(&arg, sizeof(arg));
+
+    return rc;
+}
+
 /*
  * Local variables:
  * mode: C
diff -r 6f551093f068 -r 9a6fb3e2f12d tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h     Tue Nov 07 12:31:17 2006 +0000
+++ b/tools/libxc/xenctrl.h     Tue Nov 07 13:13:52 2006 +0000
@@ -666,4 +666,6 @@ evtchn_port_t xc_evtchn_pending(int xce_
  */
 int xc_evtchn_unmask(int xce_handle, evtchn_port_t port);
 
+int xc_hvm_set_irq_level(int xce_handle, domid_t dom, int irq, int level);
+
 #endif
diff -r 6f551093f068 -r 9a6fb3e2f12d xen/arch/ia64/vmx/vlsapic.c
--- a/xen/arch/ia64/vmx/vlsapic.c       Tue Nov 07 12:31:17 2006 +0000
+++ b/xen/arch/ia64/vmx/vlsapic.c       Tue Nov 07 13:13:52 2006 +0000
@@ -324,39 +324,6 @@ void vtm_domain_in(VCPU *vcpu)
  */
 
 #ifdef V_IOSAPIC_READY
-/* Assist to check virtual interrupt lines */
-void vmx_virq_line_assist(struct vcpu *v)
-{
-    global_iodata_t *spg = &get_sp(v->domain)->sp_global;
-    uint16_t *virq_line, irqs;
-
-    virq_line = &spg->pic_irr;
-    if (*virq_line) {
-       do {
-           irqs = *(volatile uint16_t*)virq_line;
-       } while ((uint16_t)cmpxchg(virq_line, irqs, 0) != irqs);
-       hvm_vioapic_do_irqs(v->domain, irqs);
-    }
-
-    virq_line = &spg->pic_clear_irr;
-    if (*virq_line) {
-       do {
-           irqs = *(volatile uint16_t*)virq_line;
-       } while ((uint16_t)cmpxchg(virq_line, irqs, 0) != irqs);
-       hvm_vioapic_do_irqs_clear(v->domain, irqs);
-    }
-}
-
-void vmx_virq_line_init(struct domain *d)
-{
-    global_iodata_t *spg = &get_sp(d)->sp_global;
-
-    spg->pic_elcr = 0xdef8; /* Level/Edge trigger mode */
-    spg->pic_irr = 0;
-    spg->pic_last_irr = 0;
-    spg->pic_clear_irr = 0;
-}
-
 int ioapic_match_logical_addr(hvm_vioapic_t *s, int number, uint16_t dest)
 {
     return (VLAPIC_ID(s->lapic_info[number]) == dest);
diff -r 6f551093f068 -r 9a6fb3e2f12d xen/arch/ia64/vmx/vmx_init.c
--- a/xen/arch/ia64/vmx/vmx_init.c      Tue Nov 07 12:31:17 2006 +0000
+++ b/xen/arch/ia64/vmx/vmx_init.c      Tue Nov 07 13:13:52 2006 +0000
@@ -322,8 +322,6 @@ vmx_final_setup_guest(struct vcpu *v)
        vlsapic_reset(v);
        vtm_init(v);
 
-       /* One more step to enable interrupt assist */
-       set_bit(ARCH_VMX_INTR_ASSIST, &v->arch.arch_vmx.flags);
        /* Set up guest 's indicator for VTi domain*/
        set_bit(ARCH_VMX_DOMAIN, &v->arch.arch_vmx.flags);
 }
@@ -457,9 +455,6 @@ void vmx_setup_platform(struct domain *d
        /* initiate spinlock for pass virq */
        spin_lock_init(&d->arch.arch_vmx.virq_assist_lock);
 
-       /* Initialize the virtual interrupt lines */
-       vmx_virq_line_init(d);
-
        /* Initialize iosapic model within hypervisor */
        hvm_vioapic_init(d);
 }
diff -r 6f551093f068 -r 9a6fb3e2f12d xen/arch/ia64/vmx/vmx_process.c
--- a/xen/arch/ia64/vmx/vmx_process.c   Tue Nov 07 12:31:17 2006 +0000
+++ b/xen/arch/ia64/vmx/vmx_process.c   Tue Nov 07 13:13:52 2006 +0000
@@ -209,10 +209,6 @@ void leave_hypervisor_tail(struct pt_reg
 //        if (user_regs != regs)
 //            printk("WARNING: checking pending interrupt in nested 
interrupt!!!\n");
 
-        /* VMX Domain N has other interrupt source, saying DM  */
-        if (test_bit(ARCH_VMX_INTR_ASSIST, &v->arch.arch_vmx.flags))
-                      vmx_intr_assist(v);
-
         /* FIXME: Check event pending indicator, and set
          * pending bit if necessary to inject back to guest.
          * Should be careful about window between this check
diff -r 6f551093f068 -r 9a6fb3e2f12d xen/arch/ia64/vmx/vmx_support.c
--- a/xen/arch/ia64/vmx/vmx_support.c   Tue Nov 07 12:31:17 2006 +0000
+++ b/xen/arch/ia64/vmx/vmx_support.c   Tue Nov 07 13:13:52 2006 +0000
@@ -60,27 +60,6 @@ void vmx_io_assist(struct vcpu *v)
     }
 }
 
-/*
- * VMX domainN has two types of interrupt source: lsapic model within
- * HV, and device model within domain 0 (service OS). There're another
- * pending array in share page, manipulated by device model directly.
- * To conform to VT-i spec, we have to sync pending bits in shared page
- * into VPD. This has to be done before checking pending interrupt at
- * resume to guest. For domain 0, all the interrupt sources come from
- * HV, which then doesn't require this assist.
- */
-void vmx_intr_assist(struct vcpu *v)
-{
-#ifdef V_IOSAPIC_READY
-    /* Confirm virtual interrupt line signals, and set pending bits in vpd */
-    if (spin_trylock(&v->domain->arch.arch_vmx.virq_assist_lock)) {
-        vmx_virq_line_assist(v);
-        spin_unlock(&v->domain->arch.arch_vmx.virq_assist_lock);
-    }
-#endif
-    return;
-}
-
 void vmx_send_assist_req(struct vcpu *v)
 {
     ioreq_t *p;
diff -r 6f551093f068 -r 9a6fb3e2f12d xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c    Tue Nov 07 12:31:17 2006 +0000
+++ b/xen/arch/x86/hvm/hvm.c    Tue Nov 07 13:13:52 2006 +0000
@@ -206,29 +206,6 @@ void pic_irq_request(void *data, int lev
 {
     int *interrupt_request = data;
     *interrupt_request = level;
-}
-
-void hvm_pic_assist(struct vcpu *v)
-{
-    global_iodata_t *spg;
-    u16   *virq_line, irqs;
-    struct hvm_virpic *pic = &v->domain->arch.hvm_domain.vpic;
-
-    spg = &get_sp(v->domain)->sp_global;
-    virq_line  = &spg->pic_clear_irr;
-    if ( *virq_line ) {
-        do {
-            irqs = *(volatile u16*)virq_line;
-        } while ( (u16)cmpxchg(virq_line,irqs, 0) != irqs );
-        do_pic_irqs_clear(pic, irqs);
-    }
-    virq_line  = &spg->pic_irr;
-    if ( *virq_line ) {
-        do {
-            irqs = *(volatile u16*)virq_line;
-        } while ( (u16)cmpxchg(virq_line,irqs, 0) != irqs );
-        do_pic_irqs(pic, irqs);
-    }
 }
 
 u64 hvm_get_guest_time(struct vcpu *v)
@@ -679,6 +656,32 @@ long do_hvm_op(unsigned long op, XEN_GUE
         break;
     }
 
+    case HVMOP_set_irq_level:
+    {
+        struct xen_hvm_set_irq_level op;
+        struct domain *d;
+
+        if ( copy_from_guest(&op, arg, 1) )
+            return -EFAULT;
+
+        if ( !IS_PRIV(current->domain) )
+            return -EPERM;
+
+        d = find_domain_by_id(op.domid);
+        if ( d == NULL )
+            return -ESRCH;
+
+        rc = -EINVAL;
+        if ( is_hvm_domain(d) )
+        {
+            pic_set_irq(&d->arch.hvm_domain.vpic, op.irq, op.level);
+            rc = 0;
+        }
+
+        put_domain(d);
+        break;
+    }
+
     default:
     {
         gdprintk(XENLOG_WARNING, "Bad HVM op %ld.\n", op);
diff -r 6f551093f068 -r 9a6fb3e2f12d xen/arch/x86/hvm/i8259.c
--- a/xen/arch/x86/hvm/i8259.c  Tue Nov 07 12:31:17 2006 +0000
+++ b/xen/arch/x86/hvm/i8259.c  Tue Nov 07 13:13:52 2006 +0000
@@ -152,46 +152,22 @@ void pic_set_xen_irq(void *opaque, int i
     spin_unlock_irqrestore(&s->lock, flags);
 }
 
-void pic_set_irq_new(void *opaque, int irq, int level)
-{
-    struct hvm_virpic *s = opaque;
-    unsigned long flags;
+void pic_set_irq(struct hvm_virpic *s, int irq, int level)
+{
+    unsigned long flags;
+
+    if ( irq < 0 )
+        return;
 
     spin_lock_irqsave(&s->lock, flags);
-    hvm_vioapic_set_irq(current->domain, irq, level);
-    pic_set_irq1(&s->pics[irq >> 3], irq & 7, level);
-    pic_update_irq(s);
+    hvm_vioapic_set_irq(container_of(s, struct domain, arch.hvm_domain.vpic),
+                        irq, level);
+    if ( irq < 16 )
+    {
+        pic_set_irq1(&s->pics[irq >> 3], irq & 7, level);
+        pic_update_irq(s);
+    }
     spin_unlock_irqrestore(&s->lock, flags);
-}
-
-void do_pic_irqs (struct hvm_virpic *s, uint16_t irqs)
-{
-    unsigned long flags;
-
-    spin_lock_irqsave(&s->lock, flags);
-    s->pics[1].irr |= (uint8_t)(irqs >> 8);
-    s->pics[0].irr |= (uint8_t) irqs;
-    hvm_vioapic_do_irqs(current->domain, irqs);
-    pic_update_irq(s);
-    spin_unlock_irqrestore(&s->lock, flags);
-}
-
-void do_pic_irqs_clear (struct hvm_virpic *s, uint16_t irqs)
-{
-    unsigned long flags;
-
-    spin_lock_irqsave(&s->lock, flags);
-    s->pics[1].irr &= ~(uint8_t)(irqs >> 8);
-    s->pics[0].irr &= ~(uint8_t) irqs;
-    hvm_vioapic_do_irqs_clear(current->domain, irqs);
-    pic_update_irq(s);
-    spin_unlock_irqrestore(&s->lock, flags);
-}
-
-/* obsolete function */
-void pic_set_irq(struct hvm_virpic *isa_pic, int irq, int level)
-{
-    pic_set_irq_new(isa_pic, irq, level);
 }
 
 /* acknowledge interrupt 'irq' */
@@ -245,26 +221,6 @@ static int pic_read_irq(struct hvm_virpi
     return intno;
 }
 
-static void update_shared_irr(struct hvm_virpic *s, PicState *c)
-{
-    uint8_t *pl, *pe;
-
-    ASSERT(spin_is_locked(&s->lock));
-
-    get_sp(current->domain)->sp_global.pic_elcr = 
-        s->pics[0].elcr | ((u16)s->pics[1].elcr << 8);
-    pl =(uint8_t*)&get_sp(current->domain)->sp_global.pic_last_irr;
-    pe =(uint8_t*)&get_sp(current->domain)->sp_global.pic_elcr;
-    if ( c == &s->pics[0] ) {
-         *pl = c->last_irr;
-         *pe = c->elcr;
-    }
-    else {
-         *(pl+1) = c->last_irr;
-         *(pe+1) = c->elcr;
-    }
-}
-
 static void pic_reset(void *opaque)
 {
     PicState *s = opaque;
@@ -300,7 +256,6 @@ static void pic_ioport_write(void *opaqu
         if (val & 0x10) {
             /* init */
             pic_reset(s);
-            update_shared_irr(s->pics_state, s);
             /* deassert a pending interrupt */
             s->pics_state->irq_request(s->pics_state->irq_request_opaque, 0);
             s->init_state = 1;
@@ -533,8 +488,6 @@ static int intercept_elcr_io(ioreq_t *p)
         spin_lock_irqsave(&s->lock, flags);
         elcr_ioport_write((void*)&s->pics[p->addr&1],
                 (uint32_t) p->addr, (uint32_t)( data & 0xff));
-        get_sp(current->domain)->sp_global.pic_elcr =
-            s->pics[0].elcr | ((u16)s->pics[1].elcr << 8);
         spin_unlock_irqrestore(&s->lock, flags);
     }
     else {
diff -r 6f551093f068 -r 9a6fb3e2f12d xen/arch/x86/hvm/svm/intr.c
--- a/xen/arch/x86/hvm/svm/intr.c       Tue Nov 07 12:31:17 2006 +0000
+++ b/xen/arch/x86/hvm/svm/intr.c       Tue Nov 07 13:13:52 2006 +0000
@@ -46,12 +46,8 @@ static inline int svm_inject_extint(stru
 static inline int svm_inject_extint(struct vcpu *v, int trap)
 {
     struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb;
-    vintr_t intr;
+    vintr_t intr = vmcb->vintr;
 
-    ASSERT(vmcb);
-
-    /* Save all fields */
-    intr = vmcb->vintr;
     /* Update only relevant fields */    
     intr.fields.irq = 1;
     intr.fields.intr_masking = 1;
@@ -75,11 +71,10 @@ asmlinkage void svm_intr_assist(void)
     int intr_vector = -1;
     int re_injecting = 0;
 
-    ASSERT(vmcb);
-
     /* Check if an Injection is active */
     /* Previous Interrupt delivery caused this Intercept? */
-    if (vmcb->exitintinfo.fields.v && (vmcb->exitintinfo.fields.type == 0)) {
+    if ( vmcb->exitintinfo.fields.v && (vmcb->exitintinfo.fields.type == 0) )
+    {
         v->arch.hvm_svm.saved_irq_vector = vmcb->exitintinfo.fields.vector;
         vmcb->exitintinfo.bytes = 0;
         re_injecting = 1;
@@ -88,70 +83,71 @@ asmlinkage void svm_intr_assist(void)
     /*
      * If event requires injecting then do not inject int.
      */
-    if (unlikely(v->arch.hvm_svm.inject_event)) {
+    if ( unlikely(v->arch.hvm_svm.inject_event) )
+    {
         v->arch.hvm_svm.inject_event = 0;
         return;
     }
 
     /*
-     * create a 'fake' virtual interrupt on to intercept as soon
-     * as the guest _can_ take interrupts
+     * Create a 'fake' virtual interrupt on to intercept as soon
+     * as the guest _can_ take interrupts.
      */
-    if (irq_masked(vmcb->rflags) || vmcb->interrupt_shadow) {
+    if ( irq_masked(vmcb->rflags) || vmcb->interrupt_shadow )
+    {
         vmcb->general1_intercepts |= GENERAL1_INTERCEPT_VINTR;
         svm_inject_extint(v, 0x0); /* actual vector doesn't really matter */
         return;
     }
 
     /* Previous interrupt still pending? */
-    if (vmcb->vintr.fields.irq) {
-//        printk("Re-injecting IRQ from Vintr\n");
+    if ( vmcb->vintr.fields.irq )
+    {
         intr_vector = vmcb->vintr.fields.vector;
         vmcb->vintr.bytes = 0;
         re_injecting = 1;
     }
     /* Pending IRQ saved at last VMExit? */
-    else if ( v->arch.hvm_svm.saved_irq_vector >= 0) {
-//        printk("Re-Injecting saved IRQ\n");
+    else if ( v->arch.hvm_svm.saved_irq_vector >= 0 )
+    {
         intr_vector = v->arch.hvm_svm.saved_irq_vector;
         v->arch.hvm_svm.saved_irq_vector = -1;
         re_injecting = 1;
     }
     /* Now let's check for newer interrrupts  */
-    else {
+    else
+    {
+        if ( (v->vcpu_id == 0) && pt->enabled && pt->pending_intr_nr )
+        {
+            pic_set_irq(pic, pt->irq, 0);
+            pic_set_irq(pic, pt->irq, 1);
+        }
 
-      if ( v->vcpu_id == 0 )
-         hvm_pic_assist(v);
+        if ( v->vcpu_id == 0 )
+        {
+            callback_irq =
+                v->domain->arch.hvm_domain.params[HVM_PARAM_CALLBACK_IRQ];
+            if ( callback_irq != 0 )
+                pic_set_xen_irq(pic, callback_irq,
+                                local_events_need_delivery());
+        }
 
-
-      if ( (v->vcpu_id == 0) && pt->enabled && pt->pending_intr_nr ) {
-          pic_set_irq(pic, pt->irq, 0);
-          pic_set_irq(pic, pt->irq, 1);
-      }
-
-      if (v->vcpu_id == 0) {
-          callback_irq =
-              v->domain->arch.hvm_domain.params[HVM_PARAM_CALLBACK_IRQ];
-          if ( callback_irq != 0)
-              pic_set_xen_irq(pic, callback_irq, local_events_need_delivery());
-      }
-
-      if ( cpu_has_pending_irq(v) )
-          intr_vector = cpu_get_interrupt(v, &intr_type);
-
+        if ( cpu_has_pending_irq(v) )
+            intr_vector = cpu_get_interrupt(v, &intr_type);
     }
 
     /* have we got an interrupt to inject? */
-    if (intr_vector >= 0) {
-        switch (intr_type) {
+    if ( intr_vector >= 0 )
+    {
+        switch ( intr_type )
+        {
         case APIC_DM_EXTINT:
         case APIC_DM_FIXED:
         case APIC_DM_LOWEST:
             /* Re-injecting a PIT interruptt? */
-            if (re_injecting && pt->enabled && 
-                is_periodic_irq(v, intr_vector, intr_type)) {
-                    ++pt->pending_intr_nr;
-            }
+            if ( re_injecting && pt->enabled && 
+                 is_periodic_irq(v, intr_vector, intr_type) )
+                ++pt->pending_intr_nr;
             /* let's inject this interrupt */
             TRACE_3D(TRC_VMX_INTR, v->domain->domain_id, intr_vector, 0);
             svm_inject_extint(v, intr_vector);
diff -r 6f551093f068 -r 9a6fb3e2f12d xen/arch/x86/hvm/vioapic.c
--- a/xen/arch/x86/hvm/vioapic.c        Tue Nov 07 12:31:17 2006 +0000
+++ b/xen/arch/x86/hvm/vioapic.c        Tue Nov 07 13:13:52 2006 +0000
@@ -526,22 +526,6 @@ static void service_ioapic(hvm_vioapic_t
     }
 }
 
-void hvm_vioapic_do_irqs(struct domain *d, uint16_t irqs)
-{
-    hvm_vioapic_t *s = &(d->arch.hvm_domain.vioapic);
-
-    s->irr |= irqs & ~s->imr;
-    service_ioapic(s);
-}
-
-void hvm_vioapic_do_irqs_clear(struct domain *d, uint16_t irqs)
-{
-    hvm_vioapic_t *s = &(d->arch.hvm_domain.vioapic);
-
-    s->irr &= ~irqs;
-    service_ioapic(s);
-}
-
 void hvm_vioapic_set_xen_irq(struct domain *d, int irq, int level)
 {
     hvm_vioapic_t *s = &d->arch.hvm_domain.vioapic;
@@ -565,12 +549,10 @@ void hvm_vioapic_set_irq(struct domain *
     HVM_DBG_LOG(DBG_LEVEL_IOAPIC, "ioapic_set_irq "
       "irq %x level %x\n", irq, level);
 
-    if (irq < 0 || irq >= IOAPIC_NUM_PINS) {
-        printk("ioapic_set_irq irq %x is illegal\n", irq);
-        domain_crash_synchronous();
-    }
-
-    if (!IOAPICEnabled(s) || s->redirtbl[irq].RedirForm.mask)
+    if ( (irq < 0) || (irq >= IOAPIC_NUM_PINS) )
+        return;
+
+    if ( !IOAPICEnabled(s) || s->redirtbl[irq].RedirForm.mask )
         return;
 
     HVM_DBG_LOG(DBG_LEVEL_IOAPIC, "hvm_vioapic_set_irq entry %x "
diff -r 6f551093f068 -r 9a6fb3e2f12d xen/arch/x86/hvm/vmx/io.c
--- a/xen/arch/x86/hvm/vmx/io.c Tue Nov 07 12:31:17 2006 +0000
+++ b/xen/arch/x86/hvm/vmx/io.c Tue Nov 07 13:13:52 2006 +0000
@@ -104,9 +104,6 @@ asmlinkage void vmx_intr_assist(void)
     unsigned long inst_len;
     int    has_ext_irq;
 
-    if ( v->vcpu_id == 0 )
-        hvm_pic_assist(v);
-
     if ( (v->vcpu_id == 0) && pt->enabled && pt->pending_intr_nr ) {
         pic_set_irq(pic, pt->irq, 0);
         pic_set_irq(pic, pt->irq, 1);
diff -r 6f551093f068 -r 9a6fb3e2f12d xen/include/asm-ia64/vlsapic.h
--- a/xen/include/asm-ia64/vlsapic.h    Tue Nov 07 12:31:17 2006 +0000
+++ b/xen/include/asm-ia64/vlsapic.h    Tue Nov 07 13:13:52 2006 +0000
@@ -24,7 +24,6 @@
 #define _LSAPIC_H
 #include <xen/sched.h>
 
-extern void vmx_virq_line_init(struct domain *d);
 extern void vtm_init(struct vcpu *vcpu);
 extern void vtm_set_itc(struct  vcpu *vcpu, uint64_t new_itc);
 extern void vtm_set_itm(struct vcpu *vcpu, uint64_t val);
diff -r 6f551093f068 -r 9a6fb3e2f12d xen/include/asm-ia64/vmx.h
--- a/xen/include/asm-ia64/vmx.h        Tue Nov 07 12:31:17 2006 +0000
+++ b/xen/include/asm-ia64/vmx.h        Tue Nov 07 13:13:52 2006 +0000
@@ -44,13 +44,11 @@ extern void show_registers(struct pt_reg
 #define show_execution_state show_registers
 extern unsigned long __gpfn_to_mfn_foreign(struct domain *d, unsigned long 
gpfn);
 extern void sync_split_caches(void);
-extern void vmx_virq_line_assist(struct vcpu *v);
 extern void set_privileged_operation_isr (struct vcpu *vcpu,int inst);
 extern void privilege_op (struct vcpu *vcpu);
 extern void set_ifa_itir_iha (struct vcpu *vcpu, u64 vadr,
           int set_ifa, int set_itir, int set_iha);
 extern void inject_guest_interruption(struct vcpu *vcpu, u64 vec);
-extern void vmx_intr_assist(struct vcpu *v);
 extern void set_illegal_op_isr (struct vcpu *vcpu);
 extern void illegal_op (struct vcpu *vcpu);
 extern void vmx_relinquish_guest_resources(struct domain *d);
diff -r 6f551093f068 -r 9a6fb3e2f12d xen/include/asm-ia64/vmx_vpd.h
--- a/xen/include/asm-ia64/vmx_vpd.h    Tue Nov 07 12:31:17 2006 +0000
+++ b/xen/include/asm-ia64/vmx_vpd.h    Tue Nov 07 13:13:52 2006 +0000
@@ -116,7 +116,6 @@ struct arch_vmx_struct {
 #define VMX_DOMAIN(v)   v->arch.arch_vmx.flags
 
 #define ARCH_VMX_IO_WAIT        3       /* Waiting for I/O completion */
-#define ARCH_VMX_INTR_ASSIST    4       /* Need DM's assist to issue intr */
 #define ARCH_VMX_DOMAIN         5       /* Need it to indicate VTi domain */
 
 
diff -r 6f551093f068 -r 9a6fb3e2f12d xen/include/asm-x86/hvm/io.h
--- a/xen/include/asm-x86/hvm/io.h      Tue Nov 07 12:31:17 2006 +0000
+++ b/xen/include/asm-x86/hvm/io.h      Tue Nov 07 13:13:52 2006 +0000
@@ -148,7 +148,6 @@ extern void hvm_interrupt_post(struct vc
 extern void hvm_interrupt_post(struct vcpu *v, int vector, int type);
 extern void hvm_io_assist(struct vcpu *v);
 extern void pic_irq_request(void *data, int level);
-extern void hvm_pic_assist(struct vcpu *v);
 extern int cpu_get_interrupt(struct vcpu *v, int *type);
 extern int cpu_has_pending_irq(struct vcpu *v);
 
diff -r 6f551093f068 -r 9a6fb3e2f12d xen/include/asm-x86/hvm/vioapic.h
--- a/xen/include/asm-x86/hvm/vioapic.h Tue Nov 07 12:31:17 2006 +0000
+++ b/xen/include/asm-x86/hvm/vioapic.h Tue Nov 07 13:13:52 2006 +0000
@@ -104,8 +104,6 @@ typedef struct hvm_vioapic {
 
 hvm_vioapic_t *hvm_vioapic_init(struct domain *d);
 
-void hvm_vioapic_do_irqs_clear(struct domain *d, uint16_t irqs);
-void hvm_vioapic_do_irqs(struct domain *d, uint16_t irqs);
 void hvm_vioapic_set_xen_irq(struct domain *d, int irq, int level);
 void hvm_vioapic_set_irq(struct domain *d, int irq, int level);
 
diff -r 6f551093f068 -r 9a6fb3e2f12d xen/include/asm-x86/hvm/vpic.h
--- a/xen/include/asm-x86/hvm/vpic.h    Tue Nov 07 12:31:17 2006 +0000
+++ b/xen/include/asm-x86/hvm/vpic.h    Tue Nov 07 13:13:52 2006 +0000
@@ -66,7 +66,6 @@ struct hvm_virpic {
 
 void pic_set_xen_irq(void *opaque, int irq, int level);
 void pic_set_irq(struct hvm_virpic *s, int irq, int level);
-void pic_set_irq_new(void *opaque, int irq, int level);
 void pic_init(struct hvm_virpic *s, 
               void (*irq_request)(void *, int),
               void *irq_request_opaque);
@@ -75,7 +74,5 @@ int cpu_get_pic_interrupt(struct vcpu *v
 int cpu_get_pic_interrupt(struct vcpu *v, int *type);
 int is_periodic_irq(struct vcpu *v, int irq, int type);
 int is_irq_enabled(struct vcpu *v, int irq);
-void do_pic_irqs (struct hvm_virpic *s, uint16_t irqs);
-void do_pic_irqs_clear (struct hvm_virpic *s, uint16_t irqs);
 
 #endif  /* __ASM_X86_HVM_VPIC_H__ */  
diff -r 6f551093f068 -r 9a6fb3e2f12d xen/include/public/hvm/ioreq.h
--- a/xen/include/public/hvm/ioreq.h    Tue Nov 07 12:31:17 2006 +0000
+++ b/xen/include/public/hvm/ioreq.h    Tue Nov 07 13:13:52 2006 +0000
@@ -56,14 +56,6 @@ struct ioreq {
 };
 typedef struct ioreq ioreq_t;
 
-struct global_iodata {
-    uint16_t    pic_elcr;
-    uint16_t    pic_irr;
-    uint16_t    pic_last_irr;
-    uint16_t    pic_clear_irr;
-};
-typedef struct global_iodata global_iodata_t;
-
 struct vcpu_iodata {
     struct ioreq         vp_ioreq;
     /* Event channel port */
@@ -72,7 +64,6 @@ typedef struct vcpu_iodata vcpu_iodata_t
 typedef struct vcpu_iodata vcpu_iodata_t;
 
 struct shared_iopage {
-    struct global_iodata sp_global;
     struct vcpu_iodata   vcpu_iodata[1];
 };
 typedef struct shared_iopage shared_iopage_t;
diff -r 6f551093f068 -r 9a6fb3e2f12d xen/include/public/hvm/params.h
--- a/xen/include/public/hvm/params.h   Tue Nov 07 12:31:17 2006 +0000
+++ b/xen/include/public/hvm/params.h   Tue Nov 07 13:13:52 2006 +0000
@@ -1,7 +1,9 @@
 #ifndef __XEN_PUBLIC_HVM_PARAMS_H__
 #define __XEN_PUBLIC_HVM_PARAMS_H__
 
-/* Parameter space. */
+#include "hvm_op.h"
+
+/* Parameter space for HVMOP_{set,get}_param. */
 #define HVM_PARAM_CALLBACK_IRQ 0
 #define HVM_PARAM_STORE_PFN    1
 #define HVM_PARAM_STORE_EVTCHN 2
@@ -10,16 +12,4 @@
 #define HVM_PARAM_BUFIOREQ_PFN 6
 #define HVM_NR_PARAMS          7
 
-/* Get/set subcommands: extra argument == pointer to xen_hvm_param struct. */
-#define HVMOP_set_param 0
-#define HVMOP_get_param 1
-
-struct xen_hvm_param {
-    domid_t domid;     /* IN */
-    uint32_t index;    /* IN */
-    uint64_t value;    /* IN/OUT */
-};
-typedef struct xen_hvm_param xen_hvm_param_t;
-DEFINE_XEN_GUEST_HANDLE(xen_hvm_param_t);
-
 #endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */
diff -r 6f551093f068 -r 9a6fb3e2f12d xen/include/public/hvm/hvm_op.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/include/public/hvm/hvm_op.h   Tue Nov 07 13:13:52 2006 +0000
@@ -0,0 +1,25 @@
+#ifndef __XEN_PUBLIC_HVM_HVM_OP_H__
+#define __XEN_PUBLIC_HVM_HVM_OP_H__
+
+/* Get/set subcommands: extra argument == pointer to xen_hvm_param struct. */
+#define HVMOP_set_param     0
+#define HVMOP_get_param     1
+struct xen_hvm_param {
+    domid_t domid;     /* IN */
+    uint32_t index;    /* IN */
+    uint64_t value;    /* IN/OUT */
+};
+typedef struct xen_hvm_param xen_hvm_param_t;
+DEFINE_XEN_GUEST_HANDLE(xen_hvm_param_t);
+
+/* Set the logical level of one of a domain's IRQ lines. */
+#define HVMOP_set_irq_level 2
+struct xen_hvm_set_irq_level {
+    domid_t  domid;    /* Domain to be updated.          */
+    uint16_t level;    /* New level of the IRQ (0 or 1). */
+    uint32_t irq;      /* IRQ to be updated.             */
+};
+typedef struct xen_hvm_set_irq_level xen_hvm_set_irq_level_t;
+DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_irq_level_t);
+
+#endif /* __XEN_PUBLIC_HVM_HVM_OP_H__ */

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.