diff -r 5eaec8296a22 xen/arch/x86/hvm/vmx/vmcs.c --- a/xen/arch/x86/hvm/vmx/vmcs.c Sun Jul 06 20:16:24 2008 +0100 +++ b/xen/arch/x86/hvm/vmx/vmcs.c Tue Jul 08 18:08:39 2008 +0800 @@ -89,6 +89,7 @@ min = (CPU_BASED_HLT_EXITING | CPU_BASED_INVLPG_EXITING | + CPU_BASED_RDTSC_EXITING | CPU_BASED_CR3_LOAD_EXITING | CPU_BASED_CR3_STORE_EXITING | CPU_BASED_MONITOR_EXITING | diff -r 5eaec8296a22 xen/arch/x86/hvm/vmx/vmx.c --- a/xen/arch/x86/hvm/vmx/vmx.c Sun Jul 06 20:16:24 2008 +0100 +++ b/xen/arch/x86/hvm/vmx/vmx.c Tue Jul 08 18:08:39 2008 +0800 @@ -1374,6 +1374,13 @@ HVMTRACE_LONG_2D(INVLPG, curr, /*invlpga=*/ 0, TRC_PAR_LONG(vaddr)); if ( paging_invlpg(curr, vaddr) ) vpid_sync_vcpu_gva(curr, vaddr); +} + +static void vmx_rdtsc_intercept(struct vcpu *vcpu) +{ + uint64_t tsc; + rdtscll(tsc); + return; } #define CASE_SET_REG(REG, reg) \ @@ -2193,6 +2200,11 @@ vmx_invlpg_intercept(exit_qualification); break; } + case EXIT_REASON_RDTSC: + inst_len = __get_instruction_length(); + __update_guest_eip(inst_len); + vmx_rdtsc_intercept(v); + break; case EXIT_REASON_VMCALL: { int rc;