예제 #1
0
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);
}
예제 #2
0
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);
}