WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] [IA64] Create a vlsapic - viosapic interf

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] [IA64] Create a vlsapic - viosapic interface
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Tue, 08 Apr 2008 02:00:29 -0700
Delivery-date: Tue, 08 Apr 2008 02:00:36 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Alex Williamson <alex.williamson@xxxxxx>
# Date 1204919066 25200
# Node ID d5bcf03596ccdc56828ffd3de1d86ff62d774ade
# Parent  54c7e3798464dfa2e2ba1d725126cceaf935155b
[IA64] Create a vlsapic - viosapic interface

This patch removes duplicated code and create a vlsapic function to
inject any interruption.  Slightly simplifies vlsapic.

It also removes useless irq_save/restore around atomic updates.

Signed-off-by: Tristan Gingold <tgingold@xxxxxxx>
---
 xen/arch/ia64/vmx/viosapic.c   |   34 ++------------
 xen/arch/ia64/vmx/vlsapic.c    |   99 +++++++++++++++++++++--------------------
 xen/include/asm-ia64/vlsapic.h |    6 +-
 3 files changed, 62 insertions(+), 77 deletions(-)

diff -r 54c7e3798464 -r d5bcf03596cc xen/arch/ia64/vmx/viosapic.c
--- a/xen/arch/ia64/vmx/viosapic.c      Fri Mar 07 12:26:27 2008 -0700
+++ b/xen/arch/ia64/vmx/viosapic.c      Fri Mar 07 12:44:26 2008 -0700
@@ -49,36 +49,14 @@ static void viosapic_deliver(struct vios
     uint16_t dest = viosapic->redirtbl[irq].dest_id;
     uint8_t delivery_mode = viosapic->redirtbl[irq].delivery_mode;
     uint8_t vector = viosapic->redirtbl[irq].vector;
-    struct vcpu *v;
 
     ASSERT(spin_is_locked(&viosapic->lock));
-    switch ( delivery_mode )
-    {
-    case SAPIC_FIXED:
-    {
-        v = vlsapic_lid_to_vcpu(viosapic_domain(viosapic), dest);
-        vlsapic_set_irq(v, vector);
-        vcpu_kick(v);
-        break;
-    }
-    case SAPIC_LOWEST_PRIORITY:
-    {
-        v = vlsapic_lid_to_vcpu(viosapic_domain(viosapic), dest);
-        if (viosapic->lowest_vcpu)
-            v = viosapic->lowest_vcpu;
-        vlsapic_set_irq(v, vector);
-        vcpu_kick(v);
-        break;
-    }
-    case SAPIC_PMI:
-    case SAPIC_NMI:
-    case SAPIC_INIT:
-    case SAPIC_EXTINT:
-    default:
-        gdprintk(XENLOG_WARNING, "Unsupported delivery mode %d\n",
-                 delivery_mode);
-        break;
-    }
+
+    if (vlsapic_deliver_int(viosapic_domain (viosapic),
+                            dest, delivery_mode, vector) < 0)
+        gdprintk(XENLOG_WARNING,
+                 "viosapic: can't deliver int %u to %u (dm=%u)\n",
+                 vector, dest, delivery_mode);
 }
 
 
