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

[Xen-changelog] Enable TSC-offsetting capability to ensure that VMX



# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID 2c0b3b8077564205640952f8919e39ee05872cfd
# Parent  5a7baecb1c70a0fb583a87dd9e22858e541da099
Enable TSC-offsetting capability to ensure that VMX
guest's TSC remains in sync with virtual-PIT interrupts.
This avoids the following message from full-virt Linux:
       "Losing too many ticks!
        TSC cannot be used as a timesource. =20
        Possible reasons for this are:
          You're running with Speedstep,
        ......"

Signed-off-by: Eddie Dong <eddie.dong@xxxxxxxxx>
Signed-off-by: Edwin Zhai <edwin.zhai@xxxxxxxxx>

diff -r 5a7baecb1c70 -r 2c0b3b807756 xen/arch/x86/vmx_intercept.c
--- a/xen/arch/x86/vmx_intercept.c      Sun Oct 23 15:51:47 2005
+++ b/xen/arch/x86/vmx_intercept.c      Sun Oct 23 15:54:51 2005
@@ -254,6 +254,8 @@
                    vpit->init_val);
             vpit->period = 1000000;
         }
+         vpit->period_cycles = (u64)vpit->period * cpu_khz / 1000000L;
+         printk("VMX_PIT: guest freq in cycles=%lld\n",(long 
long)vpit->period_cycles);
 
         vpit->channel = ((p->u.data >> 24) & 0x3);
         vpit->first_injected = 0;
diff -r 5a7baecb1c70 -r 2c0b3b807756 xen/arch/x86/vmx_io.c
--- a/xen/arch/x86/vmx_io.c     Sun Oct 23 15:51:47 2005
+++ b/xen/arch/x86/vmx_io.c     Sun Oct 23 15:54:51 2005
@@ -799,6 +799,7 @@
 interrupt_post_injection(struct vcpu * v, int vector, int type)
 {
     struct vmx_virpit *vpit = &(v->domain->arch.vmx_platform.vmx_pit);
+    u64    drift;
 
     switch(type)
     {
@@ -812,6 +813,13 @@
                 vpit->pending_intr_nr--;
             }
             vpit->inject_point = NOW();
+            drift = vpit->period_cycles * vpit->pending_intr_nr;
+            drift = v->arch.arch_vmx.tsc_offset - drift;
+            __vmwrite(TSC_OFFSET, drift);
+
+#if defined (__i386__)
+            __vmwrite(TSC_OFFSET_HIGH, (drift >> 32));
+#endif
  
         }
         break;
diff -r 5a7baecb1c70 -r 2c0b3b807756 xen/include/asm-x86/vmx.h
--- a/xen/include/asm-x86/vmx.h Sun Oct 23 15:51:47 2005
+++ b/xen/include/asm-x86/vmx.h Sun Oct 23 15:54:51 2005
@@ -65,6 +65,7 @@
     CPU_BASED_MWAIT_EXITING | \
     CPU_BASED_MOV_DR_EXITING | \
     CPU_BASED_ACTIVATE_IO_BITMAP | \
+    CPU_BASED_USE_TSC_OFFSETING  | \
     CPU_BASED_UNCOND_IO_EXITING \
     )
 
diff -r 5a7baecb1c70 -r 2c0b3b807756 xen/include/asm-x86/vmx_virpit.h
--- a/xen/include/asm-x86/vmx_virpit.h  Sun Oct 23 15:51:47 2005
+++ b/xen/include/asm-x86/vmx_virpit.h  Sun Oct 23 15:54:51 2005
@@ -19,6 +19,7 @@
 struct vmx_virpit {
     /* for simulation of counter 0 in mode 2*/
     u32 period;                /* pit frequency in ns */
+    u64 period_cycles;                 /* pit frequency in cpu cycles */
     s_time_t scheduled;                 /* scheduled timer interrupt */
     unsigned int channel;  /* the pit channel, counter 0~2 */
     unsigned int pending_intr_nr; /* the couner for pending timer interrupts */
diff -r 5a7baecb1c70 -r 2c0b3b807756 xen/include/asm-x86/vmx_vmcs.h
--- a/xen/include/asm-x86/vmx_vmcs.h    Sun Oct 23 15:51:47 2005
+++ b/xen/include/asm-x86/vmx_vmcs.h    Sun Oct 23 15:54:51 2005
@@ -96,6 +96,7 @@
     struct msr_state        msr_content;
     struct mmio_op          mmio_op;  /* MMIO */
     void                    *io_bitmap_a, *io_bitmap_b;
+    u64                     tsc_offset;
 };
 
 #define vmx_schedule_tail(next)         \

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