From e84bc2741e0ae95cacc7364a5ca36d3cf07867ee Mon Sep 17 00:00:00 2001 From: Jake Correnti Date: Fri, 17 May 2024 14:54:22 -0400 Subject: [PATCH] Enable MAX_VCPUS and SPLIT_IRQCHIP caps and create VCPU Signed-off-by: Jake Correnti --- src/launch/mod.rs | 14 +++++++++++++- tests/launch.rs | 3 ++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/launch/mod.rs b/src/launch/mod.rs index 6a9aedb..6bb39be 100644 --- a/src/launch/mod.rs +++ b/src/launch/mod.rs @@ -2,6 +2,7 @@ mod linux; +use kvm_bindings::{kvm_enable_cap, KVM_CAP_MAX_VCPUS, KVM_CAP_SPLIT_IRQCHIP}; use linux::{Capabilities, Cmd, CpuidConfig, InitVm, TdxError}; use bitflags::bitflags; @@ -18,8 +19,19 @@ pub struct TdxVm { impl TdxVm { /// Create a new TDX VM with KVM - pub fn new(kvm_fd: &Kvm) -> Result { + pub fn new(kvm_fd: &Kvm, max_vcpus: u64) -> Result { let vm_fd = kvm_fd.create_vm_with_type(KVM_X86_TDX_VM)?; + let mut cap: kvm_enable_cap = Default::default(); + + // TDX requires that MAX_VCPUS and SPLIT_IRQCHIP be set + cap.cap = KVM_CAP_MAX_VCPUS; + cap.args[0] = max_vcpus; + vm_fd.enable_cap(&cap).unwrap(); + + cap.cap = KVM_CAP_SPLIT_IRQCHIP; + cap.args[0] = 24; + vm_fd.enable_cap(&cap).unwrap(); + Ok(Self { fd: vm_fd }) } diff --git a/tests/launch.rs b/tests/launch.rs index 63e8614..94c2f8a 100644 --- a/tests/launch.rs +++ b/tests/launch.rs @@ -7,7 +7,8 @@ use tdx::launch::TdxVm; #[test] fn launch() { let kvm_fd = Kvm::new().unwrap(); - let tdx_vm = TdxVm::new(&kvm_fd).unwrap(); + let tdx_vm = TdxVm::new(&kvm_fd, 100).unwrap(); let caps = tdx_vm.get_capabilities().unwrap(); let _ = tdx_vm.init_vm(&kvm_fd, &caps).unwrap(); + let _vcpufd = tdx_vm.fd.create_vcpu(0).unwrap(); }