Avi Kivity wrote:
> Dong, Eddie wrote:
>> Against lapic2
>> 
>> This is a pre-cleanup for in kernel irqchip live migration support.
>> A guest may not have APIC but still have apic_base_msr be
>> save/restored in current live migration framework.
>> 

Updated.

diff --git a/drivers/kvm/irq.h b/drivers/kvm/irq.h
index 835a41e..700db5e 100644
--- a/drivers/kvm/irq.h
+++ b/drivers/kvm/irq.h
@@ -107,7 +107,6 @@ struct kvm_ioapic {
 struct kvm_lapic {
        spinlock_t lock;        /* TODO for revise */
        u32 status;
-       u64 base_msr;
        unsigned long base_address;
        struct kvm_io_device dev;
        struct {
diff --git a/drivers/kvm/kvm.h b/drivers/kvm/kvm.h
index fc7339f..42b0408 100644
--- a/drivers/kvm/kvm.h
+++ b/drivers/kvm/kvm.h
@@ -320,6 +320,7 @@ struct kvm_vcpu {
        gpa_t hypercall_gpa;
        unsigned long cr4;
        u64 pdptrs[4]; /* pae */
+       u64 apic_base;
        u64 shadow_efer;
        union {
                struct {        /* user irqchip context */
@@ -329,7 +330,6 @@ struct kvm_vcpu {
                        unsigned long irq_summary;
                        DECLARE_BITMAP(irq_pending, KVM_NR_INTERRUPTS);
                        unsigned long cr8;
-                       u64 apic_base;
                };
                struct {        /* kernel irqchip context */
                        struct kvm_lapic *apic;
diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c
index cb244f6..dae8540 100644
--- a/drivers/kvm/kvm_main.c
+++ b/drivers/kvm/kvm_main.c
@@ -631,7 +631,7 @@ EXPORT_SYMBOL_GPL(get_cr8);
 u64 kvm_get_apic_base(struct kvm_vcpu *vcpu)
 {
        if (irqchip_in_kernel(vcpu->kvm))
-               return vcpu->apic->base_msr;
+               return vcpu->apic_base;
        else
                return vcpu->apic_base;
 }
diff --git a/drivers/kvm/lapic.c b/drivers/kvm/lapic.c
index 7f60bf3..ca592b7 100644
--- a/drivers/kvm/lapic.c
+++ b/drivers/kvm/lapic.c
@@ -78,7 +78,7 @@ static inline void apic_clear_vector(int vec, void
*bitmap)
 
 static inline int apic_hw_enabled(struct kvm_lapic *apic)
 {
-       return (apic)->base_msr & MSR_IA32_APICBASE_ENABLE;
+       return (apic)->vcpu->apic_base & MSR_IA32_APICBASE_ENABLE;
 }
 
 static inline int  apic_sw_enabled(struct kvm_lapic *apic)
@@ -728,6 +728,8 @@ void kvm_lapic_set_tpr(struct kvm_vcpu *vcpu,
unsigned long cr8)
 {
        struct kvm_lapic *apic = (struct kvm_lapic *)vcpu->apic;
 
+       if (!apic)
+               return;
        spin_lock_bh(&apic->lock);
        apic_set_tpr(apic, ((cr8 & 0x0f) << 4));
        spin_unlock_bh(&apic->lock);
@@ -738,6 +740,8 @@ u64 kvm_lapic_get_cr8(struct kvm_vcpu *vcpu)
        struct kvm_lapic *apic = (struct kvm_lapic *)vcpu->apic;
        u64 tpr;
 
+       if (!apic)
+               return 0;
        spin_lock_bh(&apic->lock);
        tpr = (u64) apic_get_reg(apic, APIC_TASKPRI);
        spin_unlock_bh(&apic->lock);
@@ -749,16 +753,22 @@ void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64
value)
 {
        struct kvm_lapic *apic = (struct kvm_lapic *)vcpu->apic;
 
+       if (!apic) {
+               value |= MSR_IA32_APICBASE_BSP;
+               vcpu->apic_base = value;
+               return;
+       }
        spin_lock_bh(&apic->lock);
        if (apic->vcpu->vcpu_id)
                value &= ~MSR_IA32_APICBASE_BSP;
 
-       apic->base_msr = value;
-       apic->base_address = apic->base_msr & MSR_IA32_APICBASE_BASE;
+       vcpu->apic_base = value;
+       apic->base_address = apic->vcpu->apic_base &
+                            MSR_IA32_APICBASE_BASE;
 
        /* with FSB delivery interrupt, we can restart APIC
functionality */
        apic_debug("apic base msr is 0x%016" PRIx64 ", and base address
is "
-                  "0x%lx.\n", apic->base_msr, apic->base_address);
+                  "0x%lx.\n", apic->apic_base, apic->base_address);
 
        spin_unlock_bh(&apic->lock);
 }
@@ -769,7 +779,7 @@ u64 kvm_lapic_get_base(struct kvm_vcpu *vcpu)
        u64 base;
 
        spin_lock_bh(&apic->lock);
-       base = apic->base_msr;
+       base = vcpu->apic_base;
        spin_unlock_bh(&apic->lock);
 
        return base;
@@ -817,7 +827,7 @@ static void lapic_reset(struct kvm_vcpu *vcpu)
        apic->timer.pending = 0;
        apic->status = APIC_SW_DISABLE;
        if (vcpu->vcpu_id == 0)
-               apic->base_msr |= MSR_IA32_APICBASE_BSP;
+               vcpu->apic_base |= MSR_IA32_APICBASE_BSP;
        apic_update_ppr(apic);
 
        spin_unlock_bh(&apic->lock);
@@ -825,7 +835,7 @@ static void lapic_reset(struct kvm_vcpu *vcpu)
        apic_debug(KERN_INFO "%s: vcpu=%p, id=%d, base_msr="
                   "0x%016" PRIx64 ", base_address=0x%0lx.\n",
__FUNCTION__,
                   vcpu, GET_APIC_ID(apic_get_reg(apic, APIC_ID)),
-                  apic->base_msr, apic->base_address);
+                  vcpu->apic_base, apic->base_address);
 }
 
 int kvm_lapic_enabled(struct kvm_vcpu *vcpu)
@@ -833,6 +843,8 @@ int kvm_lapic_enabled(struct kvm_vcpu *vcpu)
        struct kvm_lapic *apic = (struct kvm_lapic *)vcpu->apic;
        int ret = 0;
 
+       if (!apic)
+               return 0;
        spin_lock_bh(&apic->lock);
        ret = apic_enabled(apic);
        spin_unlock_bh(&apic->lock);
@@ -840,12 +852,14 @@ int kvm_lapic_enabled(struct kvm_vcpu *vcpu)
        return ret;
 }
 
+/*
 void *kvm_lapic_get_regs(struct kvm_vcpu *vcpu)
 {
        struct kvm_lapic *apic = (struct kvm_lapic *)vcpu->apic;
        return apic->regs;
 }
 EXPORT_SYMBOL_GPL(kvm_lapic_get_regs);
+*/
 
 /*
 
*----------------------------------------------------------------------
@@ -931,7 +945,7 @@ int kvm_create_lapic(struct kvm_vcpu *vcpu)
        hrtimer_init(&apic->timer.dev, CLOCK_MONOTONIC,
HRTIMER_MODE_ABS);
        apic->timer.dev.function = apic_timer_fn;
        apic->base_address = APIC_DEFAULT_PHYS_BASE;
-       apic->base_msr = APIC_DEFAULT_PHYS_BASE;
+       vcpu->apic_base = APIC_DEFAULT_PHYS_BASE;
 
        lapic_reset(vcpu);
        apic->dev.read = apic_mmio_read;
diff --git a/drivers/kvm/svm.c b/drivers/kvm/svm.c

Attachment: live_pre_k2.patch
Description: live_pre_k2.patch

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/
_______________________________________________
kvm-devel mailing list
kvm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-devel

Reply via email to