# 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
|