Commit 0f68fe44 authored by Paolo Bonzini's avatar Paolo Bonzini
Browse files

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

KVM VMX changes for 6.18

 - Add read/write helpers for MSRs that need to be accessed with preemption
   disable to prepare for virtualizing FRED RSP0.

 - Fix a bug where KVM would return 0/success from __tdx_bringup() on error,
   i.e. where KVM would load with enable_tdx=true despite TDX not being usable.

 - Minor cleanups.
parents 5b0d0d85 510c47f1
Loading
Loading
Loading
Loading
+4 −8
Original line number Diff line number Diff line
@@ -2491,7 +2491,7 @@ static int __tdx_td_init(struct kvm *kvm, struct td_params *td_params,
	/* TDVPS = TDVPR(4K page) + TDCX(multiple 4K pages), -1 for TDVPR. */
	kvm_tdx->td.tdcx_nr_pages = tdx_sysinfo->td_ctrl.tdvps_base_size / PAGE_SIZE - 1;
	tdcs_pages = kcalloc(kvm_tdx->td.tdcs_nr_pages, sizeof(*kvm_tdx->td.tdcs_pages),
			     GFP_KERNEL | __GFP_ZERO);
			     GFP_KERNEL);
	if (!tdcs_pages)
		goto free_tdr;

@@ -3471,12 +3471,11 @@ static int __init __tdx_bringup(void)
	if (r)
		goto tdx_bringup_err;

	r = -EINVAL;
	/* Get TDX global information for later use */
	tdx_sysinfo = tdx_get_sysinfo();
	if (WARN_ON_ONCE(!tdx_sysinfo)) {
		r = -EINVAL;
	if (WARN_ON_ONCE(!tdx_sysinfo))
		goto get_sysinfo_err;
	}

	/* Check TDX module and KVM capabilities */
	if (!tdx_get_supported_attrs(&tdx_sysinfo->td_conf) ||
@@ -3519,14 +3518,11 @@ static int __init __tdx_bringup(void)
	if (td_conf->max_vcpus_per_td < num_present_cpus()) {
		pr_err("Disable TDX: MAX_VCPU_PER_TD (%u) smaller than number of logical CPUs (%u).\n",
				td_conf->max_vcpus_per_td, num_present_cpus());
		r = -EINVAL;
		goto get_sysinfo_err;
	}

	if (misc_cg_set_capacity(MISC_CG_RES_TDX, tdx_get_nr_guest_keyids())) {
		r = -EINVAL;
	if (misc_cg_set_capacity(MISC_CG_RES_TDX, tdx_get_nr_guest_keyids()))
		goto get_sysinfo_err;
	}

	/*
	 * Leave hardware virtualization enabled after TDX is enabled
+22 −7
Original line number Diff line number Diff line
@@ -1344,22 +1344,35 @@ static void vmx_prepare_switch_to_host(struct vcpu_vmx *vmx)
}

#ifdef CONFIG_X86_64
static u64 vmx_read_guest_kernel_gs_base(struct vcpu_vmx *vmx)
static u64 vmx_read_guest_host_msr(struct vcpu_vmx *vmx, u32 msr, u64 *cache)
{
	preempt_disable();
	if (vmx->vt.guest_state_loaded)
		rdmsrq(MSR_KERNEL_GS_BASE, vmx->msr_guest_kernel_gs_base);
		*cache = read_msr(msr);
	preempt_enable();
	return vmx->msr_guest_kernel_gs_base;
	return *cache;
}

static void vmx_write_guest_kernel_gs_base(struct vcpu_vmx *vmx, u64 data)
static void vmx_write_guest_host_msr(struct vcpu_vmx *vmx, u32 msr, u64 data,
				     u64 *cache)
{
	preempt_disable();
	if (vmx->vt.guest_state_loaded)
		wrmsrq(MSR_KERNEL_GS_BASE, data);
		wrmsrns(msr, data);
	preempt_enable();
	vmx->msr_guest_kernel_gs_base = data;
	*cache = data;
}

static u64 vmx_read_guest_kernel_gs_base(struct vcpu_vmx *vmx)
{
	return vmx_read_guest_host_msr(vmx, MSR_KERNEL_GS_BASE,
				       &vmx->msr_guest_kernel_gs_base);
}

static void vmx_write_guest_kernel_gs_base(struct vcpu_vmx *vmx, u64 data)
{
	vmx_write_guest_host_msr(vmx, MSR_KERNEL_GS_BASE, data,
				 &vmx->msr_guest_kernel_gs_base);
}
#endif

@@ -8532,7 +8545,9 @@ __init int vmx_hardware_setup(void)
	 */
	if (!static_cpu_has(X86_FEATURE_SELFSNOOP))
		kvm_caps.supported_quirks &= ~KVM_X86_QUIRK_IGNORE_GUEST_PAT;

	kvm_caps.inapplicable_quirks &= ~KVM_X86_QUIRK_IGNORE_GUEST_PAT;

	return r;
}