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

[Xen-changelog] [xen-3.1-testing] SVM: Treat the vlapic's tpr as the master copy and sync the vtpr to it



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1197633931 0
# Node ID 7f8a28149131ee9cb9894b1b00a1d669d7e402f5
# Parent  17820aa1b2c04091702a3ee86440042e1029c1f5
SVM: Treat the vlapic's tpr as the master copy and sync the vtpr to it
before every vm entry.  This fixes HVM save/restore/migrate, as the
vtpr value was only being synced on guest TPR writes before.

Signed-off-by: Tim Deegan <Tim.Deegan@xxxxxxxxxx>
xen-unstable changeset:   16618:966a6d3b74087474df337e00b31cbecf495b442a
xen-unstable date:        Fri Dec 14 11:50:24 2007 +0000
---
 xen/arch/x86/hvm/svm/intr.c   |    3 ++-
 xen/arch/x86/hvm/svm/svm.c    |   26 ++++++++++++--------------
 xen/arch/x86/hvm/vlapic.c     |    1 -
 xen/arch/x86/hvm/vmx/vmx.c    |    6 ------
 xen/include/asm-x86/hvm/hvm.h |   11 -----------
 5 files changed, 14 insertions(+), 33 deletions(-)

diff -r 17820aa1b2c0 -r 7f8a28149131 xen/arch/x86/hvm/svm/intr.c
--- a/xen/arch/x86/hvm/svm/intr.c       Fri Dec 14 11:58:37 2007 +0000
+++ b/xen/arch/x86/hvm/svm/intr.c       Fri Dec 14 12:05:31 2007 +0000
@@ -83,7 +83,8 @@ static void update_cr8_intercept(
         return;
 
     /* Highest-priority pending interrupt is masked by the TPR? */
-    if ( (vmcb->vintr.fields.tpr & 0xf) >= (max_irr >> 4) )
+    if ( ((vlapic_get_reg(vlapic, APIC_TASKPRI) & 0xF0) >> 4) >=
+         (max_irr >> 4) )
         vmcb->cr_intercepts |= CR_INTERCEPT_CR8_WRITE;
 }
     
diff -r 17820aa1b2c0 -r 7f8a28149131 xen/arch/x86/hvm/svm/svm.c
--- a/xen/arch/x86/hvm/svm/svm.c        Fri Dec 14 11:58:37 2007 +0000
+++ b/xen/arch/x86/hvm/svm/svm.c        Fri Dec 14 12:05:31 2007 +0000
@@ -676,13 +676,6 @@ static void svm_flush_guest_tlbs(void)
     svm_asid_inc_generation();
 }
 
