From c1f18fa634719a4622be9ca02660dd8e194b0532 Mon Sep 17 00:00:00 2001 From: Jinank Jain Date: Wed, 17 Jul 2024 17:39:01 +0530 Subject: [PATCH] arch: x86_64: Don't expose TSC deadline timer for MSHV guests HV APIC(i.e., synthetic APIC controller exposed by Microsoft Hypervisor) does not support one-shot operation using a TSC deadline value. Due to which we see the following backtrace inside the guest when running with hypervisor-fw/OVMF: [ 0.560765] unchecked MSR access error: WRMSR to 0x832 (tried to write 0x00000000000400ec) at rIP: 0xffffffff8f473594 (native_write_msr+0x4/0x30) [ 0.560765] Call Trace: [ 0.560765] ? native_apic_msr_write+0x2b/0x30 [ 0.560765] __setup_APIC_LVTT+0xbc/0xe0 [ 0.560765] lapic_timer_set_oneshot+0x27/0x30 [ 0.560765] clockevents_switch_state+0xaf/0xf0 [ 0.560765] tick_setup_periodic+0x47/0x90 [ 0.560765] tick_setup_device.isra.0+0x7c/0x110 [ 0.560765] tick_check_new_device+0xce/0xf0 [ 0.560765] clockevents_register_device+0x82/0x170 [ 0.560765] clockevents_config_and_register+0x2f/0x40 [ 0.560765] setup_APIC_timer+0xe1/0xf0 [ 0.560765] setup_boot_APIC_clock+0x5f/0x66 [ 0.560765] native_smp_prepare_cpus+0x1d6/0x286 [ 0.560765] kernel_init_freeable+0xcf/0x255 [ 0.560765] ? rest_init+0xb0/0xb0 [ 0.560765] kernel_init+0xe/0x110 [ 0.560765] ret_from_fork+0x22/0x40 Also, if this feature is exposed guest would not finish booting and get stuck right before unpacking the root filesystem. Fixes: 06e8d1c40 ("hypervisor: mshv: fix topology for Intel HW on MSHV") Signed-off-by: Jinank Jain --- arch/Cargo.toml | 1 + arch/src/x86_64/mod.rs | 31 ++++++++++++++++++++----------- vmm/Cargo.toml | 10 ++++++++-- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/arch/Cargo.toml b/arch/Cargo.toml index 74e6409c1..70bc61fbb 100644 --- a/arch/Cargo.toml +++ b/arch/Cargo.toml @@ -6,6 +6,7 @@ version = "0.1.0" [features] default = [] +kvm = [] sev_snp = [] tdx = [] diff --git a/arch/src/x86_64/mod.rs b/arch/src/x86_64/mod.rs index a4bbe4a73..a412663e2 100644 --- a/arch/src/x86_64/mod.rs +++ b/arch/src/x86_64/mod.rs @@ -34,6 +34,7 @@ use std::arch::x86_64; pub mod tdx; // CPUID feature bits +#[cfg(feature = "kvm")] const TSC_DEADLINE_TIMER_ECX_BIT: u8 = 24; // tsc deadline timer ecx bit. const HYPERVISOR_ECX_BIT: u8 = 31; // Hypervisor ecx bit. const MTRR_EDX_BIT: u8 = 12; // Hypervisor ecx bit. @@ -619,17 +620,8 @@ pub fn generate_common_cpuid( "Generating guest CPUID for with physical address size: {}", config.phys_bits ); - let cpuid_patches = vec![ - // Patch tsc deadline timer bit - CpuidPatch { - function: 1, - index: 0, - flags_bit: None, - eax_bit: None, - ebx_bit: None, - ecx_bit: Some(TSC_DEADLINE_TIMER_ECX_BIT), - edx_bit: None, - }, + #[allow(unused_mut)] + let mut cpuid_patches = vec![ // Patch hypervisor bit CpuidPatch { function: 1, @@ -652,6 +644,23 @@ pub fn generate_common_cpuid( }, ]; + #[cfg(feature = "kvm")] + if matches!( + hypervisor.hypervisor_type(), + hypervisor::HypervisorType::Kvm + ) { + // Patch tsc deadline timer bit + cpuid_patches.push(CpuidPatch { + function: 1, + index: 0, + flags_bit: None, + eax_bit: None, + ebx_bit: None, + ecx_bit: Some(TSC_DEADLINE_TIMER_ECX_BIT), + edx_bit: None, + }); + } + // Supported CPUID let mut cpuid = hypervisor .get_supported_cpuid() diff --git a/vmm/Cargo.toml b/vmm/Cargo.toml index 492540f90..9e9773c61 100644 --- a/vmm/Cargo.toml +++ b/vmm/Cargo.toml @@ -7,11 +7,17 @@ version = "0.1.0" [features] dbus_api = ["blocking", "futures", "zbus"] default = [] -dhat-heap = ["dhat"] # For heap profiling +dhat-heap = ["dhat"] # For heap profiling guest_debug = ["gdbstub", "gdbstub_arch", "kvm"] igvm = ["dep:igvm", "hex", "igvm_defs", "mshv-bindings", "range_map_vec"] io_uring = ["block/io_uring"] -kvm = ["hypervisor/kvm", "pci/kvm", "vfio-ioctls/kvm", "vm-device/kvm"] +kvm = [ + "arch/kvm", + "hypervisor/kvm", + "pci/kvm", + "vfio-ioctls/kvm", + "vm-device/kvm", +] mshv = ["hypervisor/mshv", "pci/mshv", "vfio-ioctls/mshv", "vm-device/mshv"] sev_snp = ["arch/sev_snp", "hypervisor/sev_snp", "virtio-devices/sev_snp"] tdx = ["arch/tdx", "hypervisor/tdx"]