Lines Matching refs:vmcb

159 	struct vmcb *hsave;
162 u64 vmcb; member
195 struct vmcb *vmcb; member
460 static inline void mark_all_dirty(struct vmcb *vmcb) in mark_all_dirty() argument
462 vmcb->control.clean = 0; in mark_all_dirty()
465 static inline void mark_all_clean(struct vmcb *vmcb) in mark_all_clean() argument
467 vmcb->control.clean = ((1 << VMCB_DIRTY_MAX) - 1) in mark_all_clean()
471 static inline void mark_dirty(struct vmcb *vmcb, int bit) in mark_dirty() argument
473 vmcb->control.clean &= ~(1 << bit); in mark_dirty()
483 svm->vmcb->control.avic_vapic_bar = data & VMCB_AVIC_APIC_BAR_MASK; in avic_update_vapic_bar()
484 mark_dirty(svm->vmcb, VMCB_AVIC); in avic_update_vapic_bar()
503 mark_dirty(svm->vmcb, VMCB_INTERCEPTS); in recalc_intercepts()
508 c = &svm->vmcb->control; in recalc_intercepts()
518 static inline struct vmcb *get_host_vmcb(struct vcpu_svm *svm) in get_host_vmcb()
523 return svm->vmcb; in get_host_vmcb()
528 struct vmcb *vmcb = get_host_vmcb(svm); in set_cr_intercept() local
530 vmcb->control.intercept_cr |= (1U << bit); in set_cr_intercept()
537 struct vmcb *vmcb = get_host_vmcb(svm); in clr_cr_intercept() local
539 vmcb->control.intercept_cr &= ~(1U << bit); in clr_cr_intercept()
546 struct vmcb *vmcb = get_host_vmcb(svm); in is_cr_intercept() local
548 return vmcb->control.intercept_cr & (1U << bit); in is_cr_intercept()
553 struct vmcb *vmcb = get_host_vmcb(svm); in set_dr_intercepts() local
555 vmcb->control.intercept_dr = (1 << INTERCEPT_DR0_READ) in set_dr_intercepts()
577 struct vmcb *vmcb = get_host_vmcb(svm); in clr_dr_intercepts() local
579 vmcb->control.intercept_dr = 0; in clr_dr_intercepts()
586 struct vmcb *vmcb = get_host_vmcb(svm); in set_exception_intercept() local
588 vmcb->control.intercept_exceptions |= (1U << bit); in set_exception_intercept()
595 struct vmcb *vmcb = get_host_vmcb(svm); in clr_exception_intercept() local
597 vmcb->control.intercept_exceptions &= ~(1U << bit); in clr_exception_intercept()
604 struct vmcb *vmcb = get_host_vmcb(svm); in set_intercept() local
606 vmcb->control.intercept |= (1ULL << bit); in set_intercept()
613 struct vmcb *vmcb = get_host_vmcb(svm); in clr_intercept() local
615 vmcb->control.intercept &= ~(1ULL << bit); in clr_intercept()
622 return !!(svm->vmcb->control.int_ctl & V_GIF_ENABLE_MASK); in vgif_enabled()
628 svm->vmcb->control.int_ctl |= V_GIF_MASK; in enable_gif()
636 svm->vmcb->control.int_ctl &= ~V_GIF_MASK; in disable_gif()
644 return !!(svm->vmcb->control.int_ctl & V_GIF_MASK); in gif_set()
670 struct vmcb *current_vmcb;
673 struct vmcb **sev_vmcbs;
742 to_svm(vcpu)->vmcb->save.efer = efer | EFER_SVME; in svm_set_efer()
743 mark_dirty(to_svm(vcpu)->vmcb, VMCB_CR); in svm_set_efer()
757 if (svm->vmcb->control.int_state & SVM_INTERRUPT_SHADOW_MASK) in svm_get_interrupt_shadow()
767 svm->vmcb->control.int_state &= ~SVM_INTERRUPT_SHADOW_MASK; in svm_set_interrupt_shadow()
769 svm->vmcb->control.int_state |= SVM_INTERRUPT_SHADOW_MASK; in svm_set_interrupt_shadow()
777 if (svm->vmcb->control.next_rip != 0) { in skip_emulated_instruction()
779 svm->next_rip = svm->vmcb->control.next_rip; in skip_emulated_instruction()
824 svm->int3_rip = rip + svm->vmcb->save.cs.base; in svm_queue_exception()
828 svm->vmcb->control.event_inj = nr in svm_queue_exception()
832 svm->vmcb->control.event_inj_err = error_code; in svm_queue_exception()
1142 svm->vmcb->control.virt_ext |= LBR_CTL_ENABLE_MASK; in svm_enable_lbrv()
1153 svm->vmcb->control.virt_ext &= ~LBR_CTL_ENABLE_MASK; in svm_disable_lbrv()
1167 svm->vmcb->save.rflags &= ~X86_EFLAGS_TF; in disable_nmi_singlestep()
1169 svm->vmcb->save.rflags &= ~X86_EFLAGS_RF; in disable_nmi_singlestep()
1262 struct vmcb_control_area *control = &svm->vmcb->control; in grow_ple_window()
1271 mark_dirty(svm->vmcb, VMCB_INTERCEPTS); in grow_ple_window()
1280 struct vmcb_control_area *control = &svm->vmcb->control; in shrink_ple_window()
1289 mark_dirty(svm->vmcb, VMCB_INTERCEPTS); in shrink_ple_window()
1454 g_tsc_offset = svm->vmcb->control.tsc_offset - in svm_write_tsc_offset()
1459 svm->vmcb->control.tsc_offset, in svm_write_tsc_offset()
1462 svm->vmcb->control.tsc_offset = offset + g_tsc_offset; in svm_write_tsc_offset()
1464 mark_dirty(svm->vmcb, VMCB_INTERCEPTS); in svm_write_tsc_offset()
1469 struct vmcb *vmcb = svm->vmcb; in avic_init_vmcb() local
1475 vmcb->control.avic_backing_page = bpa & AVIC_HPA_MASK; in avic_init_vmcb()
1476 vmcb->control.avic_logical_id = lpa & AVIC_HPA_MASK; in avic_init_vmcb()
1477 vmcb->control.avic_physical_id = ppa & AVIC_HPA_MASK; in avic_init_vmcb()
1478 vmcb->control.avic_physical_id |= AVIC_MAX_PHYSICAL_ID_COUNT; in avic_init_vmcb()
1479 vmcb->control.int_ctl |= AVIC_ENABLE_MASK; in avic_init_vmcb()
1484 struct vmcb_control_area *control = &svm->vmcb->control; in init_vmcb()
1485 struct vmcb_save_area *save = &svm->vmcb->save; in init_vmcb()
1598 svm->nested.vmcb = 0; in init_vmcb()
1620 svm->vmcb->control.virt_ext |= VIRTUAL_VMLOAD_VMSAVE_ENABLE_MASK; in init_vmcb()
1626 svm->vmcb->control.int_ctl |= V_GIF_ENABLE_MASK; in init_vmcb()
1630 svm->vmcb->control.nested_ctl |= SVM_NESTED_CTL_SEV_ENABLE; in init_vmcb()
1634 mark_all_dirty(svm->vmcb); in init_vmcb()
2164 svm->vmcb = page_address(page); in svm_create_vcpu()
2165 clear_page(svm->vmcb); in svm_create_vcpu()
2215 mark_all_dirty(svm->vmcb); in svm_vcpu_load()
2239 if (sd->current_vmcb != svm->vmcb) { in svm_vcpu_load()
2240 sd->current_vmcb = svm->vmcb; in svm_vcpu_load()
2281 unsigned long rflags = svm->vmcb->save.rflags; in svm_get_rflags()
2303 to_svm(vcpu)->vmcb->save.rflags = rflags; in svm_set_rflags()
2330 struct vmcb_save_area *save = &to_svm(vcpu)->vmcb->save; in svm_seg()
2417 var->dpl = to_svm(vcpu)->vmcb->save.cpl; in svm_get_segment()
2424 struct vmcb_save_area *save = &to_svm(vcpu)->vmcb->save; in svm_get_cpl()
2433 dt->size = svm->vmcb->save.idtr.limit; in svm_get_idt()
2434 dt->address = svm->vmcb->save.idtr.base; in svm_get_idt()
2441 svm->vmcb->save.idtr.limit = dt->size; in svm_set_idt()
2442 svm->vmcb->save.idtr.base = dt->address ; in svm_set_idt()
2443 mark_dirty(svm->vmcb, VMCB_DT); in svm_set_idt()
2450 dt->size = svm->vmcb->save.gdtr.limit; in svm_get_gdt()
2451 dt->address = svm->vmcb->save.gdtr.base; in svm_get_gdt()
2458 svm->vmcb->save.gdtr.limit = dt->size; in svm_set_gdt()
2459 svm->vmcb->save.gdtr.base = dt->address ; in svm_set_gdt()
2460 mark_dirty(svm->vmcb, VMCB_DT); in svm_set_gdt()
2478 u64 *hcr0 = &svm->vmcb->save.cr0; in update_cr0_intercept()
2483 mark_dirty(svm->vmcb, VMCB_CR); in update_cr0_intercept()
2502 svm->vmcb->save.efer |= EFER_LMA | EFER_LME; in svm_set_cr0()
2507 svm->vmcb->save.efer &= ~(EFER_LMA | EFER_LME); in svm_set_cr0()
2523 svm->vmcb->save.cr0 = cr0; in svm_set_cr0()
2524 mark_dirty(svm->vmcb, VMCB_CR); in svm_set_cr0()
2531 unsigned long old_cr4 = to_svm(vcpu)->vmcb->save.cr4; in svm_set_cr4()
2543 to_svm(vcpu)->vmcb->save.cr4 = cr4; in svm_set_cr4()
2544 mark_dirty(to_svm(vcpu)->vmcb, VMCB_CR); in svm_set_cr4()
2574 svm->vmcb->save.cpl = (var->dpl & 3); in svm_set_segment()
2576 mark_dirty(svm->vmcb, VMCB_SEG); in svm_set_segment()
2597 svm->vmcb->control.tlb_ctl = TLB_CONTROL_FLUSH_ALL_ASID; in new_asid()
2601 svm->vmcb->control.asid = sd->next_asid++; in new_asid()
2603 mark_dirty(svm->vmcb, VMCB_ASID); in new_asid()
2608 return to_svm(vcpu)->vmcb->save.dr6; in svm_get_dr6()
2615 svm->vmcb->save.dr6 = value; in svm_set_dr6()
2616 mark_dirty(svm->vmcb, VMCB_DR); in svm_set_dr6()
2628 vcpu->arch.dr7 = svm->vmcb->save.dr7; in svm_sync_dirty_debug_regs()
2638 svm->vmcb->save.dr7 = value; in svm_set_dr7()
2639 mark_dirty(svm->vmcb, VMCB_DR); in svm_set_dr7()
2644 u64 fault_address = __sme_clr(svm->vmcb->control.exit_info_2); in pf_interception()
2645 u64 error_code = svm->vmcb->control.exit_info_1; in pf_interception()
2649 svm->vmcb->control.insn_bytes : NULL, in pf_interception()
2650 svm->vmcb->control.insn_len); in pf_interception()
2655 u64 fault_address = __sme_clr(svm->vmcb->control.exit_info_2); in npf_interception()
2656 u64 error_code = svm->vmcb->control.exit_info_1; in npf_interception()
2661 svm->vmcb->control.insn_bytes : NULL, in npf_interception()
2662 svm->vmcb->control.insn_len); in npf_interception()
2684 svm->vmcb->save.cs.base + svm->vmcb->save.rip; in db_interception()
2697 kvm_run->debug.arch.pc = svm->vmcb->save.cs.base + svm->vmcb->save.rip; in bp_interception()
2716 u32 error_code = svm->vmcb->control.exit_info_1; in gp_interception()
2807 clear_page(svm->vmcb); in shutdown_interception()
2817 u32 io_info = svm->vmcb->control.exit_info_1; /* address size bug? */ in io_interception()
2829 svm->next_rip = svm->vmcb->control.exit_info_2; in io_interception()
2888 svm->vmcb->control.nested_cr3 = __sme_set(root); in nested_svm_set_tdp_cr3()
2889 mark_dirty(svm->vmcb, VMCB_NPT); in nested_svm_set_tdp_cr3()
2897 if (svm->vmcb->control.exit_code != SVM_EXIT_NPF) { in nested_svm_inject_npf_exit()
2902 svm->vmcb->control.exit_code = SVM_EXIT_NPF; in nested_svm_inject_npf_exit()
2903 svm->vmcb->control.exit_code_hi = 0; in nested_svm_inject_npf_exit()
2904 svm->vmcb->control.exit_info_1 = (1ULL << 32); in nested_svm_inject_npf_exit()
2905 svm->vmcb->control.exit_info_2 = fault->address; in nested_svm_inject_npf_exit()
2908 svm->vmcb->control.exit_info_1 &= ~0xffffffffULL; in nested_svm_inject_npf_exit()
2909 svm->vmcb->control.exit_info_1 |= fault->error_code; in nested_svm_inject_npf_exit()
2915 if (svm->vmcb->control.exit_info_1 & (2ULL << 32)) in nested_svm_inject_npf_exit()
2916 svm->vmcb->control.exit_info_1 &= ~1; in nested_svm_inject_npf_exit()
2947 if (svm->vmcb->save.cpl) { in nested_svm_check_permissions()
2967 svm->vmcb->control.exit_code = SVM_EXIT_EXCP_BASE + nr; in nested_svm_check_exception()
2968 svm->vmcb->control.exit_code_hi = 0; in nested_svm_check_exception()
2969 svm->vmcb->control.exit_info_1 = error_code; in nested_svm_check_exception()
2981 svm->vmcb->control.exit_info_2 = svm->vcpu.arch.apf.nested_apf_token; in nested_svm_check_exception()
2983 svm->vmcb->control.exit_info_2 = svm->vcpu.arch.cr2; in nested_svm_check_exception()
3009 svm->vmcb->control.exit_code = SVM_EXIT_INTR; in nested_svm_intr()
3010 svm->vmcb->control.exit_info_1 = 0; in nested_svm_intr()
3011 svm->vmcb->control.exit_info_2 = 0; in nested_svm_intr()
3021 trace_kvm_nested_intr_vmexit(svm->vmcb->save.rip); in nested_svm_intr()
3037 svm->vmcb->control.exit_code = SVM_EXIT_NMI; in nested_svm_nmi()
3079 port = svm->vmcb->control.exit_info_1 >> 16; in nested_svm_intercept_ioio()
3080 size = (svm->vmcb->control.exit_info_1 & SVM_IOIO_SIZE_MASK) >> in nested_svm_intercept_ioio()
3104 write = svm->vmcb->control.exit_info_1 & 1; in nested_svm_exit_handled_msr()
3146 u32 exit_code = svm->vmcb->control.exit_code; in nested_svm_exit_special()
3175 u32 exit_code = svm->vmcb->control.exit_code; in nested_svm_intercept()
3237 static inline void copy_vmcb_control_area(struct vmcb *dst_vmcb, struct vmcb *from_vmcb) in copy_vmcb_control_area()
3269 struct vmcb *nested_vmcb; in nested_svm_vmexit()
3270 struct vmcb *hsave = svm->nested.hsave; in nested_svm_vmexit()
3271 struct vmcb *vmcb = svm->vmcb; in nested_svm_vmexit() local
3274 trace_kvm_nested_vmexit_inject(vmcb->control.exit_code, in nested_svm_vmexit()
3275 vmcb->control.exit_info_1, in nested_svm_vmexit()
3276 vmcb->control.exit_info_2, in nested_svm_vmexit()
3277 vmcb->control.exit_int_info, in nested_svm_vmexit()
3278 vmcb->control.exit_int_info_err, in nested_svm_vmexit()
3281 nested_vmcb = nested_svm_map(svm, svm->nested.vmcb, &page); in nested_svm_vmexit()
3287 svm->nested.vmcb = 0; in nested_svm_vmexit()
3292 nested_vmcb->save.es = vmcb->save.es; in nested_svm_vmexit()
3293 nested_vmcb->save.cs = vmcb->save.cs; in nested_svm_vmexit()
3294 nested_vmcb->save.ss = vmcb->save.ss; in nested_svm_vmexit()
3295 nested_vmcb->save.ds = vmcb->save.ds; in nested_svm_vmexit()
3296 nested_vmcb->save.gdtr = vmcb->save.gdtr; in nested_svm_vmexit()
3297 nested_vmcb->save.idtr = vmcb->save.idtr; in nested_svm_vmexit()
3301 nested_vmcb->save.cr2 = vmcb->save.cr2; in nested_svm_vmexit()
3304 nested_vmcb->save.rip = vmcb->save.rip; in nested_svm_vmexit()
3305 nested_vmcb->save.rsp = vmcb->save.rsp; in nested_svm_vmexit()
3306 nested_vmcb->save.rax = vmcb->save.rax; in nested_svm_vmexit()
3307 nested_vmcb->save.dr7 = vmcb->save.dr7; in nested_svm_vmexit()
3308 nested_vmcb->save.dr6 = vmcb->save.dr6; in nested_svm_vmexit()
3309 nested_vmcb->save.cpl = vmcb->save.cpl; in nested_svm_vmexit()
3311 nested_vmcb->control.int_ctl = vmcb->control.int_ctl; in nested_svm_vmexit()
3312 nested_vmcb->control.int_vector = vmcb->control.int_vector; in nested_svm_vmexit()
3313 nested_vmcb->control.int_state = vmcb->control.int_state; in nested_svm_vmexit()
3314 nested_vmcb->control.exit_code = vmcb->control.exit_code; in nested_svm_vmexit()
3315 nested_vmcb->control.exit_code_hi = vmcb->control.exit_code_hi; in nested_svm_vmexit()
3316 nested_vmcb->control.exit_info_1 = vmcb->control.exit_info_1; in nested_svm_vmexit()
3317 nested_vmcb->control.exit_info_2 = vmcb->control.exit_info_2; in nested_svm_vmexit()
3318 nested_vmcb->control.exit_int_info = vmcb->control.exit_int_info; in nested_svm_vmexit()
3319 nested_vmcb->control.exit_int_info_err = vmcb->control.exit_int_info_err; in nested_svm_vmexit()
3322 nested_vmcb->control.next_rip = vmcb->control.next_rip; in nested_svm_vmexit()
3332 if (vmcb->control.event_inj & SVM_EVTINJ_VALID) { in nested_svm_vmexit()
3335 nc->exit_int_info = vmcb->control.event_inj; in nested_svm_vmexit()
3336 nc->exit_int_info_err = vmcb->control.event_inj_err; in nested_svm_vmexit()
3348 copy_vmcb_control_area(vmcb, hsave); in nested_svm_vmexit()
3350 svm->vcpu.arch.tsc_offset = svm->vmcb->control.tsc_offset; in nested_svm_vmexit()
3357 svm->vmcb->save.es = hsave->save.es; in nested_svm_vmexit()
3358 svm->vmcb->save.cs = hsave->save.cs; in nested_svm_vmexit()
3359 svm->vmcb->save.ss = hsave->save.ss; in nested_svm_vmexit()
3360 svm->vmcb->save.ds = hsave->save.ds; in nested_svm_vmexit()
3361 svm->vmcb->save.gdtr = hsave->save.gdtr; in nested_svm_vmexit()
3362 svm->vmcb->save.idtr = hsave->save.idtr; in nested_svm_vmexit()
3368 svm->vmcb->save.cr3 = hsave->save.cr3; in nested_svm_vmexit()
3376 svm->vmcb->save.dr7 = 0; in nested_svm_vmexit()
3377 svm->vmcb->save.cpl = 0; in nested_svm_vmexit()
3378 svm->vmcb->control.exit_int_info = 0; in nested_svm_vmexit()
3380 mark_all_dirty(svm->vmcb); in nested_svm_vmexit()
3419 svm->vmcb->control.msrpm_base_pa = __sme_set(__pa(svm->nested.msrpm)); in nested_svm_vmrun_msrpm()
3424 static bool nested_vmcb_checks(struct vmcb *vmcb) in nested_vmcb_checks() argument
3426 if ((vmcb->control.intercept & (1ULL << INTERCEPT_VMRUN)) == 0) in nested_vmcb_checks()
3429 if (vmcb->control.asid == 0) in nested_vmcb_checks()
3432 if ((vmcb->control.nested_ctl & SVM_NESTED_CTL_NP_ENABLE) && in nested_vmcb_checks()
3440 struct vmcb *nested_vmcb, struct page *page) in enter_svm_guest_mode()
3454 svm->vmcb->save.es = nested_vmcb->save.es; in enter_svm_guest_mode()
3455 svm->vmcb->save.cs = nested_vmcb->save.cs; in enter_svm_guest_mode()
3456 svm->vmcb->save.ss = nested_vmcb->save.ss; in enter_svm_guest_mode()
3457 svm->vmcb->save.ds = nested_vmcb->save.ds; in enter_svm_guest_mode()
3458 svm->vmcb->save.gdtr = nested_vmcb->save.gdtr; in enter_svm_guest_mode()
3459 svm->vmcb->save.idtr = nested_vmcb->save.idtr; in enter_svm_guest_mode()
3465 svm->vmcb->save.cr3 = nested_vmcb->save.cr3; in enter_svm_guest_mode()
3473 svm->vmcb->save.cr2 = svm->vcpu.arch.cr2 = nested_vmcb->save.cr2; in enter_svm_guest_mode()
3479 svm->vmcb->save.rax = nested_vmcb->save.rax; in enter_svm_guest_mode()
3480 svm->vmcb->save.rsp = nested_vmcb->save.rsp; in enter_svm_guest_mode()
3481 svm->vmcb->save.rip = nested_vmcb->save.rip; in enter_svm_guest_mode()
3482 svm->vmcb->save.dr7 = nested_vmcb->save.dr7; in enter_svm_guest_mode()
3483 svm->vmcb->save.dr6 = nested_vmcb->save.dr6; in enter_svm_guest_mode()
3484 svm->vmcb->save.cpl = nested_vmcb->save.cpl; in enter_svm_guest_mode()
3496 svm->vmcb->control.int_ctl = nested_vmcb->control.int_ctl | V_INTR_MASKING_MASK; in enter_svm_guest_mode()
3512 svm->vmcb->control.tsc_offset = svm->vcpu.arch.tsc_offset; in enter_svm_guest_mode()
3514 svm->vmcb->control.virt_ext = nested_vmcb->control.virt_ext; in enter_svm_guest_mode()
3515 svm->vmcb->control.int_vector = nested_vmcb->control.int_vector; in enter_svm_guest_mode()
3516 svm->vmcb->control.int_state = nested_vmcb->control.int_state; in enter_svm_guest_mode()
3517 svm->vmcb->control.event_inj = nested_vmcb->control.event_inj; in enter_svm_guest_mode()
3518 svm->vmcb->control.event_inj_err = nested_vmcb->control.event_inj_err; in enter_svm_guest_mode()
3531 svm->nested.vmcb = vmcb_gpa; in enter_svm_guest_mode()
3535 mark_all_dirty(svm->vmcb); in enter_svm_guest_mode()
3540 struct vmcb *nested_vmcb; in nested_svm_vmrun()
3541 struct vmcb *hsave = svm->nested.hsave; in nested_svm_vmrun()
3542 struct vmcb *vmcb = svm->vmcb; in nested_svm_vmrun() local
3546 vmcb_gpa = svm->vmcb->save.rax; in nested_svm_vmrun()
3548 nested_vmcb = nested_svm_map(svm, svm->vmcb->save.rax, &page); in nested_svm_vmrun()
3563 trace_kvm_nested_vmrun(svm->vmcb->save.rip, vmcb_gpa, in nested_svm_vmrun()
3582 hsave->save.es = vmcb->save.es; in nested_svm_vmrun()
3583 hsave->save.cs = vmcb->save.cs; in nested_svm_vmrun()
3584 hsave->save.ss = vmcb->save.ss; in nested_svm_vmrun()
3585 hsave->save.ds = vmcb->save.ds; in nested_svm_vmrun()
3586 hsave->save.gdtr = vmcb->save.gdtr; in nested_svm_vmrun()
3587 hsave->save.idtr = vmcb->save.idtr; in nested_svm_vmrun()
3593 hsave->save.rsp = vmcb->save.rsp; in nested_svm_vmrun()
3594 hsave->save.rax = vmcb->save.rax; in nested_svm_vmrun()
3596 hsave->save.cr3 = vmcb->save.cr3; in nested_svm_vmrun()
3600 copy_vmcb_control_area(hsave, vmcb); in nested_svm_vmrun()
3607 static void nested_svm_vmloadsave(struct vmcb *from_vmcb, struct vmcb *to_vmcb) in nested_svm_vmloadsave()
3625 struct vmcb *nested_vmcb; in vmload_interception()
3632 nested_vmcb = nested_svm_map(svm, svm->vmcb->save.rax, &page); in vmload_interception()
3639 nested_svm_vmloadsave(nested_vmcb, svm->vmcb); in vmload_interception()
3647 struct vmcb *nested_vmcb; in vmsave_interception()
3654 nested_vmcb = nested_svm_map(svm, svm->vmcb->save.rax, &page); in vmsave_interception()
3661 nested_svm_vmloadsave(svm->vmcb, nested_vmcb); in vmsave_interception()
3685 svm->vmcb->control.exit_code = SVM_EXIT_ERR; in vmrun_interception()
3686 svm->vmcb->control.exit_code_hi = 0; in vmrun_interception()
3687 svm->vmcb->control.exit_info_1 = 0; in vmrun_interception()
3688 svm->vmcb->control.exit_info_2 = 0; in vmrun_interception()
3733 svm->vmcb->control.int_ctl &= ~V_IRQ_MASK; in clgi_interception()
3734 mark_dirty(svm->vmcb, VMCB_INTR); in clgi_interception()
3744 trace_kvm_invlpga(svm->vmcb->save.rip, kvm_register_read(&svm->vcpu, VCPU_REGS_RCX), in invlpga_interception()
3756 trace_kvm_skinit(svm->vmcb->save.rip, kvm_register_read(&svm->vcpu, VCPU_REGS_RAX)); in skinit_interception()
3784 int int_type = svm->vmcb->control.exit_int_info & in task_switch_interception()
3786 int int_vec = svm->vmcb->control.exit_int_info & SVM_EVTINJ_VEC_MASK; in task_switch_interception()
3788 svm->vmcb->control.exit_int_info & SVM_EXITINTINFO_TYPE_MASK; in task_switch_interception()
3790 svm->vmcb->control.exit_int_info & SVM_EXITINTINFO_VALID; in task_switch_interception()
3794 tss_selector = (u16)svm->vmcb->control.exit_info_1; in task_switch_interception()
3796 if (svm->vmcb->control.exit_info_2 & in task_switch_interception()
3799 else if (svm->vmcb->control.exit_info_2 & in task_switch_interception()
3813 if (svm->vmcb->control.exit_info_2 & in task_switch_interception()
3817 (u32)svm->vmcb->control.exit_info_2; in task_switch_interception()
3869 kvm_mmu_invlpg(&svm->vcpu, svm->vmcb->control.exit_info_1); in invlpg_interception()
3912 svm->vmcb->control.exit_code = SVM_EXIT_CR0_SEL_WRITE; in check_selective_cr0_intercepted()
3930 if (unlikely((svm->vmcb->control.exit_info_1 & CR_VALID) == 0)) in cr_interception()
3933 reg = svm->vmcb->control.exit_info_1 & SVM_EXITINFO_REG_MASK; in cr_interception()
3934 if (svm->vmcb->control.exit_code == SVM_EXIT_CR0_SEL_WRITE) in cr_interception()
3937 cr = svm->vmcb->control.exit_code - SVM_EXIT_READ_CR0; in cr_interception()
4011 reg = svm->vmcb->control.exit_info_1 & SVM_EXITINFO_REG_MASK; in dr_interception()
4012 dr = svm->vmcb->control.exit_code - SVM_EXIT_READ_DR0; in dr_interception()
4067 msr_info->data = svm->vmcb->save.star; in svm_get_msr()
4071 msr_info->data = svm->vmcb->save.lstar; in svm_get_msr()
4074 msr_info->data = svm->vmcb->save.cstar; in svm_get_msr()
4077 msr_info->data = svm->vmcb->save.kernel_gs_base; in svm_get_msr()
4080 msr_info->data = svm->vmcb->save.sfmask; in svm_get_msr()
4084 msr_info->data = svm->vmcb->save.sysenter_cs; in svm_get_msr()
4103 msr_info->data = svm->vmcb->save.dbgctl; in svm_get_msr()
4106 msr_info->data = svm->vmcb->save.br_from; in svm_get_msr()
4109 msr_info->data = svm->vmcb->save.br_to; in svm_get_msr()
4112 msr_info->data = svm->vmcb->save.last_excp_from; in svm_get_msr()
4115 msr_info->data = svm->vmcb->save.last_excp_to; in svm_get_msr()
4223 svm->vmcb->save.g_pat = data; in svm_set_msr()
4224 mark_dirty(svm->vmcb, VMCB_NPT); in svm_set_msr()
4281 svm->vmcb->save.star = data; in svm_set_msr()
4285 svm->vmcb->save.lstar = data; in svm_set_msr()
4288 svm->vmcb->save.cstar = data; in svm_set_msr()
4291 svm->vmcb->save.kernel_gs_base = data; in svm_set_msr()
4294 svm->vmcb->save.sfmask = data; in svm_set_msr()
4298 svm->vmcb->save.sysenter_cs = data; in svm_set_msr()
4302 svm->vmcb->save.sysenter_eip = data; in svm_set_msr()
4306 svm->vmcb->save.sysenter_esp = data; in svm_set_msr()
4329 svm->vmcb->save.dbgctl = data; in svm_set_msr()
4330 mark_dirty(svm->vmcb, VMCB_LBR); in svm_set_msr()
4395 if (svm->vmcb->control.exit_info_1) in msr_interception()
4405 svm->vmcb->control.int_ctl &= ~V_IRQ_MASK; in interrupt_window_interception()
4406 mark_dirty(svm->vmcb, VMCB_INTR); in interrupt_window_interception()
4449 u32 icrh = svm->vmcb->control.exit_info_1 >> 32; in avic_incomplete_ipi_interception()
4450 u32 icrl = svm->vmcb->control.exit_info_1; in avic_incomplete_ipi_interception()
4451 u32 id = svm->vmcb->control.exit_info_2 >> 32; in avic_incomplete_ipi_interception()
4452 u32 index = svm->vmcb->control.exit_info_2 & 0xFF; in avic_incomplete_ipi_interception()
4634 u32 offset = svm->vmcb->control.exit_info_1 & in avic_unaccel_trap_write()
4690 u32 offset = svm->vmcb->control.exit_info_1 & in avic_unaccelerated_access_interception()
4692 u32 vector = svm->vmcb->control.exit_info_2 & in avic_unaccelerated_access_interception()
4694 bool write = (svm->vmcb->control.exit_info_1 >> 32) & in avic_unaccelerated_access_interception()
4782 struct vmcb_control_area *control = &svm->vmcb->control; in dump_vmcb()
4783 struct vmcb_save_area *save = &svm->vmcb->save; in dump_vmcb()
4892 struct vmcb_control_area *control = &to_svm(vcpu)->vmcb->control; in svm_get_exit_info()
4902 u32 exit_code = svm->vmcb->control.exit_code; in handle_exit()
4907 vcpu->arch.cr0 = svm->vmcb->save.cr0; in handle_exit()
4909 vcpu->arch.cr3 = svm->vmcb->save.cr3; in handle_exit()
4921 trace_kvm_nested_vmexit(svm->vmcb->save.rip, exit_code, in handle_exit()
4922 svm->vmcb->control.exit_info_1, in handle_exit()
4923 svm->vmcb->control.exit_info_2, in handle_exit()
4924 svm->vmcb->control.exit_int_info, in handle_exit()
4925 svm->vmcb->control.exit_int_info_err, in handle_exit()
4939 if (svm->vmcb->control.exit_code == SVM_EXIT_ERR) { in handle_exit()
4942 = svm->vmcb->control.exit_code; in handle_exit()
4948 if (is_external_interrupt(svm->vmcb->control.exit_int_info) && in handle_exit()
4954 __func__, svm->vmcb->control.exit_int_info, in handle_exit()
4982 svm->vmcb->control.asid = asid; in pre_sev_run()
4990 if (sd->sev_vmcbs[asid] == svm->vmcb && in pre_sev_run()
4995 sd->sev_vmcbs[asid] = svm->vmcb; in pre_sev_run()
4996 svm->vmcb->control.tlb_ctl = TLB_CONTROL_FLUSH_ASID; in pre_sev_run()
4997 mark_dirty(svm->vmcb, VMCB_ASID); in pre_sev_run()
5018 svm->vmcb->control.event_inj = SVM_EVTINJ_VALID | SVM_EVTINJ_TYPE_NMI; in svm_inject_nmi()
5029 control = &svm->vmcb->control; in svm_inject_irq()
5034 mark_dirty(svm->vmcb, VMCB_INTR); in svm_inject_irq()
5046 svm->vmcb->control.event_inj = vcpu->arch.interrupt.nr | in svm_set_irq()
5094 struct vmcb *vmcb = svm->vmcb; in svm_refresh_apicv_exec_ctrl() local
5099 vmcb->control.int_ctl &= ~AVIC_ENABLE_MASK; in svm_refresh_apicv_exec_ctrl()
5100 mark_dirty(vmcb, VMCB_INTR); in svm_refresh_apicv_exec_ctrl()
5326 struct vmcb *vmcb = svm->vmcb; in svm_nmi_allowed() local
5328 ret = !(vmcb->control.int_state & SVM_INTERRUPT_SHADOW_MASK) && in svm_nmi_allowed()
5358 struct vmcb *vmcb = svm->vmcb; in svm_interrupt_allowed() local
5362 (vmcb->control.int_state & SVM_INTERRUPT_SHADOW_MASK)) in svm_interrupt_allowed()
5417 svm->vmcb->save.rflags |= (X86_EFLAGS_TF | X86_EFLAGS_RF); in enable_nmi_window()
5435 svm->vmcb->control.tlb_ctl = TLB_CONTROL_FLUSH_ASID; in svm_flush_tlb()
5444 invlpga(gva, svm->vmcb->control.asid); in svm_flush_tlb_gva()
5459 int cr8 = svm->vmcb->control.int_ctl & V_TPR_MASK; in sync_cr8_to_lapic()
5474 svm->vmcb->control.int_ctl &= ~V_TPR_MASK; in sync_lapic_to_cr8()
5475 svm->vmcb->control.int_ctl |= cr8 & V_TPR_MASK; in sync_lapic_to_cr8()
5482 u32 exitintinfo = svm->vmcb->control.exit_int_info; in svm_complete_interrupts()
5528 u32 err = svm->vmcb->control.exit_int_info_err; in svm_complete_interrupts()
5545 struct vmcb_control_area *control = &svm->vmcb->control; in svm_cancel_injection()
5557 svm->vmcb->save.rax = vcpu->arch.regs[VCPU_REGS_RAX]; in svm_vcpu_run()
5558 svm->vmcb->save.rsp = vcpu->arch.regs[VCPU_REGS_RSP]; in svm_vcpu_run()
5559 svm->vmcb->save.rip = vcpu->arch.regs[VCPU_REGS_RIP]; in svm_vcpu_run()
5574 if (svm->nmi_singlestep && svm->vmcb->control.event_inj) { in svm_vcpu_run()
5588 svm->vmcb->save.cr2 = vcpu->arch.cr2; in svm_vcpu_run()
5668 [vmcb]"i"(offsetof(struct vcpu_svm, vmcb_pa)), in svm_vcpu_run()
5730 vcpu->arch.cr2 = svm->vmcb->save.cr2; in svm_vcpu_run()
5731 vcpu->arch.regs[VCPU_REGS_RAX] = svm->vmcb->save.rax; in svm_vcpu_run()
5732 vcpu->arch.regs[VCPU_REGS_RSP] = svm->vmcb->save.rsp; in svm_vcpu_run()
5733 vcpu->arch.regs[VCPU_REGS_RIP] = svm->vmcb->save.rip; in svm_vcpu_run()
5735 if (unlikely(svm->vmcb->control.exit_code == SVM_EXIT_NMI)) in svm_vcpu_run()
5742 if (unlikely(svm->vmcb->control.exit_code == SVM_EXIT_NMI)) in svm_vcpu_run()
5749 svm->vmcb->control.tlb_ctl = TLB_CONTROL_DO_NOTHING; in svm_vcpu_run()
5752 if (svm->vmcb->control.exit_code == SVM_EXIT_EXCP_BASE + PF_VECTOR) in svm_vcpu_run()
5764 if (unlikely(svm->vmcb->control.exit_code == in svm_vcpu_run()
5768 mark_all_clean(svm->vmcb); in svm_vcpu_run()
5776 svm->vmcb->save.cr3 = __sme_set(root); in svm_set_cr3()
5777 mark_dirty(svm->vmcb, VMCB_CR); in svm_set_cr3()
5784 svm->vmcb->control.nested_cr3 = __sme_set(root); in set_tdp_cr3()
5785 mark_dirty(svm->vmcb, VMCB_NPT); in set_tdp_cr3()
5788 svm->vmcb->save.cr3 = kvm_read_cr3(vcpu); in set_tdp_cr3()
5789 mark_dirty(svm->vmcb, VMCB_CR); in set_tdp_cr3()
5989 struct vmcb *vmcb = svm->vmcb; in svm_check_intercept() local
6042 vmcb->control.exit_info_1 = 1; in svm_check_intercept()
6044 vmcb->control.exit_info_1 = 0; in svm_check_intercept()
6081 vmcb->control.exit_info_1 = exit_info; in svm_check_intercept()
6082 vmcb->control.exit_info_2 = info->next_rip; in svm_check_intercept()
6092 vmcb->control.next_rip = info->next_rip; in svm_check_intercept()
6093 vmcb->control.exit_code = icpt_info.exit_code; in svm_check_intercept()
6146 svm->vmcb->control.exit_code = SVM_EXIT_SMI; in svm_smi_allowed()
6163 put_smstate(u64, smstate, 0x7ee0, svm->nested.vmcb); in svm_pre_enter_smm()
6165 svm->vmcb->save.rax = vcpu->arch.regs[VCPU_REGS_RAX]; in svm_pre_enter_smm()
6166 svm->vmcb->save.rsp = vcpu->arch.regs[VCPU_REGS_RSP]; in svm_pre_enter_smm()
6167 svm->vmcb->save.rip = vcpu->arch.regs[VCPU_REGS_RIP]; in svm_pre_enter_smm()
6179 struct vmcb *nested_vmcb; in svm_pre_leave_smm()
6183 u64 vmcb; in svm_pre_leave_smm() member
6194 nested_vmcb = nested_svm_map(svm, svm_state_save.vmcb, &page); in svm_pre_leave_smm()
6196 enter_svm_guest_mode(svm, svm_state_save.vmcb, nested_vmcb, page); in svm_pre_leave_smm()