This shows the hunks that were *removed* from v2 without a replacement; it's not in kvm-coco-queue. Originally from a patch by Isaku Yamahata and Adrian Hunter. Signed-off-by: Paolo Bonzini <pbonzini@xxxxxxxxxx> --- arch/x86/kvm/vmx/tdx.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c index c0fcd0508264..904f8f656394 100644 --- a/arch/x86/kvm/vmx/tdx.c +++ b/arch/x86/kvm/vmx/tdx.c @@ -2005,9 +2005,23 @@ static int tdx_vcpu_get_cpuid(struct kvm_vcpu *vcpu, struct kvm_tdx_cmd *cmd) return r; } +static u64 tdx_guest_cr0(struct kvm_vcpu *vcpu, u64 cr4) +{ + u64 cr0 = ~CR0_RESERVED_BITS; + + if (cr4 & X86_CR4_CET) + cr0 |= X86_CR0_WP; + + cr0 |= X86_CR0_PE | X86_CR0_NE; + cr0 &= ~(X86_CR0_NW | X86_CR0_CD); + + return cr0; +} + static int tdx_vcpu_init(struct kvm_vcpu *vcpu, struct kvm_tdx_cmd *cmd) { u64 apic_base; + struct kvm_tdx *kvm_tdx = to_kvm_tdx(vcpu->kvm); struct vcpu_tdx *tdx = to_tdx(vcpu); int ret; @@ -2030,6 +2044,18 @@ static int tdx_vcpu_init(struct kvm_vcpu *vcpu, struct kvm_tdx_cmd *cmd) if (ret) return ret; + /* + * Just stuff something sensible in vcpu->arch. Note that all runtime + * access to CRn and XCR0 is blocked by guest_state_protected. + */ + vcpu->arch.cr4 = ~vcpu->arch.cr4_guest_rsvd_bits; + vcpu->arch.cr0 = tdx_guest_cr0(vcpu, vcpu->arch.cr4); + vcpu->arch.ia32_xss = kvm_tdx->xfam & kvm_caps.supported_xss; + vcpu->arch.xcr0 = kvm_tdx->xfam & kvm_caps.supported_xcr0; + + /* TODO: freeze vCPU model before kvm_update_cpuid_runtime() */ + kvm_update_cpuid_runtime(vcpu); + tdx->state = VCPU_TD_STATE_INITIALIZED; return 0; -- 2.43.5