void vmx_vmcs_commit() { /* 16-bit fields */ vmcs_force_flush(vm_exec_ctrls.vpid); vmcs_force_flush(vm_state.es.selector); vmcs_force_flush(vm_state.cs.selector); vmcs_force_flush(vm_state.ss.selector); vmcs_force_flush(vm_state.ds.selector); vmcs_force_flush(vm_state.fs.selector); vmcs_force_flush(vm_state.gs.selector); vmcs_force_flush(vm_state.ldtr.selector); vmcs_force_flush(vm_state.tr.selector); vmcs_force_flush(vm_host_state.es); vmcs_force_flush(vm_host_state.cs); vmcs_force_flush(vm_host_state.ss); vmcs_force_flush(vm_host_state.ds); vmcs_force_flush(vm_host_state.fs); vmcs_force_flush(vm_host_state.gs); vmcs_force_flush(vm_host_state.tr); /* 64-bit fields */ vmcs_force_flush(vm_exec_ctrls.io_bitmap_a); vmcs_force_flush(vm_exec_ctrls.io_bitmap_b); vmcs_force_flush(vm_exec_ctrls.msr_bitmap); vmcs_force_flush(vm_exit_ctrls.msr_store_addr); vmcs_force_flush(vm_exit_ctrls.msr_load_addr); vmcs_force_flush(vm_entry_ctrls.msr_load_addr); #ifdef CONFIG_VMX_FEAT_VMCS_EXEC_PTR vmcs_force_flush(vm_exec_ctrls.executive_vmcs_ptr); #endif vmcs_force_flush(vm_exec_ctrls.tsc_offset); vmcs_force_flush(vm_exec_ctrls.vapic_addr); vmcs_force_flush(vm_exec_ctrls.apic_addr); vmcs_force_flush(vm_exec_ctrls.eptp); vmcs_force_flush(vm_state.vmcs_link_ptr); vmcs_force_flush(vm_state.ia32_dbgctl); vmx_set_fixed(vm_entry_ctrls.entry.raw, info->vm.vmx_fx_entry); vmcs_force_flush(vm_entry_ctrls.entry); if(vm_entry_ctrls.entry.load_ia32_pat) vmcs_force_flush(vm_state.ia32_pat); if(vm_entry_ctrls.entry.load_ia32_efer) vmcs_force_flush(vm_state.ia32_efer); if(vm_entry_ctrls.entry.load_ia32_perf) vmcs_force_flush(vm_state.ia32_perf); vmcs_force_flush(vm_state.pdpe_0); vmcs_force_flush(vm_state.pdpe_1); vmcs_force_flush(vm_state.pdpe_2); vmcs_force_flush(vm_state.pdpe_3); vmx_set_fixed(vm_exit_ctrls.exit.raw, info->vm.vmx_fx_exit); vmcs_force_flush(vm_exit_ctrls.exit); if(vm_exit_ctrls.exit.load_ia32_pat) vmcs_force_flush(vm_host_state.ia32_pat); if(vm_exit_ctrls.exit.load_ia32_efer) vmcs_force_flush(vm_host_state.ia32_efer); if(vm_exit_ctrls.exit.load_ia32_perf) vmcs_force_flush(vm_host_state.ia32_perf); /* 32-bit fields */ vmx_set_fixed(vm_exec_ctrls.pin.raw, info->vm.vmx_fx_pin); vmcs_force_flush(vm_exec_ctrls.pin); vmx_set_fixed(vm_exec_ctrls.proc.raw, info->vm.vmx_fx_proc); vmcs_force_flush(vm_exec_ctrls.proc); vmcs_force_flush(vm_exec_ctrls.excp_bitmap); vmcs_force_flush(vm_exec_ctrls.pagefault_err_code_mask); vmcs_force_flush(vm_exec_ctrls.pagefault_err_code_match); vmcs_force_flush(vm_exec_ctrls.cr3_target_count); vmcs_force_flush(vm_exit_ctrls.msr_store_count); vmcs_force_flush(vm_exit_ctrls.msr_load_count); vmcs_force_flush(vm_entry_ctrls.msr_load_count); vmcs_force_flush(vm_entry_ctrls.int_info); vmcs_force_flush(vm_entry_ctrls.err_code); vmcs_force_flush(vm_entry_ctrls.insn_len); vmcs_force_flush(vm_exec_ctrls.tpr_threshold); vmx_set_fixed(vm_exec_ctrls.proc2.raw, info->vm.vmx_fx_proc2); vmcs_force_flush(vm_exec_ctrls.proc2); /* vmcs_force_flush(vm_exec_ctrls.ple_gap); */ /* vmcs_force_flush(vm_exec_ctrls.ple_win); */ vmcs_force_flush(vm_state.es.limit); vmcs_force_flush(vm_state.cs.limit); vmcs_force_flush(vm_state.ss.limit); vmcs_force_flush(vm_state.ds.limit); vmcs_force_flush(vm_state.fs.limit); vmcs_force_flush(vm_state.gs.limit); vmcs_force_flush(vm_state.ldtr.limit); vmcs_force_flush(vm_state.tr.limit); vmcs_force_flush(vm_state.gdtr.limit); vmcs_force_flush(vm_state.idtr.limit); vmcs_force_flush(vm_state.es.attributes); vmcs_force_flush(vm_state.cs.attributes); vmcs_force_flush(vm_state.ss.attributes); vmcs_force_flush(vm_state.ds.attributes); vmcs_force_flush(vm_state.fs.attributes); vmcs_force_flush(vm_state.gs.attributes); vmcs_force_flush(vm_state.ldtr.attributes); vmcs_force_flush(vm_state.tr.attributes); vmcs_force_flush(vm_state.interrupt); vmcs_force_flush(vm_state.activity); #ifdef CONFIG_VMX_FEAT_VMCS_SMBASE vmcs_force_flush(vm_state.smbase); #endif vmcs_force_flush(vm_state.ia32_sysenter_cs); vmcs_force_flush(vm_state.preempt_timer); vmcs_force_flush(vm_host_state.ia32_sysenter_cs); /* Natural fields */ vmcs_force_flush(vm_exec_ctrls.cr0_mask); vmcs_force_flush(vm_exec_ctrls.cr4_mask); vmcs_force_flush(vm_exec_ctrls.cr0_read_shadow); vmcs_force_flush(vm_exec_ctrls.cr4_read_shadow); vmcs_force_flush(vm_exec_ctrls.cr3_target_0); vmcs_force_flush(vm_exec_ctrls.cr3_target_1); vmcs_force_flush(vm_exec_ctrls.cr3_target_2); vmcs_force_flush(vm_exec_ctrls.cr3_target_3); vmx_set_fixed(vm_state.cr0.low, info->vm.vmx_fx_cr0); vmcs_force_flush(vm_state.cr0); vmcs_force_flush(vm_state.cr3); vmx_set_fixed(vm_state.cr4.low, info->vm.vmx_fx_cr4); vmcs_force_flush(vm_state.cr4); vmcs_force_flush(vm_state.es.base); vmcs_force_flush(vm_state.cs.base); vmcs_force_flush(vm_state.ss.base); vmcs_force_flush(vm_state.ds.base); vmcs_force_flush(vm_state.fs.base); vmcs_force_flush(vm_state.gs.base); vmcs_force_flush(vm_state.tr.base); vmcs_force_flush(vm_state.ldtr.base); vmcs_force_flush(vm_state.gdtr.base); vmcs_force_flush(vm_state.idtr.base); vmcs_force_flush(vm_state.dr7); vmcs_force_flush(vm_state.rsp); vmcs_force_flush(vm_state.rip); vmcs_force_flush(vm_state.rflags); vmcs_force_flush(vm_state.dbg_excp); vmcs_force_flush(vm_state.ia32_sysenter_esp); vmcs_force_flush(vm_state.ia32_sysenter_eip); vmcs_force_flush(vm_host_state.cr0); vmcs_force_flush(vm_host_state.cr3); vmcs_force_flush(vm_host_state.cr4); vmcs_force_flush(vm_host_state.fs_base); vmcs_force_flush(vm_host_state.gs_base); vmcs_force_flush(vm_host_state.tr_base); vmcs_force_flush(vm_host_state.gdtr_base); vmcs_force_flush(vm_host_state.idtr_base); vmcs_force_flush(vm_host_state.ia32_sysenter_esp); vmcs_force_flush(vm_host_state.ia32_sysenter_eip); vmcs_force_flush(vm_host_state.rsp); vmcs_force_flush(vm_host_state.rip); }
void vmx_vmcs_dirty_guest() { vmcs_dirty(vm_state.es.selector); vmcs_dirty(vm_state.cs.selector); vmcs_dirty(vm_state.ss.selector); vmcs_dirty(vm_state.ds.selector); vmcs_dirty(vm_state.fs.selector); vmcs_dirty(vm_state.gs.selector); vmcs_dirty(vm_state.ldtr.selector); vmcs_dirty(vm_state.tr.selector); vmcs_dirty(vm_state.vmcs_link_ptr); vmcs_dirty(vm_state.ia32_dbgctl); if(vm_entry_ctrls.entry.load_ia32_pat) vmcs_dirty(vm_state.ia32_pat); if(vm_entry_ctrls.entry.load_ia32_efer) vmcs_dirty(vm_state.ia32_efer); if(vm_entry_ctrls.entry.load_ia32_perf) vmcs_dirty(vm_state.ia32_perf); vmcs_dirty(vm_state.pdpe_0); vmcs_dirty(vm_state.pdpe_1); vmcs_dirty(vm_state.pdpe_2); vmcs_dirty(vm_state.pdpe_3); vmcs_dirty(vm_state.es.limit); vmcs_dirty(vm_state.cs.limit); vmcs_dirty(vm_state.ss.limit); vmcs_dirty(vm_state.ds.limit); vmcs_dirty(vm_state.fs.limit); vmcs_dirty(vm_state.gs.limit); vmcs_dirty(vm_state.ldtr.limit); vmcs_dirty(vm_state.tr.limit); vmcs_dirty(vm_state.gdtr.limit); vmcs_dirty(vm_state.idtr.limit); vmcs_dirty(vm_state.es.attributes); vmcs_dirty(vm_state.cs.attributes); vmcs_dirty(vm_state.ss.attributes); vmcs_dirty(vm_state.ds.attributes); vmcs_dirty(vm_state.fs.attributes); vmcs_dirty(vm_state.gs.attributes); vmcs_dirty(vm_state.ldtr.attributes); vmcs_dirty(vm_state.tr.attributes); vmcs_dirty(vm_state.interrupt); vmcs_dirty(vm_state.activity); #ifdef CONFIG_VMX_FEAT_VMCS_SMBASE vmcs_dirty(vm_state.smbase); #endif vmcs_dirty(vm_state.ia32_sysenter_cs); if(info->vm.vmx_fx_pin.allow_1.preempt) vmcs_dirty(vm_state.preempt_timer); vmx_set_fixed(vm_state.cr0.low, info->vm.vmx_fx_cr0); vmcs_dirty(vm_state.cr0); vmcs_dirty(vm_state.cr3); vmx_set_fixed(vm_state.cr4.low, info->vm.vmx_fx_cr4); vmcs_dirty(vm_state.cr4); vmcs_dirty(vm_state.es.base); vmcs_dirty(vm_state.cs.base); vmcs_dirty(vm_state.ss.base); vmcs_dirty(vm_state.ds.base); vmcs_dirty(vm_state.fs.base); vmcs_dirty(vm_state.gs.base); vmcs_dirty(vm_state.tr.base); vmcs_dirty(vm_state.ldtr.base); vmcs_dirty(vm_state.gdtr.base); vmcs_dirty(vm_state.idtr.base); vmcs_dirty(vm_state.dr7); vmcs_dirty(vm_state.rsp); vmcs_dirty(vm_state.rip); vmcs_dirty(vm_state.rflags); vmcs_dirty(vm_state.dbg_excp); vmcs_dirty(vm_state.ia32_sysenter_esp); vmcs_dirty(vm_state.ia32_sysenter_eip); /* Fake fields */ vmcs_dirty(vm_state.cr2); vmcs_dirty(vm_state.dr6); }