diff -r 54c7e3798464 -r d5bcf03596cc xen/arch/ia64/vmx/vlsapic.c
--- a/xen/arch/ia64/vmx/vlsapic.c       Fri Mar 07 12:26:27 2008 -0700
+++ b/xen/arch/ia64/vmx/vlsapic.c       Fri Mar 07 12:44:26 2008 -0700
@@ -107,7 +107,6 @@ static void update_vhpi(VCPU *vcpu, int 
  */
 static int vmx_vcpu_unpend_interrupt(VCPU *vcpu, uint8_t vector)
 {
-    uint64_t spsr;
     int ret;
 
     if (vector & ~0xff) {
@@ -115,9 +114,7 @@ static int vmx_vcpu_unpend_interrupt(VCP
         return -1;
     }
 
-    local_irq_save(spsr);
     ret = test_and_clear_bit(vector, &VCPU(vcpu, irr[0]));
-    local_irq_restore(spsr);
 
     if (ret) {
         vcpu->arch.irq_new_pending = 1;
@@ -422,16 +419,13 @@ static int irq_masked(VCPU *vcpu, int h_
  */
 int vmx_vcpu_pend_interrupt(VCPU *vcpu, uint8_t vector)
 {
-    uint64_t    spsr;
     int ret;
 
     if (vector & ~0xff) {
         gdprintk(XENLOG_INFO, "vmx_vcpu_pend_interrupt: bad vector\n");
         return -1;
     }
-    local_irq_save(spsr);
     ret = test_and_set_bit(vector, &VCPU(vcpu, irr[0]));
-    local_irq_restore(spsr);
 
     if (!ret) {
         vcpu->arch.irq_new_pending = 1;
@@ -605,16 +599,15 @@ void vmx_vexirq(VCPU *vcpu)
     generate_exirq (vcpu);
 }
 
-struct vcpu * vlsapic_lid_to_vcpu(struct domain *d, uint16_t dest)
-{
-    struct vcpu * v;
-    for_each_vcpu ( d, v ) {
-        if ( (v->arch.privregs->lid >> 16) == dest )
-            return v;
-    }
+struct vcpu *lid_to_vcpu(struct domain *d, uint16_t dest)
+{
+    int id = dest >> 8;
+
+    /* Fast look: assume EID=0 ID=vcpu_id.  */
+    if ((dest & 0xff) == 0 && id < MAX_VIRT_CPUS)
+        return d->vcpu[id];
     return NULL;
 }
-
 
 /*
  * To inject INIT to guest, we must set the PAL_INIT entry 
@@ -641,14 +634,25 @@ static void vmx_inject_guest_pal_init(VC
  *  offset: address offset to IPI space.
  *  value:  deliver value.
  */
-static void vlsapic_deliver_ipi(VCPU *vcpu, uint64_t dm, uint64_t vector)
-{
-    IPI_DPRINTK("deliver_ipi %lx %lx\n", dm, vector);
+static int vcpu_deliver_int(VCPU *vcpu, uint64_t dm, uint64_t vector)
+{
+    int running = vcpu->is_running;
+
+    IPI_DPRINTK("deliver_int %lx %lx\n", dm, vector);
 
     switch (dm) {
     case SAPIC_FIXED:     // INT
         vmx_vcpu_pend_interrupt(vcpu, vector);
         break;
+    case SAPIC_LOWEST_PRIORITY:
+    {
+        struct vcpu *lowest = vcpu_viosapic(vcpu)->lowest_vcpu;
+
+        if (lowest == NULL)
+            lowest = vcpu;
+        vmx_vcpu_pend_interrupt(lowest, vector);
+        break;
+    }
     case SAPIC_PMI:
         // TODO -- inject guest PMI
         panic_domain(NULL, "Inject guest PMI!\n");
@@ -663,9 +667,30 @@ static void vlsapic_deliver_ipi(VCPU *vc
         vmx_vcpu_pend_interrupt(vcpu, 0);
         break;
     default:
-        panic_domain(NULL, "Deliver reserved IPI!\n");
-        break;
-    }
+        return -EINVAL;
+    }
+
+    /* Kick vcpu.  */
+    vcpu_unblock(vcpu);
+    if (running)
+        smp_send_event_check_cpu(vcpu->processor);
+
+    return 0;
+}
+
+int vlsapic_deliver_int(struct domain *d,
+                       uint16_t dest, uint64_t dm, uint64_t vector)
+{
+    VCPU *vcpu;
+
+    vcpu = lid_to_vcpu(d, dest);
+    if (vcpu == NULL)
+        return -ESRCH;
+
+    if (!vcpu->is_initialised || test_bit(_VPF_down, &vcpu->pause_flags))
+        return -ENOEXEC;
+
+    return vcpu_deliver_int (vcpu, dm, vector);
 }
 
 /*
@@ -673,25 +698,8 @@ static void vlsapic_deliver_ipi(VCPU *vc
  */
 void deliver_pal_init(VCPU *vcpu)
 {
-    vlsapic_deliver_ipi(vcpu, SAPIC_INIT, 0);
-}
-
-/*
- * TODO: Use hash table for the lookup.
- */
-static inline VCPU *lid_to_vcpu(struct domain *d, uint8_t id, uint8_t eid)
-{
-    VCPU  *v;
-    LID   lid; 
-
-    for_each_vcpu(d, v) {
-        lid.val = VCPU_LID(v);
-        if (lid.id == id && lid.eid == eid)
-            return v;
-    }
-    return NULL;
-}
-
+    vcpu_deliver_int(vcpu, SAPIC_INIT, 0);
+}
 
 /*
  * execute write IPI op.
@@ -701,7 +709,8 @@ static void vlsapic_write_ipi(VCPU *vcpu
     VCPU   *targ;
     struct domain *d = vcpu->domain; 
 
-    targ = lid_to_vcpu(vcpu->domain, ((ipi_a_t)addr).id, ((ipi_a_t)addr).eid);
+    targ = lid_to_vcpu(vcpu->domain,
+                       (((ipi_a_t)addr).id << 8) | ((ipi_a_t)addr).eid);
     if (targ == NULL)
         panic_domain(NULL, "Unknown IPI cpu\n");
 
@@ -727,12 +736,10 @@ static void vlsapic_write_ipi(VCPU *vcpu
             printk("arch_boot_vcpu: huh, already awake!");
         }
     } else {
-        int running = targ->is_running;
-        vlsapic_deliver_ipi(targ, ((ipi_d_t)value).dm, 
-                            ((ipi_d_t)value).vector);
-        vcpu_unblock(targ);
-        if (running)
-            smp_send_event_check_cpu(targ->processor);
+        if (((ipi_d_t)value).dm == SAPIC_LOWEST_PRIORITY ||
+            vcpu_deliver_int(targ, ((ipi_d_t)value).dm, 
+                             ((ipi_d_t)value).vector) < 0)
+            panic_domain(NULL, "Deliver reserved interrupt!\n");
     }
     return;
 }
diff -r 54c7e3798464 -r d5bcf03596cc xen/include/asm-ia64/vlsapic.h
--- a/xen/include/asm-ia64/vlsapic.h    Fri Mar 07 12:26:27 2008 -0700
+++ b/xen/include/asm-ia64/vlsapic.h    Fri Mar 07 12:44:26 2008 -0700
@@ -70,9 +70,9 @@ extern void vtm_set_itv(struct vcpu *vcp
 extern void vtm_set_itv(struct vcpu *vcpu, uint64_t val);
 extern void vmx_vexirq(struct vcpu  *vcpu);
 extern void vhpi_detection(struct vcpu *vcpu);
-extern int vmx_vcpu_pend_interrupt(VCPU * vcpu, uint8_t vector);
-extern struct vcpu * vlsapic_lid_to_vcpu(struct domain *d, uint16_t dest);
+extern int vlsapic_deliver_int(struct domain *d,
+                              uint16_t dest, uint64_t dm, uint64_t vector);
+
 extern uint64_t vlsapic_read(struct vcpu *v, uint64_t addr, uint64_t s);
 extern void vlsapic_write(struct vcpu *v, uint64_t addr, uint64_t s, uint64_t 
val);
-#define vlsapic_set_irq vmx_vcpu_pend_interrupt
 #endif

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] [IA64] Create a vlsapic - viosapic interface, Xen patchbot-unstable <=