^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Kernel-based Virtual Machine driver for Linux
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * AMD SVM support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Copyright (C) 2006 Qumranet, Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Copyright 2010 Red Hat, Inc. and/or its affiliates.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * Authors:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * Yaniv Kamay <yaniv@qumranet.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * Avi Kivity <avi@qumranet.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #define pr_fmt(fmt) "SVM: " fmt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/kvm_types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/kvm_host.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <asm/msr-index.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <asm/debugreg.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include "kvm_emulate.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include "trace.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include "mmu.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include "x86.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include "cpuid.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include "lapic.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include "svm.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) static void nested_svm_inject_npf_exit(struct kvm_vcpu *vcpu,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) struct x86_exception *fault)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) struct vcpu_svm *svm = to_svm(vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) if (svm->vmcb->control.exit_code != SVM_EXIT_NPF) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) * TODO: track the cause of the nested page fault, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) * correctly fill in the high bits of exit_info_1.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) svm->vmcb->control.exit_code = SVM_EXIT_NPF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) svm->vmcb->control.exit_code_hi = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) svm->vmcb->control.exit_info_1 = (1ULL << 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) svm->vmcb->control.exit_info_2 = fault->address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) svm->vmcb->control.exit_info_1 &= ~0xffffffffULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) svm->vmcb->control.exit_info_1 |= fault->error_code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) nested_svm_vmexit(svm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) static void svm_inject_page_fault_nested(struct kvm_vcpu *vcpu, struct x86_exception *fault)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) struct vcpu_svm *svm = to_svm(vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) WARN_ON(!is_guest_mode(vcpu));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) if (vmcb_is_intercept(&svm->nested.ctl, INTERCEPT_EXCEPTION_OFFSET + PF_VECTOR) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) !svm->nested.nested_run_pending) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) svm->vmcb->control.exit_code = SVM_EXIT_EXCP_BASE + PF_VECTOR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) svm->vmcb->control.exit_code_hi = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) svm->vmcb->control.exit_info_1 = fault->error_code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) svm->vmcb->control.exit_info_2 = fault->address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) nested_svm_vmexit(svm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) kvm_inject_page_fault(vcpu, fault);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) static u64 nested_svm_get_tdp_pdptr(struct kvm_vcpu *vcpu, int index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) struct vcpu_svm *svm = to_svm(vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) u64 cr3 = svm->nested.ctl.nested_cr3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) u64 pdpte;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) ret = kvm_vcpu_read_guest_page(vcpu, gpa_to_gfn(cr3), &pdpte,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) offset_in_page(cr3) + index * 8, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) return pdpte;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) static unsigned long nested_svm_get_tdp_cr3(struct kvm_vcpu *vcpu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) struct vcpu_svm *svm = to_svm(vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) return svm->nested.ctl.nested_cr3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) static void nested_svm_init_mmu_context(struct kvm_vcpu *vcpu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) struct vcpu_svm *svm = to_svm(vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) struct vmcb *hsave = svm->nested.hsave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) WARN_ON(mmu_is_nested(vcpu));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) vcpu->arch.mmu = &vcpu->arch.guest_mmu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) kvm_init_shadow_npt_mmu(vcpu, X86_CR0_PG, hsave->save.cr4, hsave->save.efer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) svm->nested.ctl.nested_cr3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) vcpu->arch.mmu->get_guest_pgd = nested_svm_get_tdp_cr3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) vcpu->arch.mmu->get_pdptr = nested_svm_get_tdp_pdptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) vcpu->arch.mmu->inject_page_fault = nested_svm_inject_npf_exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) reset_shadow_zero_bits_mask(vcpu, vcpu->arch.mmu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) vcpu->arch.walk_mmu = &vcpu->arch.nested_mmu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) static void nested_svm_uninit_mmu_context(struct kvm_vcpu *vcpu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) vcpu->arch.mmu = &vcpu->arch.root_mmu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) vcpu->arch.walk_mmu = &vcpu->arch.root_mmu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) void recalc_intercepts(struct vcpu_svm *svm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) struct vmcb_control_area *c, *h, *g;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) vmcb_mark_dirty(svm->vmcb, VMCB_INTERCEPTS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) if (!is_guest_mode(&svm->vcpu))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) c = &svm->vmcb->control;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) h = &svm->nested.hsave->control;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) g = &svm->nested.ctl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) for (i = 0; i < MAX_INTERCEPT; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) c->intercepts[i] = h->intercepts[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) if (g->int_ctl & V_INTR_MASKING_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) /* We only want the cr8 intercept bits of L1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) vmcb_clr_intercept(c, INTERCEPT_CR8_READ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) vmcb_clr_intercept(c, INTERCEPT_CR8_WRITE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) * Once running L2 with HF_VINTR_MASK, EFLAGS.IF does not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) * affect any interrupt we may want to inject; therefore,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) * interrupt window vmexits are irrelevant to L0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) vmcb_clr_intercept(c, INTERCEPT_VINTR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) /* We don't want to see VMMCALLs from a nested guest */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) vmcb_clr_intercept(c, INTERCEPT_VMMCALL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) for (i = 0; i < MAX_INTERCEPT; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) c->intercepts[i] |= g->intercepts[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) vmcb_set_intercept(c, INTERCEPT_VMLOAD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) vmcb_set_intercept(c, INTERCEPT_VMSAVE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) static void copy_vmcb_control_area(struct vmcb_control_area *dst,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) struct vmcb_control_area *from)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) for (i = 0; i < MAX_INTERCEPT; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) dst->intercepts[i] = from->intercepts[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) dst->iopm_base_pa = from->iopm_base_pa;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) dst->msrpm_base_pa = from->msrpm_base_pa;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) dst->tsc_offset = from->tsc_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) /* asid not copied, it is handled manually for svm->vmcb. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) dst->tlb_ctl = from->tlb_ctl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) dst->int_ctl = from->int_ctl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) dst->int_vector = from->int_vector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) dst->int_state = from->int_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) dst->exit_code = from->exit_code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) dst->exit_code_hi = from->exit_code_hi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) dst->exit_info_1 = from->exit_info_1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) dst->exit_info_2 = from->exit_info_2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) dst->exit_int_info = from->exit_int_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) dst->exit_int_info_err = from->exit_int_info_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) dst->nested_ctl = from->nested_ctl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) dst->event_inj = from->event_inj;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) dst->event_inj_err = from->event_inj_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) dst->nested_cr3 = from->nested_cr3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) dst->virt_ext = from->virt_ext;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) dst->pause_filter_count = from->pause_filter_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) dst->pause_filter_thresh = from->pause_filter_thresh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) static bool nested_svm_vmrun_msrpm(struct vcpu_svm *svm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) * This function merges the msr permission bitmaps of kvm and the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) * nested vmcb. It is optimized in that it only merges the parts where
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) * the kvm msr permission bitmap may contain zero bits
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) if (!(vmcb_is_intercept(&svm->nested.ctl, INTERCEPT_MSR_PROT)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) for (i = 0; i < MSRPM_OFFSETS; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) u32 value, p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) u64 offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) if (msrpm_offsets[i] == 0xffffffff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) p = msrpm_offsets[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) offset = svm->nested.ctl.msrpm_base_pa + (p * 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) if (kvm_vcpu_read_guest(&svm->vcpu, offset, &value, 4))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) svm->nested.msrpm[p] = svm->msrpm[p] | value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) svm->vmcb->control.msrpm_base_pa = __sme_set(__pa(svm->nested.msrpm));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) static bool svm_get_nested_state_pages(struct kvm_vcpu *vcpu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) struct vcpu_svm *svm = to_svm(vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) if (WARN_ON(!is_guest_mode(vcpu)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) if (!nested_svm_vmrun_msrpm(svm)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) vcpu->run->internal.suberror =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) KVM_INTERNAL_ERROR_EMULATION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) vcpu->run->internal.ndata = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) static bool nested_vmcb_check_controls(struct vmcb_control_area *control)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) if ((vmcb_is_intercept(control, INTERCEPT_VMRUN)) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) if (control->asid == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) if ((control->nested_ctl & SVM_NESTED_CTL_NP_ENABLE) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) !npt_enabled)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) static bool nested_vmcb_check_save(struct vcpu_svm *svm, struct vmcb *vmcb12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) struct kvm_vcpu *vcpu = &svm->vcpu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) bool vmcb12_lma;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) * FIXME: these should be done after copying the fields,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) * to avoid TOC/TOU races. For these save area checks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) * the possible damage is limited since kvm_set_cr0 and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) * kvm_set_cr4 handle failure; EFER_SVME is an exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) * so it is force-set later in nested_prepare_vmcb_save.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) if ((vmcb12->save.efer & EFER_SVME) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) if (((vmcb12->save.cr0 & X86_CR0_CD) == 0) && (vmcb12->save.cr0 & X86_CR0_NW))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) if (!kvm_dr6_valid(vmcb12->save.dr6) || !kvm_dr7_valid(vmcb12->save.dr7))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) vmcb12_lma = (vmcb12->save.efer & EFER_LME) && (vmcb12->save.cr0 & X86_CR0_PG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) if (vmcb12_lma) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) if (!(vmcb12->save.cr4 & X86_CR4_PAE) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) !(vmcb12->save.cr0 & X86_CR0_PE) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) (vmcb12->save.cr3 & vcpu->arch.cr3_lm_rsvd_bits))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) if (kvm_valid_cr4(&svm->vcpu, vmcb12->save.cr4))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) static void load_nested_vmcb_control(struct vcpu_svm *svm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) struct vmcb_control_area *control)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) copy_vmcb_control_area(&svm->nested.ctl, control);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) /* Copy it here because nested_svm_check_controls will check it. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) svm->nested.ctl.asid = control->asid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) svm->nested.ctl.msrpm_base_pa &= ~0x0fffULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) svm->nested.ctl.iopm_base_pa &= ~0x0fffULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) * Synchronize fields that are written by the processor, so that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) * they can be copied back into the nested_vmcb.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) void sync_nested_vmcb_control(struct vcpu_svm *svm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) u32 mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) svm->nested.ctl.event_inj = svm->vmcb->control.event_inj;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) svm->nested.ctl.event_inj_err = svm->vmcb->control.event_inj_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) /* Only a few fields of int_ctl are written by the processor. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) mask = V_IRQ_MASK | V_TPR_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) if (!(svm->nested.ctl.int_ctl & V_INTR_MASKING_MASK) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) svm_is_intercept(svm, INTERCEPT_VINTR)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) * In order to request an interrupt window, L0 is usurping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) * svm->vmcb->control.int_ctl and possibly setting V_IRQ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) * even if it was clear in L1's VMCB. Restoring it would be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) * wrong. However, in this case V_IRQ will remain true until
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) * interrupt_window_interception calls svm_clear_vintr and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) * restores int_ctl. We can just leave it aside.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) mask &= ~V_IRQ_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) svm->nested.ctl.int_ctl &= ~mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) svm->nested.ctl.int_ctl |= svm->vmcb->control.int_ctl & mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) * Transfer any event that L0 or L1 wanted to inject into L2 to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) * EXIT_INT_INFO.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) static void nested_vmcb_save_pending_event(struct vcpu_svm *svm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) struct vmcb *vmcb12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) struct kvm_vcpu *vcpu = &svm->vcpu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) u32 exit_int_info = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) unsigned int nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) if (vcpu->arch.exception.injected) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) nr = vcpu->arch.exception.nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) exit_int_info = nr | SVM_EVTINJ_VALID | SVM_EVTINJ_TYPE_EXEPT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) if (vcpu->arch.exception.has_error_code) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) exit_int_info |= SVM_EVTINJ_VALID_ERR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) vmcb12->control.exit_int_info_err =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) vcpu->arch.exception.error_code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) } else if (vcpu->arch.nmi_injected) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) exit_int_info = SVM_EVTINJ_VALID | SVM_EVTINJ_TYPE_NMI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) } else if (vcpu->arch.interrupt.injected) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) nr = vcpu->arch.interrupt.nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) exit_int_info = nr | SVM_EVTINJ_VALID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) if (vcpu->arch.interrupt.soft)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) exit_int_info |= SVM_EVTINJ_TYPE_SOFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) exit_int_info |= SVM_EVTINJ_TYPE_INTR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) vmcb12->control.exit_int_info = exit_int_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) static inline bool nested_npt_enabled(struct vcpu_svm *svm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) return svm->nested.ctl.nested_ctl & SVM_NESTED_CTL_NP_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) * Load guest's/host's cr3 on nested vmentry or vmexit. @nested_npt is true
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) * if we are emulating VM-Entry into a guest with NPT enabled.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) static int nested_svm_load_cr3(struct kvm_vcpu *vcpu, unsigned long cr3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) bool nested_npt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) if (cr3 & rsvd_bits(cpuid_maxphyaddr(vcpu), 63))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) if (!nested_npt && is_pae_paging(vcpu) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) (cr3 != kvm_read_cr3(vcpu) || pdptrs_changed(vcpu))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) if (!load_pdptrs(vcpu, vcpu->arch.walk_mmu, cr3))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) * TODO: optimize unconditional TLB flush/MMU sync here and in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) * kvm_init_shadow_npt_mmu().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) if (!nested_npt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) kvm_mmu_new_pgd(vcpu, cr3, false, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) vcpu->arch.cr3 = cr3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) kvm_register_mark_available(vcpu, VCPU_EXREG_CR3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) kvm_init_mmu(vcpu, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) static void nested_prepare_vmcb_save(struct vcpu_svm *svm, struct vmcb *vmcb12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) /* Load the nested guest state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) svm->vmcb->save.es = vmcb12->save.es;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) svm->vmcb->save.cs = vmcb12->save.cs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) svm->vmcb->save.ss = vmcb12->save.ss;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) svm->vmcb->save.ds = vmcb12->save.ds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) svm->vmcb->save.gdtr = vmcb12->save.gdtr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) svm->vmcb->save.idtr = vmcb12->save.idtr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) kvm_set_rflags(&svm->vcpu, vmcb12->save.rflags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) * Force-set EFER_SVME even though it is checked earlier on the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) * VMCB12, because the guest can flip the bit between the check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) * and now. Clearing EFER_SVME would call svm_free_nested.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) svm_set_efer(&svm->vcpu, vmcb12->save.efer | EFER_SVME);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) svm_set_cr0(&svm->vcpu, vmcb12->save.cr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) svm_set_cr4(&svm->vcpu, vmcb12->save.cr4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) svm->vmcb->save.cr2 = svm->vcpu.arch.cr2 = vmcb12->save.cr2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) kvm_rax_write(&svm->vcpu, vmcb12->save.rax);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) kvm_rsp_write(&svm->vcpu, vmcb12->save.rsp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) kvm_rip_write(&svm->vcpu, vmcb12->save.rip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) /* In case we don't even reach vcpu_run, the fields are not updated */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) svm->vmcb->save.rax = vmcb12->save.rax;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) svm->vmcb->save.rsp = vmcb12->save.rsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) svm->vmcb->save.rip = vmcb12->save.rip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) svm->vmcb->save.dr7 = vmcb12->save.dr7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) svm->vcpu.arch.dr6 = vmcb12->save.dr6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) svm->vmcb->save.cpl = vmcb12->save.cpl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) static void nested_prepare_vmcb_control(struct vcpu_svm *svm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) const u32 int_ctl_vmcb01_bits =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) V_INTR_MASKING_MASK | V_GIF_MASK | V_GIF_ENABLE_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) const u32 int_ctl_vmcb12_bits = V_TPR_MASK | V_IRQ_INJECTION_BITS_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) if (nested_npt_enabled(svm))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) nested_svm_init_mmu_context(&svm->vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) svm->vmcb->control.tsc_offset = svm->vcpu.arch.tsc_offset =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) svm->vcpu.arch.l1_tsc_offset + svm->nested.ctl.tsc_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) svm->vmcb->control.int_ctl =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) (svm->nested.ctl.int_ctl & int_ctl_vmcb12_bits) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) (svm->nested.hsave->control.int_ctl & int_ctl_vmcb01_bits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) svm->vmcb->control.int_vector = svm->nested.ctl.int_vector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) svm->vmcb->control.int_state = svm->nested.ctl.int_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) svm->vmcb->control.event_inj = svm->nested.ctl.event_inj;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) svm->vmcb->control.event_inj_err = svm->nested.ctl.event_inj_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) svm->vmcb->control.pause_filter_count = svm->nested.ctl.pause_filter_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) svm->vmcb->control.pause_filter_thresh = svm->nested.ctl.pause_filter_thresh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) /* Enter Guest-Mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) enter_guest_mode(&svm->vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) * Merge guest and host intercepts - must be called with vcpu in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) * guest-mode to take affect here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) recalc_intercepts(svm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) vmcb_mark_all_dirty(svm->vmcb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) int enter_svm_guest_mode(struct vcpu_svm *svm, u64 vmcb12_gpa,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) struct vmcb *vmcb12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) svm->nested.vmcb12_gpa = vmcb12_gpa;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) nested_prepare_vmcb_save(svm, vmcb12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) nested_prepare_vmcb_control(svm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) ret = nested_svm_load_cr3(&svm->vcpu, vmcb12->save.cr3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) nested_npt_enabled(svm));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) if (!npt_enabled)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) svm->vcpu.arch.mmu->inject_page_fault = svm_inject_page_fault_nested;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) svm_set_gif(svm, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) int nested_svm_vmrun(struct vcpu_svm *svm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) struct vmcb *vmcb12;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) struct vmcb *hsave = svm->nested.hsave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) struct vmcb *vmcb = svm->vmcb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) struct kvm_host_map map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) u64 vmcb12_gpa;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) if (is_smm(&svm->vcpu)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) kvm_queue_exception(&svm->vcpu, UD_VECTOR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) vmcb12_gpa = svm->vmcb->save.rax;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) ret = kvm_vcpu_map(&svm->vcpu, gpa_to_gfn(vmcb12_gpa), &map);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) if (ret == -EINVAL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) kvm_inject_gp(&svm->vcpu, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) } else if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) return kvm_skip_emulated_instruction(&svm->vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) ret = kvm_skip_emulated_instruction(&svm->vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) vmcb12 = map.hva;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) if (WARN_ON_ONCE(!svm->nested.initialized))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) load_nested_vmcb_control(svm, &vmcb12->control);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) if (!nested_vmcb_check_save(svm, vmcb12) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) !nested_vmcb_check_controls(&svm->nested.ctl)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) vmcb12->control.exit_code = SVM_EXIT_ERR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) vmcb12->control.exit_code_hi = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) vmcb12->control.exit_info_1 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) vmcb12->control.exit_info_2 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) trace_kvm_nested_vmrun(svm->vmcb->save.rip, vmcb12_gpa,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) vmcb12->save.rip,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) vmcb12->control.int_ctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) vmcb12->control.event_inj,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) vmcb12->control.nested_ctl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) trace_kvm_nested_intercepts(vmcb12->control.intercepts[INTERCEPT_CR] & 0xffff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) vmcb12->control.intercepts[INTERCEPT_CR] >> 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) vmcb12->control.intercepts[INTERCEPT_EXCEPTION],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) vmcb12->control.intercepts[INTERCEPT_WORD3],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) vmcb12->control.intercepts[INTERCEPT_WORD4],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) vmcb12->control.intercepts[INTERCEPT_WORD5]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) /* Clear internal status */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) kvm_clear_exception_queue(&svm->vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) kvm_clear_interrupt_queue(&svm->vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) * Save the old vmcb, so we don't need to pick what we save, but can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) * restore everything when a VMEXIT occurs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) hsave->save.es = vmcb->save.es;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) hsave->save.cs = vmcb->save.cs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) hsave->save.ss = vmcb->save.ss;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) hsave->save.ds = vmcb->save.ds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) hsave->save.gdtr = vmcb->save.gdtr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) hsave->save.idtr = vmcb->save.idtr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) hsave->save.efer = svm->vcpu.arch.efer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) hsave->save.cr0 = kvm_read_cr0(&svm->vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) hsave->save.cr4 = svm->vcpu.arch.cr4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) hsave->save.rflags = kvm_get_rflags(&svm->vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) hsave->save.rip = kvm_rip_read(&svm->vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) hsave->save.rsp = vmcb->save.rsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) hsave->save.rax = vmcb->save.rax;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) if (npt_enabled)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) hsave->save.cr3 = vmcb->save.cr3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) hsave->save.cr3 = kvm_read_cr3(&svm->vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) copy_vmcb_control_area(&hsave->control, &vmcb->control);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) svm->nested.nested_run_pending = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) if (enter_svm_guest_mode(svm, vmcb12_gpa, vmcb12))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) goto out_exit_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) if (nested_svm_vmrun_msrpm(svm))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) out_exit_err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) svm->nested.nested_run_pending = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) svm->vmcb->control.exit_code = SVM_EXIT_ERR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) svm->vmcb->control.exit_code_hi = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) svm->vmcb->control.exit_info_1 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) svm->vmcb->control.exit_info_2 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) nested_svm_vmexit(svm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) kvm_vcpu_unmap(&svm->vcpu, &map, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) void nested_svm_vmloadsave(struct vmcb *from_vmcb, struct vmcb *to_vmcb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) to_vmcb->save.fs = from_vmcb->save.fs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) to_vmcb->save.gs = from_vmcb->save.gs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) to_vmcb->save.tr = from_vmcb->save.tr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) to_vmcb->save.ldtr = from_vmcb->save.ldtr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) to_vmcb->save.kernel_gs_base = from_vmcb->save.kernel_gs_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) to_vmcb->save.star = from_vmcb->save.star;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) to_vmcb->save.lstar = from_vmcb->save.lstar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) to_vmcb->save.cstar = from_vmcb->save.cstar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) to_vmcb->save.sfmask = from_vmcb->save.sfmask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) to_vmcb->save.sysenter_cs = from_vmcb->save.sysenter_cs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) to_vmcb->save.sysenter_esp = from_vmcb->save.sysenter_esp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) to_vmcb->save.sysenter_eip = from_vmcb->save.sysenter_eip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) int nested_svm_vmexit(struct vcpu_svm *svm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) struct vmcb *vmcb12;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) struct vmcb *hsave = svm->nested.hsave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) struct vmcb *vmcb = svm->vmcb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) struct kvm_host_map map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) rc = kvm_vcpu_map(&svm->vcpu, gpa_to_gfn(svm->nested.vmcb12_gpa), &map);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) if (rc == -EINVAL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) kvm_inject_gp(&svm->vcpu, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) vmcb12 = map.hva;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) /* Exit Guest-Mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) leave_guest_mode(&svm->vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) svm->nested.vmcb12_gpa = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) WARN_ON_ONCE(svm->nested.nested_run_pending);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) kvm_clear_request(KVM_REQ_GET_NESTED_STATE_PAGES, &svm->vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) /* in case we halted in L2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) svm->vcpu.arch.mp_state = KVM_MP_STATE_RUNNABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) /* Give the current vmcb to the guest */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) vmcb12->save.es = vmcb->save.es;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) vmcb12->save.cs = vmcb->save.cs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) vmcb12->save.ss = vmcb->save.ss;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) vmcb12->save.ds = vmcb->save.ds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) vmcb12->save.gdtr = vmcb->save.gdtr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) vmcb12->save.idtr = vmcb->save.idtr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) vmcb12->save.efer = svm->vcpu.arch.efer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) vmcb12->save.cr0 = kvm_read_cr0(&svm->vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) vmcb12->save.cr3 = kvm_read_cr3(&svm->vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) vmcb12->save.cr2 = vmcb->save.cr2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) vmcb12->save.cr4 = svm->vcpu.arch.cr4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) vmcb12->save.rflags = kvm_get_rflags(&svm->vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) vmcb12->save.rip = kvm_rip_read(&svm->vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) vmcb12->save.rsp = kvm_rsp_read(&svm->vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) vmcb12->save.rax = kvm_rax_read(&svm->vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) vmcb12->save.dr7 = vmcb->save.dr7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) vmcb12->save.dr6 = svm->vcpu.arch.dr6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) vmcb12->save.cpl = vmcb->save.cpl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) vmcb12->control.int_state = vmcb->control.int_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) vmcb12->control.exit_code = vmcb->control.exit_code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) vmcb12->control.exit_code_hi = vmcb->control.exit_code_hi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) vmcb12->control.exit_info_1 = vmcb->control.exit_info_1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) vmcb12->control.exit_info_2 = vmcb->control.exit_info_2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) if (vmcb12->control.exit_code != SVM_EXIT_ERR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) nested_vmcb_save_pending_event(svm, vmcb12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) if (svm->nrips_enabled)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) vmcb12->control.next_rip = vmcb->control.next_rip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) vmcb12->control.int_ctl = svm->nested.ctl.int_ctl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) vmcb12->control.tlb_ctl = svm->nested.ctl.tlb_ctl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) vmcb12->control.event_inj = svm->nested.ctl.event_inj;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) vmcb12->control.event_inj_err = svm->nested.ctl.event_inj_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) vmcb12->control.pause_filter_count =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) svm->vmcb->control.pause_filter_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) vmcb12->control.pause_filter_thresh =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) svm->vmcb->control.pause_filter_thresh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) /* Restore the original control entries */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) copy_vmcb_control_area(&vmcb->control, &hsave->control);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) /* On vmexit the GIF is set to false */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) svm_set_gif(svm, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) svm->vmcb->control.tsc_offset = svm->vcpu.arch.tsc_offset =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) svm->vcpu.arch.l1_tsc_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) svm->nested.ctl.nested_cr3 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) /* Restore selected save entries */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) svm->vmcb->save.es = hsave->save.es;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) svm->vmcb->save.cs = hsave->save.cs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) svm->vmcb->save.ss = hsave->save.ss;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) svm->vmcb->save.ds = hsave->save.ds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) svm->vmcb->save.gdtr = hsave->save.gdtr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) svm->vmcb->save.idtr = hsave->save.idtr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) kvm_set_rflags(&svm->vcpu, hsave->save.rflags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) svm_set_efer(&svm->vcpu, hsave->save.efer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) svm_set_cr0(&svm->vcpu, hsave->save.cr0 | X86_CR0_PE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) svm_set_cr4(&svm->vcpu, hsave->save.cr4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) kvm_rax_write(&svm->vcpu, hsave->save.rax);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) kvm_rsp_write(&svm->vcpu, hsave->save.rsp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) kvm_rip_write(&svm->vcpu, hsave->save.rip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) svm->vmcb->save.dr7 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) svm->vmcb->save.cpl = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) svm->vmcb->control.exit_int_info = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) vmcb_mark_all_dirty(svm->vmcb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) trace_kvm_nested_vmexit_inject(vmcb12->control.exit_code,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) vmcb12->control.exit_info_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) vmcb12->control.exit_info_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) vmcb12->control.exit_int_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) vmcb12->control.exit_int_info_err,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) KVM_ISA_SVM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) kvm_vcpu_unmap(&svm->vcpu, &map, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) nested_svm_uninit_mmu_context(&svm->vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) rc = nested_svm_load_cr3(&svm->vcpu, hsave->save.cr3, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) if (npt_enabled)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) svm->vmcb->save.cr3 = hsave->save.cr3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) * Drop what we picked up for L2 via svm_complete_interrupts() so it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) * doesn't end up in L1.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) svm->vcpu.arch.nmi_injected = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) kvm_clear_exception_queue(&svm->vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) kvm_clear_interrupt_queue(&svm->vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) int svm_allocate_nested(struct vcpu_svm *svm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) struct page *hsave_page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) if (svm->nested.initialized)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) hsave_page = alloc_page(GFP_KERNEL_ACCOUNT | __GFP_ZERO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) if (!hsave_page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) svm->nested.hsave = page_address(hsave_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) svm->nested.msrpm = svm_vcpu_alloc_msrpm();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) if (!svm->nested.msrpm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) goto err_free_hsave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) svm_vcpu_init_msrpm(&svm->vcpu, svm->nested.msrpm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) svm->nested.initialized = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) err_free_hsave:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) __free_page(hsave_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) void svm_free_nested(struct vcpu_svm *svm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) if (!svm->nested.initialized)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) svm_vcpu_free_msrpm(svm->nested.msrpm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) svm->nested.msrpm = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) __free_page(virt_to_page(svm->nested.hsave));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) svm->nested.hsave = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) svm->nested.initialized = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) * Forcibly leave nested mode in order to be able to reset the VCPU later on.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) void svm_leave_nested(struct kvm_vcpu *vcpu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) struct vcpu_svm *svm = to_svm(vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) if (is_guest_mode(&svm->vcpu)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) struct vmcb *hsave = svm->nested.hsave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) struct vmcb *vmcb = svm->vmcb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) svm->nested.nested_run_pending = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) leave_guest_mode(&svm->vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) copy_vmcb_control_area(&vmcb->control, &hsave->control);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) nested_svm_uninit_mmu_context(&svm->vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) kvm_clear_request(KVM_REQ_GET_NESTED_STATE_PAGES, &svm->vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) static int nested_svm_exit_handled_msr(struct vcpu_svm *svm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) u32 offset, msr, value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) int write, mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) if (!(vmcb_is_intercept(&svm->nested.ctl, INTERCEPT_MSR_PROT)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) return NESTED_EXIT_HOST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) msr = svm->vcpu.arch.regs[VCPU_REGS_RCX];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) offset = svm_msrpm_offset(msr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) write = svm->vmcb->control.exit_info_1 & 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) mask = 1 << ((2 * (msr & 0xf)) + write);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) if (offset == MSR_INVALID)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) return NESTED_EXIT_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) /* Offset is in 32 bit units but need in 8 bit units */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) offset *= 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) if (kvm_vcpu_read_guest(&svm->vcpu, svm->nested.ctl.msrpm_base_pa + offset, &value, 4))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) return NESTED_EXIT_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) return (value & mask) ? NESTED_EXIT_DONE : NESTED_EXIT_HOST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) static int nested_svm_intercept_ioio(struct vcpu_svm *svm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) unsigned port, size, iopm_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) u16 val, mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) u8 start_bit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) u64 gpa;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) if (!(vmcb_is_intercept(&svm->nested.ctl, INTERCEPT_IOIO_PROT)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) return NESTED_EXIT_HOST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) port = svm->vmcb->control.exit_info_1 >> 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) size = (svm->vmcb->control.exit_info_1 & SVM_IOIO_SIZE_MASK) >>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) SVM_IOIO_SIZE_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) gpa = svm->nested.ctl.iopm_base_pa + (port / 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) start_bit = port % 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) iopm_len = (start_bit + size > 8) ? 2 : 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) mask = (0xf >> (4 - size)) << start_bit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) val = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) if (kvm_vcpu_read_guest(&svm->vcpu, gpa, &val, iopm_len))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) return NESTED_EXIT_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) return (val & mask) ? NESTED_EXIT_DONE : NESTED_EXIT_HOST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) static int nested_svm_intercept(struct vcpu_svm *svm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) u32 exit_code = svm->vmcb->control.exit_code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) int vmexit = NESTED_EXIT_HOST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) switch (exit_code) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) case SVM_EXIT_MSR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) vmexit = nested_svm_exit_handled_msr(svm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) case SVM_EXIT_IOIO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) vmexit = nested_svm_intercept_ioio(svm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) case SVM_EXIT_READ_CR0 ... SVM_EXIT_WRITE_CR8: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) if (vmcb_is_intercept(&svm->nested.ctl, exit_code))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) vmexit = NESTED_EXIT_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) case SVM_EXIT_READ_DR0 ... SVM_EXIT_WRITE_DR7: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) if (vmcb_is_intercept(&svm->nested.ctl, exit_code))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) vmexit = NESTED_EXIT_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) case SVM_EXIT_EXCP_BASE ... SVM_EXIT_EXCP_BASE + 0x1f: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) * Host-intercepted exceptions have been checked already in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) * nested_svm_exit_special. There is nothing to do here,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) * the vmexit is injected by svm_check_nested_events.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) vmexit = NESTED_EXIT_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) case SVM_EXIT_ERR: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) vmexit = NESTED_EXIT_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) default: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) if (vmcb_is_intercept(&svm->nested.ctl, exit_code))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) vmexit = NESTED_EXIT_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) return vmexit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) int nested_svm_exit_handled(struct vcpu_svm *svm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) int vmexit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) vmexit = nested_svm_intercept(svm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) if (vmexit == NESTED_EXIT_DONE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) nested_svm_vmexit(svm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) return vmexit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) int nested_svm_check_permissions(struct vcpu_svm *svm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) if (!(svm->vcpu.arch.efer & EFER_SVME) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) !is_paging(&svm->vcpu)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) kvm_queue_exception(&svm->vcpu, UD_VECTOR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) if (svm->vmcb->save.cpl) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) kvm_inject_gp(&svm->vcpu, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) static bool nested_exit_on_exception(struct vcpu_svm *svm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) unsigned int nr = svm->vcpu.arch.exception.nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) return (svm->nested.ctl.intercepts[INTERCEPT_EXCEPTION] & BIT(nr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) static void nested_svm_inject_exception_vmexit(struct vcpu_svm *svm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) unsigned int nr = svm->vcpu.arch.exception.nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) svm->vmcb->control.exit_code = SVM_EXIT_EXCP_BASE + nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) svm->vmcb->control.exit_code_hi = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) if (svm->vcpu.arch.exception.has_error_code)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) svm->vmcb->control.exit_info_1 = svm->vcpu.arch.exception.error_code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) * EXITINFO2 is undefined for all exception intercepts other
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) * than #PF.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) if (nr == PF_VECTOR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) if (svm->vcpu.arch.exception.nested_apf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) svm->vmcb->control.exit_info_2 = svm->vcpu.arch.apf.nested_apf_token;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) else if (svm->vcpu.arch.exception.has_payload)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) svm->vmcb->control.exit_info_2 = svm->vcpu.arch.exception.payload;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) svm->vmcb->control.exit_info_2 = svm->vcpu.arch.cr2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) } else if (nr == DB_VECTOR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) /* See inject_pending_event. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) kvm_deliver_exception_payload(&svm->vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) if (svm->vcpu.arch.dr7 & DR7_GD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) svm->vcpu.arch.dr7 &= ~DR7_GD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) kvm_update_dr7(&svm->vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) WARN_ON(svm->vcpu.arch.exception.has_payload);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) nested_svm_vmexit(svm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) static void nested_svm_smi(struct vcpu_svm *svm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) svm->vmcb->control.exit_code = SVM_EXIT_SMI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) svm->vmcb->control.exit_info_1 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) svm->vmcb->control.exit_info_2 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) nested_svm_vmexit(svm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) static void nested_svm_nmi(struct vcpu_svm *svm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) svm->vmcb->control.exit_code = SVM_EXIT_NMI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) svm->vmcb->control.exit_info_1 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) svm->vmcb->control.exit_info_2 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) nested_svm_vmexit(svm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) static void nested_svm_intr(struct vcpu_svm *svm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) trace_kvm_nested_intr_vmexit(svm->vmcb->save.rip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) svm->vmcb->control.exit_code = SVM_EXIT_INTR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) svm->vmcb->control.exit_info_1 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) svm->vmcb->control.exit_info_2 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) nested_svm_vmexit(svm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) static inline bool nested_exit_on_init(struct vcpu_svm *svm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) return vmcb_is_intercept(&svm->nested.ctl, INTERCEPT_INIT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) static void nested_svm_init(struct vcpu_svm *svm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) svm->vmcb->control.exit_code = SVM_EXIT_INIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) svm->vmcb->control.exit_info_1 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) svm->vmcb->control.exit_info_2 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) nested_svm_vmexit(svm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) static int svm_check_nested_events(struct kvm_vcpu *vcpu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) struct vcpu_svm *svm = to_svm(vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) bool block_nested_events =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) kvm_event_needs_reinjection(vcpu) || svm->nested.nested_run_pending;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) struct kvm_lapic *apic = vcpu->arch.apic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) if (lapic_in_kernel(vcpu) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) test_bit(KVM_APIC_INIT, &apic->pending_events)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) if (block_nested_events)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) if (!nested_exit_on_init(svm))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) nested_svm_init(svm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) if (vcpu->arch.exception.pending) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) if (block_nested_events)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) if (!nested_exit_on_exception(svm))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) nested_svm_inject_exception_vmexit(svm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) if (vcpu->arch.smi_pending && !svm_smi_blocked(vcpu)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) if (block_nested_events)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) if (!nested_exit_on_smi(svm))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) nested_svm_smi(svm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) if (vcpu->arch.nmi_pending && !svm_nmi_blocked(vcpu)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) if (block_nested_events)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) if (!nested_exit_on_nmi(svm))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) nested_svm_nmi(svm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) if (kvm_cpu_has_interrupt(vcpu) && !svm_interrupt_blocked(vcpu)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) if (block_nested_events)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) if (!nested_exit_on_intr(svm))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) nested_svm_intr(svm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) int nested_svm_exit_special(struct vcpu_svm *svm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) u32 exit_code = svm->vmcb->control.exit_code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) switch (exit_code) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) case SVM_EXIT_INTR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) case SVM_EXIT_NMI:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) case SVM_EXIT_NPF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) return NESTED_EXIT_HOST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) case SVM_EXIT_EXCP_BASE ... SVM_EXIT_EXCP_BASE + 0x1f: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) u32 excp_bits = 1 << (exit_code - SVM_EXIT_EXCP_BASE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) if (get_host_vmcb(svm)->control.intercepts[INTERCEPT_EXCEPTION] &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) excp_bits)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) return NESTED_EXIT_HOST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) else if (exit_code == SVM_EXIT_EXCP_BASE + PF_VECTOR &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) svm->vcpu.arch.apf.host_apf_flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) /* Trap async PF even if not shadowing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) return NESTED_EXIT_HOST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) return NESTED_EXIT_CONTINUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) static int svm_get_nested_state(struct kvm_vcpu *vcpu,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) struct kvm_nested_state __user *user_kvm_nested_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) u32 user_data_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) struct vcpu_svm *svm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) struct kvm_nested_state kvm_state = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) .flags = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) .format = KVM_STATE_NESTED_FORMAT_SVM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) .size = sizeof(kvm_state),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) struct vmcb __user *user_vmcb = (struct vmcb __user *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) &user_kvm_nested_state->data.svm[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) if (!vcpu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) return kvm_state.size + KVM_STATE_NESTED_SVM_VMCB_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) svm = to_svm(vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) if (user_data_size < kvm_state.size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) /* First fill in the header and copy it out. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) if (is_guest_mode(vcpu)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) kvm_state.hdr.svm.vmcb_pa = svm->nested.vmcb12_gpa;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) kvm_state.size += KVM_STATE_NESTED_SVM_VMCB_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) kvm_state.flags |= KVM_STATE_NESTED_GUEST_MODE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) if (svm->nested.nested_run_pending)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) kvm_state.flags |= KVM_STATE_NESTED_RUN_PENDING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) if (gif_set(svm))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) kvm_state.flags |= KVM_STATE_NESTED_GIF_SET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) if (copy_to_user(user_kvm_nested_state, &kvm_state, sizeof(kvm_state)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) if (!is_guest_mode(vcpu))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) * Copy over the full size of the VMCB rather than just the size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) * of the structs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) if (clear_user(user_vmcb, KVM_STATE_NESTED_SVM_VMCB_SIZE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) if (copy_to_user(&user_vmcb->control, &svm->nested.ctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) sizeof(user_vmcb->control)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) if (copy_to_user(&user_vmcb->save, &svm->nested.hsave->save,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) sizeof(user_vmcb->save)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) return kvm_state.size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) static int svm_set_nested_state(struct kvm_vcpu *vcpu,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) struct kvm_nested_state __user *user_kvm_nested_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) struct kvm_nested_state *kvm_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) struct vcpu_svm *svm = to_svm(vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) struct vmcb *hsave = svm->nested.hsave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) struct vmcb __user *user_vmcb = (struct vmcb __user *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) &user_kvm_nested_state->data.svm[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) struct vmcb_control_area *ctl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) struct vmcb_save_area *save;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) u32 cr0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) BUILD_BUG_ON(sizeof(struct vmcb_control_area) + sizeof(struct vmcb_save_area) >
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) KVM_STATE_NESTED_SVM_VMCB_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) if (kvm_state->format != KVM_STATE_NESTED_FORMAT_SVM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) if (kvm_state->flags & ~(KVM_STATE_NESTED_GUEST_MODE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) KVM_STATE_NESTED_RUN_PENDING |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) KVM_STATE_NESTED_GIF_SET))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) * If in guest mode, vcpu->arch.efer actually refers to the L2 guest's
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) * EFER.SVME, but EFER.SVME still has to be 1 for VMRUN to succeed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) if (!(vcpu->arch.efer & EFER_SVME)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) /* GIF=1 and no guest mode are required if SVME=0. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) if (kvm_state->flags != KVM_STATE_NESTED_GIF_SET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) /* SMM temporarily disables SVM, so we cannot be in guest mode. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) if (is_smm(vcpu) && (kvm_state->flags & KVM_STATE_NESTED_GUEST_MODE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) if (!(kvm_state->flags & KVM_STATE_NESTED_GUEST_MODE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) svm_leave_nested(vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) svm_set_gif(svm, !!(kvm_state->flags & KVM_STATE_NESTED_GIF_SET));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) if (!page_address_valid(vcpu, kvm_state->hdr.svm.vmcb_pa))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) if (kvm_state->size < sizeof(*kvm_state) + KVM_STATE_NESTED_SVM_VMCB_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) ret = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) ctl = kzalloc(sizeof(*ctl), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) save = kzalloc(sizeof(*save), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) if (!ctl || !save)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) ret = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) if (copy_from_user(ctl, &user_vmcb->control, sizeof(*ctl)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) if (copy_from_user(save, &user_vmcb->save, sizeof(*save)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) if (!nested_vmcb_check_controls(ctl))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) * Processor state contains L2 state. Check that it is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) * valid for guest mode (see nested_vmcb_checks).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) cr0 = kvm_read_cr0(vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) if (((cr0 & X86_CR0_CD) == 0) && (cr0 & X86_CR0_NW))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) * Validate host state saved from before VMRUN (see
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) * nested_svm_check_permissions).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) * TODO: validate reserved bits for all saved state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) if (!(save->cr0 & X86_CR0_PG))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) if (!(save->efer & EFER_SVME))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) * All checks done, we can enter guest mode. L1 control fields
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) * come from the nested save state. Guest state is already
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) * in the registers, the save area of the nested state instead
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) * contains saved L1 state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) copy_vmcb_control_area(&hsave->control, &svm->vmcb->control);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) hsave->save = *save;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) if (is_guest_mode(vcpu))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) svm_leave_nested(vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) svm->nested.vmcb12_gpa = kvm_state->hdr.svm.vmcb_pa;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) load_nested_vmcb_control(svm, ctl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) nested_prepare_vmcb_control(svm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) kvm_make_request(KVM_REQ_GET_NESTED_STATE_PAGES, vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) out_free:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) kfree(save);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) kfree(ctl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) struct kvm_x86_nested_ops svm_nested_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) .leave_nested = svm_leave_nested,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) .check_events = svm_check_nested_events,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) .get_nested_state_pages = svm_get_nested_state_pages,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) .get_state = svm_get_nested_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) .set_state = svm_set_nested_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) };