KVM VMX changes for 7.2

- Fix a largely benign bug where KVM TDX would incorrectly state it could
    emulate several x2APIC MSRs.
 
  - Use the "safe" WRMSR API when proxying LBR MSR writes as the to-be-written
    value is guest controlled and completely unvalidated.
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEEKTobbabEP7vbhhN9OlYIJqCjN/0FAmorRMoACgkQOlYIJqCj
 N/2G7hAApCZFvkg2WXBZUxzl4iD17IF0CYk0CTNCY11xLghkSprvPviVSrHfj+lH
 dLA5cCmngKkoK/6MgvPwDIfEg2Owhv3vBEIVmJTCkDZ4I5312LE6QYwtBvEY/iX3
 BthUMhmWpnsmZUFRkQFHZJt3bcCo9oVjD50txSKHzvstZzXiZfOeR9gXE5h5rX6h
 4yu5dd4c0/vdmCKfbzB4hNW6XbBIYd9q5xJWrycmpXKhx4hPp4V5DmmUwHUTRgXx
 7xy4TBrG+R7pfkvVpfwLj9AErS5YUpM99dqA1a9H3J/yEOxHTR5oDixTxtm+9DNR
 XSQ4Fh2ZPk+IZ4lPVdkoEhqKPUkz3ho+UcrctS6JPs+lcQpUDBnuNtdLsKI7MznH
 rjFv19AJHv8/Ayy6OigYAMirRC19RxgAU9EeuA3wbG3iKpo/3SZV3ZtuJJrOi5pF
 S5zOH2oOnNPlgP/la24vI9RiahtXwXDoMrOWEqICr5ESYEMrhfItWXPJK2j+WpFC
 tk4AAF6faDWMLAA1rhiM9NJsg9RdGEfAgaA/+vE9iFmyFxR3K+UBHDUc80764SX3
 hqgfenM5wJKlxzYiSzG+erFn3F7oHHFWwktS2RD8ynz3t6kW9k7KGvqI/3vBwWL6
 oj+9rHVT3w+RLDP+OCZ1iPR/PuvHOYR2j5rtw2V6WgaZU7cqMNM=
 =de2r
 -----END PGP SIGNATURE-----

Merge tag 'kvm-x86-vmx-7.2' of https://github.com/kvm-x86/linux into HEAD

KVM VMX changes for 7.2

 - Fix a largely benign bug where KVM TDX would incorrectly state it could
   emulate several x2APIC MSRs.

 - Use the "safe" WRMSR API when proxying LBR MSR writes as the to-be-written
   value is guest controlled and completely unvalidated.
This commit is contained in:
Paolo Bonzini 2026-06-12 10:15:13 +02:00
commit e25db15a7f
2 changed files with 26 additions and 18 deletions

View File

@ -316,13 +316,15 @@ static bool intel_pmu_handle_lbr_msrs_access(struct kvm_vcpu *vcpu,
*/
local_irq_disable();
if (lbr_desc->event->state == PERF_EVENT_STATE_ACTIVE) {
int err = 0;
if (read)
rdmsrq(index, msr_info->data);
else
wrmsrq(index, msr_info->data);
err = wrmsrq_safe(index, msr_info->data);
__set_bit(INTEL_PMC_IDX_FIXED_VLBR, vcpu_to_pmu(vcpu)->pmc_in_use);
local_irq_enable();
return true;
return !err;
}
clear_bit(INTEL_PMC_IDX_FIXED_VLBR, vcpu_to_pmu(vcpu)->pmc_in_use);
local_irq_enable();

View File

@ -2192,23 +2192,29 @@ bool tdx_has_emulated_msr(u32 index)
case MSR_IA32_MC0_CTL2 ... MSR_IA32_MCx_CTL2(KVM_MAX_MCE_BANKS) - 1:
/* MSR_IA32_MCx_{CTL, STATUS, ADDR, MISC, CTL2} */
case MSR_KVM_POLL_CONTROL:
/*
* Except for x2APIC registers that are virtualized by the CPU, which
* KVM can't emulate as KVM doesn't have access to the virtual APIC
* page, KVM emulates the same set of x2APIC registers for TDX versus
* non-TDX guests.
*/
case X2APIC_MSR(APIC_ID):
case X2APIC_MSR(APIC_LVR):
case X2APIC_MSR(APIC_LDR):
case X2APIC_MSR(APIC_SPIV):
case X2APIC_MSR(APIC_ESR):
case X2APIC_MSR(APIC_LVTCMCI):
case X2APIC_MSR(APIC_ICR):
case X2APIC_MSR(APIC_LVTT):
case X2APIC_MSR(APIC_LVTTHMR):
case X2APIC_MSR(APIC_LVTPC):
case X2APIC_MSR(APIC_LVT0):
case X2APIC_MSR(APIC_LVT1):
case X2APIC_MSR(APIC_LVTERR):
case X2APIC_MSR(APIC_TMICT):
case X2APIC_MSR(APIC_TMCCT):
case X2APIC_MSR(APIC_TDCR):
return true;
case APIC_BASE_MSR ... APIC_BASE_MSR + 0xff:
/*
* x2APIC registers that are virtualized by the CPU can't be
* emulated, KVM doesn't have access to the virtual APIC page.
*/
switch (index) {
case X2APIC_MSR(APIC_TASKPRI):
case X2APIC_MSR(APIC_PROCPRI):
case X2APIC_MSR(APIC_EOI):
case X2APIC_MSR(APIC_ISR) ... X2APIC_MSR(APIC_ISR + APIC_ISR_NR):
case X2APIC_MSR(APIC_TMR) ... X2APIC_MSR(APIC_TMR + APIC_ISR_NR):
case X2APIC_MSR(APIC_IRR) ... X2APIC_MSR(APIC_IRR + APIC_ISR_NR):
return false;
default:
return true;
}
default:
return false;
}