mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-06-07 06:32:08 +00:00
hv: cache tsc_offset
Guest write tsc: cache the offset into run_context.tsc_offset; Guest read tsc : use run_context.tsc_offset to calculate guest_tsc. Signed-off-by: Qi Yadong <yadong.qi@intel.com> Acked-by: Eddie Dong <eddie.dong@intel.com>
This commit is contained in:
parent
51414536fa
commit
ef0c5ec2e3
@ -1974,7 +1974,8 @@ vlapic_wrmsr(struct vcpu *vcpu, uint32_t msr, uint64_t val)
|
|||||||
vlapic->last_timer = -1;
|
vlapic->last_timer = -1;
|
||||||
} else {
|
} else {
|
||||||
/* transfer guest tsc to host tsc */
|
/* transfer guest tsc to host tsc */
|
||||||
val -= exec_vmread64(VMX_TSC_OFFSET_FULL);
|
val -= vcpu->arch_vcpu.contexts[vcpu->
|
||||||
|
arch_vcpu.cur_context].tsc_offset;
|
||||||
|
|
||||||
vlapic->last_timer = update_timer(vlapic->last_timer,
|
vlapic->last_timer = update_timer(vlapic->last_timer,
|
||||||
tsc_periodic_time,
|
tsc_periodic_time,
|
||||||
|
@ -192,7 +192,7 @@ int rdmsr_handler(struct vcpu *vcpu)
|
|||||||
case MSR_IA32_TIME_STAMP_COUNTER:
|
case MSR_IA32_TIME_STAMP_COUNTER:
|
||||||
{
|
{
|
||||||
/* Add the TSC_offset to host TSC to get guest TSC */
|
/* Add the TSC_offset to host TSC to get guest TSC */
|
||||||
v = rdtsc() + exec_vmread64(VMX_TSC_OFFSET_FULL);
|
v = rdtsc() + vcpu->arch_vcpu.contexts[cur_context].tsc_offset;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -287,7 +287,8 @@ int wrmsr_handler(struct vcpu *vcpu)
|
|||||||
case MSR_IA32_TIME_STAMP_COUNTER:
|
case MSR_IA32_TIME_STAMP_COUNTER:
|
||||||
{
|
{
|
||||||
/*Caculate TSC offset from changed TSC MSR value*/
|
/*Caculate TSC offset from changed TSC MSR value*/
|
||||||
exec_vmwrite64(VMX_TSC_OFFSET_FULL, v - rdtsc());
|
cur_context->tsc_offset = v - rdtsc();
|
||||||
|
exec_vmwrite64(VMX_TSC_OFFSET_FULL, cur_context->tsc_offset);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -203,11 +203,8 @@ void destroy_secure_world(struct vm *vm)
|
|||||||
|
|
||||||
static void save_world_ctx(struct run_context *context)
|
static void save_world_ctx(struct run_context *context)
|
||||||
{
|
{
|
||||||
/* VMCS Execution field */
|
|
||||||
context->tsc_offset = exec_vmread64(VMX_TSC_OFFSET_FULL);
|
|
||||||
|
|
||||||
/* VMCS GUEST field */
|
/* VMCS GUEST field */
|
||||||
/* CR3, RIP, RSP, RFLAGS already saved on VMEXIT */
|
/* TSC_OFFSET, CR3, RIP, RSP, RFLAGS already saved on VMEXIT */
|
||||||
context->cr0 = exec_vmread(VMX_GUEST_CR0);
|
context->cr0 = exec_vmread(VMX_GUEST_CR0);
|
||||||
context->cr4 = exec_vmread(VMX_GUEST_CR4);
|
context->cr4 = exec_vmread(VMX_GUEST_CR4);
|
||||||
context->dr7 = exec_vmread(VMX_GUEST_DR7);
|
context->dr7 = exec_vmread(VMX_GUEST_DR7);
|
||||||
|
@ -481,9 +481,8 @@ static int rdtsc_handler(struct vcpu *vcpu)
|
|||||||
/* Read the host TSC value */
|
/* Read the host TSC value */
|
||||||
CPU_RDTSCP_EXECUTE(&host_tsc, &id);
|
CPU_RDTSCP_EXECUTE(&host_tsc, &id);
|
||||||
|
|
||||||
/* Get the guest TSC offset value from VMCS */
|
/* Get current world's TSC offset */
|
||||||
tsc_offset =
|
tsc_offset = cur_context->tsc_offset;
|
||||||
exec_vmread64(VMX_TSC_OFFSET_FULL);
|
|
||||||
|
|
||||||
/* Update the guest TSC value by following: TSC_guest = TSC_host +
|
/* Update the guest TSC value by following: TSC_guest = TSC_host +
|
||||||
* TSC_guest_Offset
|
* TSC_guest_Offset
|
||||||
@ -509,9 +508,8 @@ static int rdtscp_handler(struct vcpu *vcpu)
|
|||||||
/* Read the host TSC value */
|
/* Read the host TSC value */
|
||||||
CPU_RDTSCP_EXECUTE(&host_tsc, &id);
|
CPU_RDTSCP_EXECUTE(&host_tsc, &id);
|
||||||
|
|
||||||
/* Get the guest TSC offset value from VMCS */
|
/* Get current world's TSC offset */
|
||||||
tsc_offset =
|
tsc_offset = cur_context->tsc_offset;
|
||||||
exec_vmread64(VMX_TSC_OFFSET_FULL);
|
|
||||||
|
|
||||||
/* Update the guest TSC value by following: * TSC_guest = TSC_host +
|
/* Update the guest TSC value by following: * TSC_guest = TSC_host +
|
||||||
* TSC_guest_Offset
|
* TSC_guest_Offset
|
||||||
|
Loading…
Reference in New Issue
Block a user