mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-09-21 08:50:27 +00:00
hv: fix tsc_deadline correctness issue
Fix tsc_deadline issue by trapping TSC_DEADLINE msr write if VMX_TSC_OFFSET is not 0. Because there is an assupmtion in the ACRN vART design that pTSC_Adjust and vTSC_Adjust are both 0. We can leave the TSC_DEADLINE write pass-through without correctness issue becuase there is no offset between the pTSC and vTSC, and there is no write to vTSC or vTSC_Adjust write observed in the RTOS so far. This commit fix the potential correctness issue, but the RT performance will be badly affected if vTSC or vTSC_Adjust was not zero, which we will address if such case happened. Tracked-On: #3636 Signed-off-by: Yan, Like <like.yan@intel.com> Acked-by: Eddie Dong <eddie.dong@intel.com>
This commit is contained in:
committed by
ACRN System Integration
parent
3f84acda09
commit
f15a3600ec
@@ -427,7 +427,9 @@ static void vlapic_icrtmr_write_handler(struct acrn_vlapic *vlapic)
|
||||
uint64_t vlapic_get_tsc_deadline_msr(const struct acrn_vlapic *vlapic)
|
||||
{
|
||||
uint64_t ret;
|
||||
if (!vlapic_lvtt_tsc_deadline(vlapic)) {
|
||||
if (is_lapic_pt_enabled(vlapic->vcpu)) {
|
||||
ret = msr_read(MSR_IA32_TSC_DEADLINE) + exec_vmread64(VMX_TSC_OFFSET_FULL);
|
||||
} else if (!vlapic_lvtt_tsc_deadline(vlapic)) {
|
||||
ret = 0UL;
|
||||
} else {
|
||||
ret = (vlapic->vtimer.timer.fire_tsc == 0UL) ? 0UL :
|
||||
@@ -443,7 +445,11 @@ void vlapic_set_tsc_deadline_msr(struct acrn_vlapic *vlapic, uint64_t val_arg)
|
||||
struct hv_timer *timer;
|
||||
uint64_t val = val_arg;
|
||||
|
||||
if (vlapic_lvtt_tsc_deadline(vlapic)) {
|
||||
if (is_lapic_pt_enabled(vlapic->vcpu)) {
|
||||
vcpu_set_guest_msr(vlapic->vcpu, MSR_IA32_TSC_DEADLINE, val);
|
||||
val -= exec_vmread64(VMX_TSC_OFFSET_FULL);
|
||||
msr_write(MSR_IA32_TSC_DEADLINE, val);
|
||||
} else if (vlapic_lvtt_tsc_deadline(vlapic)) {
|
||||
vcpu_set_guest_msr(vlapic->vcpu, MSR_IA32_TSC_DEADLINE, val);
|
||||
|
||||
timer = &vlapic->vtimer.timer;
|
||||
@@ -461,6 +467,8 @@ void vlapic_set_tsc_deadline_msr(struct acrn_vlapic *vlapic, uint64_t val_arg)
|
||||
} else {
|
||||
timer->fire_tsc = 0UL;
|
||||
}
|
||||
} else {
|
||||
/* No action required */
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user