Lines Matching defs:vmcs

61 ExitInfo::ExitInfo(const AutoVmcs& vmcs) {
63 uint32_t full_exit_reason = vmcs.Read(VmcsField32::EXIT_REASON);
67 exit_qualification = vmcs.Read(VmcsFieldXX::EXIT_QUALIFICATION);
68 exit_instruction_length = vmcs.Read(VmcsField32::EXIT_INSTRUCTION_LENGTH);
69 guest_physical_address = vmcs.Read(VmcsField64::GUEST_PHYSICAL_ADDRESS);
70 guest_rip = vmcs.Read(VmcsFieldXX::GUEST_RIP);
80 LTRACEF("guest activity state: %#x\n", vmcs.Read(VmcsField32::GUEST_ACTIVITY_STATE));
82 vmcs.Read(VmcsField32::GUEST_INTERRUPTIBILITY_STATE));
84 LTRACEF("guest linear address: %#lx\n", vmcs.Read(VmcsFieldXX::GUEST_LINEAR_ADDRESS));
88 ExitInterruptionInformation::ExitInterruptionInformation(const AutoVmcs& vmcs) {
89 uint32_t int_info = vmcs.Read(VmcsField32::EXIT_INTERRUPTION_INFORMATION);
135 static void next_rip(const ExitInfo& exit_info, AutoVmcs* vmcs) {
136 vmcs->Write(VmcsFieldXX::GUEST_RIP, exit_info.guest_rip + exit_info.exit_instruction_length);
139 uint32_t guest_interruptibility = vmcs->Read(VmcsField32::GUEST_INTERRUPTIBILITY_STATE);
143 vmcs->Write(VmcsField32::GUEST_INTERRUPTIBILITY_STATE, new_interruptibility);
147 static zx_status_t handle_external_interrupt(AutoVmcs* vmcs, LocalApicState* local_apic_state) {
148 ExitInterruptionInformation int_info(*vmcs);
152 vmcs->Invalidate();
159 static zx_status_t handle_interrupt_window(AutoVmcs* vmcs, LocalApicState* local_apic_state) {
160 vmcs->InterruptWindowExiting(false);
187 static zx_status_t handle_cpuid(const ExitInfo& exit_info, AutoVmcs* vmcs,
192 next_rip(exit_info, vmcs);
213 guest_state->rbx |= (vmcs->Read(VmcsField16::VPID) - 1) << 24;
234 guest_state->rdx = vmcs->Read(VmcsField16::VPID) - 1;
288 if ((vmcs->Read(VmcsField32::PROCBASED_CTLS2) & kProcbasedCtls2Invpcid) == 0)
332 static zx_status_t handle_hlt(const ExitInfo& exit_info, AutoVmcs* vmcs,
334 next_rip(exit_info, vmcs);
335 return local_apic_state->interrupt_tracker.Wait(vmcs);
338 static zx_status_t handle_cr0_write(AutoVmcs* vmcs, GuestState* guest_state, uint64_t val) {
341 if (cr0_is_invalid(vmcs, cr0)) {
344 vmcs->Write(VmcsFieldXX::GUEST_CR0, cr0);
347 uint64_t efer = vmcs->Read(VmcsField64::GUEST_IA32_EFER);
351 vmcs->Write(VmcsField64::GUEST_IA32_EFER, efer | X86_EFER_LMA);
352 return vmcs->SetControl(VmcsField32::ENTRY_CTLS,
358 static zx_status_t register_value(AutoVmcs* vmcs, GuestState* guest_state, uint8_t register_id,
375 *out = vmcs->Read(VmcsFieldXX::GUEST_RSP);
415 static zx_status_t handle_control_register_access(const ExitInfo& exit_info, AutoVmcs* vmcs,
425 zx_status_t status = register_value(vmcs, guest_state, cr_access_info.reg, &val);
429 status = handle_cr0_write(vmcs, guest_state, val);
433 next_rip(exit_info, vmcs);
441 static zx_status_t handle_io_instruction(const ExitInfo& exit_info, AutoVmcs* vmcs,
457 next_rip(exit_info, vmcs);
474 return trap->Queue(*packet, vmcs);
481 static zx_status_t handle_apic_rdmsr(const ExitInfo& exit_info, AutoVmcs* vmcs,
485 next_rip(exit_info, vmcs);
486 guest_state->rax = vmcs->Read(VmcsField16::VPID) - 1;
489 next_rip(exit_info, vmcs);
500 next_rip(exit_info, vmcs);
511 next_rip(exit_info, vmcs);
519 next_rip(exit_info, vmcs);
523 next_rip(exit_info, vmcs);
534 static zx_status_t handle_rdmsr(const ExitInfo& exit_info, AutoVmcs* vmcs,
539 next_rip(exit_info, vmcs);
541 if (vmcs->Read(VmcsField16::VPID) == 1)
547 next_rip(exit_info, vmcs);
578 next_rip(exit_info, vmcs);
583 return handle_apic_rdmsr(exit_info, vmcs, guest_state, local_apic_state);
637 static zx_status_t handle_ipi(const ExitInfo& exit_info, AutoVmcs* vmcs, GuestState* guest_state,
649 uint16_t self = static_cast<uint16_t>(vmcs->Read(VmcsField16::VPID) - 1);
655 next_rip(exit_info, vmcs);
660 next_rip(exit_info, vmcs);
668 next_rip(exit_info, vmcs);
677 static zx_status_t handle_apic_wrmsr(const ExitInfo& exit_info, AutoVmcs* vmcs,
698 next_rip(exit_info, vmcs);
705 next_rip(exit_info, vmcs);
712 next_rip(exit_info, vmcs);
719 next_rip(exit_info, vmcs);
724 next_rip(exit_info, vmcs);
729 return handle_ipi(exit_info, vmcs, guest_state, packet);
738 static zx_status_t handle_kvm_wrmsr(const ExitInfo& exit_info, AutoVmcs* vmcs,
744 next_rip(exit_info, vmcs);
762 static zx_status_t handle_wrmsr(const ExitInfo& exit_info, AutoVmcs* vmcs, GuestState* guest_state,
773 next_rip(exit_info, vmcs);
790 next_rip(exit_info, vmcs);
795 next_rip(exit_info, vmcs);
801 return handle_apic_wrmsr(exit_info, vmcs, guest_state, local_apic_state, packet);
806 return handle_kvm_wrmsr(exit_info, vmcs, guest_state, local_apic_state, pvclock, gpas);
830 static zx_status_t get_page(const AutoVmcs& vmcs, hypervisor::GuestPhysicalAddressSpace* gpas,
838 zx_paddr_t pt_addr = vmcs.Read(VmcsFieldXX::GUEST_CR3);
855 static zx_status_t fetch_data(const AutoVmcs& vmcs, hypervisor::GuestPhysicalAddressSpace* gpas,
862 zx_status_t status = get_page(vmcs, gpas, guest_vaddr, &pa);
875 status = get_page(vmcs, gpas, guest_vaddr + size, &pa);
884 static zx_status_t handle_trap(const ExitInfo& exit_info, AutoVmcs* vmcs, bool read,
894 next_rip(exit_info, vmcs);
906 return trap->Queue(*packet, vmcs);
914 uint64_t efer = vmcs->Read(VmcsField64::GUEST_IA32_EFER);
915 uint32_t cs_access_rights = vmcs->Read(VmcsField32::GUEST_CS_ACCESS_RIGHTS);
926 status = fetch_data(*vmcs, gpas, exit_info.guest_rip, packet->guest_mem.inst_buf,
935 static zx_status_t handle_ept_violation(const ExitInfo& exit_info, AutoVmcs* vmcs,
940 zx_status_t status = handle_trap(exit_info, vmcs, ept_violation_info.read, guest_paddr, gpas,
962 static zx_status_t handle_xsetbv(const ExitInfo& exit_info, AutoVmcs* vmcs,
964 uint64_t guest_cr4 = vmcs->Read(VmcsFieldXX::GUEST_CR4);
987 next_rip(exit_info, vmcs);
991 static zx_status_t handle_pause(const ExitInfo& exit_info, AutoVmcs* vmcs) {
992 next_rip(exit_info, vmcs);
993 vmcs->Invalidate();
998 static zx_status_t handle_vmcall(const ExitInfo& exit_info, AutoVmcs* vmcs,
1026 next_rip(exit_info, vmcs);
1031 zx_status_t vmexit_handler(AutoVmcs* vmcs, GuestState* guest_state,
1036 ExitInfo exit_info(*vmcs);
1040 status = handle_external_interrupt(vmcs, local_apic_state);
1045 status = handle_interrupt_window(vmcs, local_apic_state);
1050 status = handle_cpuid(exit_info, vmcs, guest_state);
1055 status = handle_hlt(exit_info, vmcs, local_apic_state);
1060 status = handle_control_register_access(exit_info, vmcs, guest_state);
1064 status = handle_io_instruction(exit_info, vmcs, guest_state, traps, packet);
1069 status = handle_rdmsr(exit_info, vmcs, guest_state, local_apic_state);
1074 status = handle_wrmsr(exit_info, vmcs, guest_state, local_apic_state, pvclock, gpas, packet);
1085 status = handle_ept_violation(exit_info, vmcs, gpas, traps, packet);
1090 status = handle_xsetbv(exit_info, vmcs, guest_state);
1095 status = handle_pause(exit_info, vmcs);
1100 status = handle_vmcall(exit_info, vmcs, gpas, guest_state);