-static void svm_update_vtpr(struct vcpu *v, unsigned long value)
-{
-    struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb;
-
-    vmcb->vintr.fields.tpr = value & 0x0f;
-}
-
 static unsigned long svm_get_ctrl_reg(struct vcpu *v, unsigned int num)
 {
     switch ( num )
@@ -948,6 +941,10 @@ static void svm_do_resume(struct vcpu *v
         /* Migrating to another ASID domain.  Request a new ASID. */
         svm_asid_init_vcpu(v);
     }
+
+    /* Reflect the vlapic's TPR in the hardware vtpr */
+    v->arch.hvm_svm.vmcb->vintr.fields.tpr = 
+        (vlapic_get_reg(vcpu_vlapic(v), APIC_TASKPRI) & 0xFF) >> 4;
 
     hvm_do_resume(v);
     reset_stack_and_jump(svm_asm_do_resume);
@@ -1015,7 +1012,6 @@ static struct hvm_function_table svm_fun
     .update_host_cr3      = svm_update_host_cr3,
     .update_guest_cr3     = svm_update_guest_cr3,
     .flush_guest_tlbs     = svm_flush_guest_tlbs,
-    .update_vtpr          = svm_update_vtpr,
     .stts                 = svm_stts,
     .set_tsc_offset       = svm_set_tsc_offset,
     .inject_exception     = svm_hvm_inject_exception,
@@ -2424,13 +2420,11 @@ asmlinkage void svm_vmexit_handler(struc
 
     /*
      * Before doing anything else, we need to sync up the VLAPIC's TPR with
-     * SVM's vTPR if CR8 writes are currently disabled.  It's OK if the 
-     * guest doesn't touch the CR8 (e.g. 32-bit Windows) because we update
-     * the vTPR on MMIO writes to the TPR
+     * SVM's vTPR. It's OK if the guest doesn't touch CR8 (e.g. 32-bit Windows)
+     * because we update the vTPR on MMIO writes to the TPR.
      */
-    if ( !(vmcb->cr_intercepts & CR_INTERCEPT_CR8_WRITE) )
-        vlapic_set_reg(vcpu_vlapic(v), APIC_TASKPRI,
-                       (vmcb->vintr.fields.tpr & 0x0F) << 4);
+    vlapic_set_reg(vcpu_vlapic(v), APIC_TASKPRI,
+                   (vmcb->vintr.fields.tpr & 0x0F) << 4);
 
     exit_reason = vmcb->exitcode;
 
@@ -2637,6 +2631,10 @@ asmlinkage void svm_vmexit_handler(struc
         domain_crash(v->domain);
         break;
     }
+
+    /* The exit may have updated the TPR: reflect this in the hardware vtpr */
+    vmcb->vintr.fields.tpr = 
+        (vlapic_get_reg(vcpu_vlapic(v), APIC_TASKPRI) & 0xFF) >> 4;
 }
 
 asmlinkage void svm_trace_vmentry(void)
diff -r 17820aa1b2c0 -r 7f8a28149131 xen/arch/x86/hvm/vlapic.c
--- a/xen/arch/x86/hvm/vlapic.c Fri Dec 14 11:58:37 2007 +0000
+++ b/xen/arch/x86/hvm/vlapic.c Fri Dec 14 12:05:31 2007 +0000
@@ -576,7 +576,6 @@ static void vlapic_write(struct vcpu *v,
     {
     case APIC_TASKPRI:
         vlapic_set_reg(vlapic, APIC_TASKPRI, val & 0xff);
-        hvm_update_vtpr(v, (val >> 4) & 0x0f);
         break;
 
     case APIC_EOI:
diff -r 17820aa1b2c0 -r 7f8a28149131 xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c        Fri Dec 14 11:58:37 2007 +0000
+++ b/xen/arch/x86/hvm/vmx/vmx.c        Fri Dec 14 12:05:31 2007 +0000
@@ -1174,11 +1174,6 @@ static void vmx_inject_exception(
         v->arch.hvm_vmx.cpu_cr2 = cr2;
 }
 
-static void vmx_update_vtpr(struct vcpu *v, unsigned long value)
-{
-    /* VMX doesn't have a V_TPR field */
-}
-
 static int vmx_event_injection_faulted(struct vcpu *v)
 {
     unsigned int idtv_info_field;
@@ -1230,7 +1225,6 @@ static struct hvm_function_table vmx_fun
     .update_host_cr3      = vmx_update_host_cr3,
     .update_guest_cr3     = vmx_update_guest_cr3,
     .flush_guest_tlbs     = vmx_flush_guest_tlbs,
-    .update_vtpr          = vmx_update_vtpr,
     .stts                 = vmx_stts,
     .set_tsc_offset       = vmx_set_tsc_offset,
     .inject_exception     = vmx_inject_exception,
diff -r 17820aa1b2c0 -r 7f8a28149131 xen/include/asm-x86/hvm/hvm.h
--- a/xen/include/asm-x86/hvm/hvm.h     Fri Dec 14 11:58:37 2007 +0000
+++ b/xen/include/asm-x86/hvm/hvm.h     Fri Dec 14 12:05:31 2007 +0000
@@ -129,11 +129,6 @@ struct hvm_function_table {
     void (*flush_guest_tlbs)(void);
 
     /*
-     * Reflect the virtual APIC's value in the guest's V_TPR register
-     */
-    void (*update_vtpr)(struct vcpu *v, unsigned long value);
-
-    /*
      * Update specifics of the guest state:
      * 1) TS bit in guest cr0 
      * 2) TSC offset in guest
@@ -228,12 +223,6 @@ hvm_update_host_cr3(struct vcpu *v)
 hvm_update_host_cr3(struct vcpu *v)
 {
     hvm_funcs.update_host_cr3(v);
-}
-
-static inline void
-hvm_update_vtpr(struct vcpu *v, unsigned long value)
-{
-    hvm_funcs.update_vtpr(v, value);
 }
 
 void hvm_update_guest_cr3(struct vcpu *v, unsigned long guest_cr3);

_______________________________________________
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®.