vmcs
struct kvm_context __percpu *vmcs;
static struct kvm_context __percpu *vmcs;
context = per_cpu_ptr(vcpu->kvm->arch.vmcs, cpu);
context = per_cpu_ptr(vcpu->kvm->arch.vmcs, cpu);
kvm->arch.vmcs = vmcs;
this_cpu_ptr(vmcs)->last_vcpu = NULL;
vmcs = alloc_percpu(struct kvm_context);
if (!vmcs) {
free_percpu(vmcs);
vmcs = NULL;
free_percpu(vmcs);
vmcs = NULL;
context = per_cpu_ptr(vmcs, cpu);
if (vmcs)
free_percpu(vmcs);
context = per_cpu_ptr(vcpu->kvm->arch.vmcs, cpu);
context = per_cpu_ptr(vcpu->kvm->arch.vmcs, cpu);
context = this_cpu_ptr(vcpu->kvm->arch.vmcs);
context = this_cpu_ptr(vcpu->kvm->arch.vmcs);
struct vmcs *shadow_vmcs = vmx->vmcs01.shadow_vmcs;
vmcs_load(vmx->loaded_vmcs->vmcs);
struct vmcs *shadow_vmcs = vmx->vmcs01.shadow_vmcs;
vmcs_load(vmx->loaded_vmcs->vmcs);
static void vmx_switch_vmcs(struct kvm_vcpu *vcpu, struct loaded_vmcs *vmcs)
if (WARN_ON_ONCE(vmx->loaded_vmcs == vmcs))
vmx->loaded_vmcs = vmcs;
static struct vmcs *alloc_shadow_vmcs(struct kvm_vcpu *vcpu)
vmcs_load(vmx->loaded_vmcs->vmcs);
TDX_BUILD_TDVPS_ACCESSORS(16, VMCS, vmcs);
TDX_BUILD_TDVPS_ACCESSORS(32, VMCS, vmcs);
TDX_BUILD_TDVPS_ACCESSORS(64, VMCS, vmcs);
DECLARE_PER_CPU(struct vmcs *, current_vmcs);
struct vmcs *vmcs;
struct vmcs *shadow_vmcs;
struct vmcs *prev;
if (prev != vmx->loaded_vmcs->vmcs) {
per_cpu(current_vmcs, cpu) = vmx->loaded_vmcs->vmcs;
vmcs_load(vmx->loaded_vmcs->vmcs);
struct loaded_vmcs *vmcs)
vmx->loaded_vmcs = vmcs;
struct vmcs *alloc_vmcs_cpu(bool shadow, int cpu, gfp_t flags)
struct vmcs *vmcs;
vmcs = page_address(pages);
memset(vmcs, 0, vmx_basic_vmcs_size(vmcs_config.basic));
vmcs->hdr.revision_id = KVM_EVMCS_VERSION;
vmcs->hdr.revision_id = vmx_basic_vmcs_revision_id(vmcs_config.basic);
vmcs->hdr.shadow_vmcs = 1;
return vmcs;
void free_vmcs(struct vmcs *vmcs)
free_page((unsigned long)vmcs);
if (!loaded_vmcs->vmcs)
free_vmcs(loaded_vmcs->vmcs);
loaded_vmcs->vmcs = NULL;
loaded_vmcs->vmcs = alloc_vmcs(false);
if (!loaded_vmcs->vmcs)
vmcs_clear(loaded_vmcs->vmcs);
struct vmcs *vmcs;
vmcs = alloc_vmcs_cpu(false, cpu, GFP_KERNEL);
if (!vmcs) {
vmcs->hdr.revision_id = vmx_basic_vmcs_revision_id(vmcs_config.basic);
per_cpu(vmxarea, cpu) = vmcs;
struct hv_enlightened_vmcs *evmcs = (void *)vmx->vmcs01.vmcs;
noinline void vmclear_error(struct vmcs *vmcs, u64 phys_addr)
vmcs, phys_addr, vmcs_read32(VM_INSTRUCTION_ERROR));
noinline void vmptrld_error(struct vmcs *vmcs, u64 phys_addr)
vmcs, phys_addr, vmcs_read32(VM_INSTRUCTION_ERROR));
static DEFINE_PER_CPU(struct vmcs *, vmxarea);
DEFINE_PER_CPU(struct vmcs *, current_vmcs);
evmcs = (struct hv_enlightened_vmcs *)to_vmx(vcpu)->loaded_vmcs->vmcs;
vmx->loaded_vmcs->vmcs, vcpu->arch.last_vmentry_cpu);
struct hv_enlightened_vmcs *evmcs = (void *)vmx->vmcs01.vmcs;
vmcs_clear(v->vmcs);
if (per_cpu(current_vmcs, cpu) == loaded_vmcs->vmcs)
vmcs_clear(loaded_vmcs->vmcs);
static inline u##bits __##lname##_controls_get(struct loaded_vmcs *vmcs) \
return vmcs->controls_shadow.lname; \
struct vmcs *alloc_vmcs_cpu(bool shadow, int cpu, gfp_t flags);
void free_vmcs(struct vmcs *vmcs);
static inline struct vmcs *alloc_vmcs(bool shadow)
void vmclear_error(struct vmcs *vmcs, u64 phys_addr);
void vmptrld_error(struct vmcs *vmcs, u64 phys_addr);
static inline void vmcs_clear(struct vmcs *vmcs)
u64 phys_addr = __pa(vmcs);
vmx_asm1(vmclear, "m"(phys_addr), vmcs, phys_addr);
static inline void vmcs_load(struct vmcs *vmcs)
u64 phys_addr = __pa(vmcs);
vmx_asm1(vmptrld, "m"(phys_addr), vmcs, phys_addr);
struct intel_pt_vmcs_info *(*findnew_vmcs_info)(void *data, uint64_t vmcs);
uint64_t vmcs;
bool tsc, pip, vmcs, tma, psbend;
data->vmcs = true;
payload, decoder->packet.payload, vmcs_info->vmcs,
.vmcs = NO_VMCS,
vmcs_info->vmcs, vmcs_info->tsc_offset);
uint64_t vmcs;
vmcs = data->vmcs ? data->vmcs_packet.payload : decoder->vmcs;
if (vmcs == NO_VMCS)
vmcs = 0;
vmcs_info = decoder->findnew_vmcs_info(decoder->data, vmcs);
if (vmcs_info && vmcs_info->vmcs) {
vmcs_info->vmcs);
uint64_t vmcs;
vmcs = decoder->vmcs;
if (vmcs == NO_VMCS)
vmcs = 0;
vmcs_info = decoder->findnew_vmcs_info(decoder->data, vmcs);
guest_tsc, host_tsc, vmcs_info->vmcs,
decoder->vmcs = decoder->packet.payload;
uint64_t vmcs;
struct intel_pt_vmcs_info *(*findnew_vmcs_info)(void *data, uint64_t vmcs);
u64 vmcs,
if (v->vmcs == vmcs)
if (vmcs < v->vmcs)
v->vmcs = vmcs;
static struct intel_pt_vmcs_info *intel_pt_findnew_vmcs_info(void *data, uint64_t vmcs)
if (!vmcs && !pt->dflt_tsc_offset)
return intel_pt_findnew_vmcs(&pt->vmcs_info, vmcs, pt->dflt_tsc_offset);
u64 tsc_offset, vmcs;
vmcs = strtoull(p, &p, 0);
if (!vmcs)
vmcs_info = intel_pt_findnew_vmcs(&pt->vmcs_info, vmcs, tsc_offset);
static inline int evmcs_vmptrld(uint64_t vmcs_pa, void *vmcs)
current_evmcs = vmcs;
void *vmcs;
*(uint32_t *)(vmx->vmcs) = vmcs_revision();
vmx->vmcs = (void *)vm_vaddr_alloc_page(vm);
vmx->vmcs_hva = addr_gva2hva(vm, (uintptr_t)vmx->vmcs);
vmx->vmcs_gpa = addr_gva2gpa(vm, (uintptr_t)vmx->vmcs);