0001
0002 #ifndef __KVM_X86_VMX_VMCS12_H
0003 #define __KVM_X86_VMX_VMCS12_H
0004
0005 #include <linux/build_bug.h>
0006
0007 #include "vmcs.h"
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026 typedef u64 natural_width;
0027 struct __packed vmcs12 {
0028
0029
0030
0031 struct vmcs_hdr hdr;
0032 u32 abort;
0033
0034 u32 launch_state;
0035 u32 padding[7];
0036
0037 u64 io_bitmap_a;
0038 u64 io_bitmap_b;
0039 u64 msr_bitmap;
0040 u64 vm_exit_msr_store_addr;
0041 u64 vm_exit_msr_load_addr;
0042 u64 vm_entry_msr_load_addr;
0043 u64 tsc_offset;
0044 u64 virtual_apic_page_addr;
0045 u64 apic_access_addr;
0046 u64 posted_intr_desc_addr;
0047 u64 ept_pointer;
0048 u64 eoi_exit_bitmap0;
0049 u64 eoi_exit_bitmap1;
0050 u64 eoi_exit_bitmap2;
0051 u64 eoi_exit_bitmap3;
0052 u64 xss_exit_bitmap;
0053 u64 guest_physical_address;
0054 u64 vmcs_link_pointer;
0055 u64 guest_ia32_debugctl;
0056 u64 guest_ia32_pat;
0057 u64 guest_ia32_efer;
0058 u64 guest_ia32_perf_global_ctrl;
0059 u64 guest_pdptr0;
0060 u64 guest_pdptr1;
0061 u64 guest_pdptr2;
0062 u64 guest_pdptr3;
0063 u64 guest_bndcfgs;
0064 u64 host_ia32_pat;
0065 u64 host_ia32_efer;
0066 u64 host_ia32_perf_global_ctrl;
0067 u64 vmread_bitmap;
0068 u64 vmwrite_bitmap;
0069 u64 vm_function_control;
0070 u64 eptp_list_address;
0071 u64 pml_address;
0072 u64 encls_exiting_bitmap;
0073 u64 tsc_multiplier;
0074 u64 padding64[1];
0075
0076
0077
0078
0079
0080
0081 natural_width cr0_guest_host_mask;
0082 natural_width cr4_guest_host_mask;
0083 natural_width cr0_read_shadow;
0084 natural_width cr4_read_shadow;
0085 natural_width dead_space[4];
0086 natural_width exit_qualification;
0087 natural_width guest_linear_address;
0088 natural_width guest_cr0;
0089 natural_width guest_cr3;
0090 natural_width guest_cr4;
0091 natural_width guest_es_base;
0092 natural_width guest_cs_base;
0093 natural_width guest_ss_base;
0094 natural_width guest_ds_base;
0095 natural_width guest_fs_base;
0096 natural_width guest_gs_base;
0097 natural_width guest_ldtr_base;
0098 natural_width guest_tr_base;
0099 natural_width guest_gdtr_base;
0100 natural_width guest_idtr_base;
0101 natural_width guest_dr7;
0102 natural_width guest_rsp;
0103 natural_width guest_rip;
0104 natural_width guest_rflags;
0105 natural_width guest_pending_dbg_exceptions;
0106 natural_width guest_sysenter_esp;
0107 natural_width guest_sysenter_eip;
0108 natural_width host_cr0;
0109 natural_width host_cr3;
0110 natural_width host_cr4;
0111 natural_width host_fs_base;
0112 natural_width host_gs_base;
0113 natural_width host_tr_base;
0114 natural_width host_gdtr_base;
0115 natural_width host_idtr_base;
0116 natural_width host_ia32_sysenter_esp;
0117 natural_width host_ia32_sysenter_eip;
0118 natural_width host_rsp;
0119 natural_width host_rip;
0120 natural_width paddingl[8];
0121 u32 pin_based_vm_exec_control;
0122 u32 cpu_based_vm_exec_control;
0123 u32 exception_bitmap;
0124 u32 page_fault_error_code_mask;
0125 u32 page_fault_error_code_match;
0126 u32 cr3_target_count;
0127 u32 vm_exit_controls;
0128 u32 vm_exit_msr_store_count;
0129 u32 vm_exit_msr_load_count;
0130 u32 vm_entry_controls;
0131 u32 vm_entry_msr_load_count;
0132 u32 vm_entry_intr_info_field;
0133 u32 vm_entry_exception_error_code;
0134 u32 vm_entry_instruction_len;
0135 u32 tpr_threshold;
0136 u32 secondary_vm_exec_control;
0137 u32 vm_instruction_error;
0138 u32 vm_exit_reason;
0139 u32 vm_exit_intr_info;
0140 u32 vm_exit_intr_error_code;
0141 u32 idt_vectoring_info_field;
0142 u32 idt_vectoring_error_code;
0143 u32 vm_exit_instruction_len;
0144 u32 vmx_instruction_info;
0145 u32 guest_es_limit;
0146 u32 guest_cs_limit;
0147 u32 guest_ss_limit;
0148 u32 guest_ds_limit;
0149 u32 guest_fs_limit;
0150 u32 guest_gs_limit;
0151 u32 guest_ldtr_limit;
0152 u32 guest_tr_limit;
0153 u32 guest_gdtr_limit;
0154 u32 guest_idtr_limit;
0155 u32 guest_es_ar_bytes;
0156 u32 guest_cs_ar_bytes;
0157 u32 guest_ss_ar_bytes;
0158 u32 guest_ds_ar_bytes;
0159 u32 guest_fs_ar_bytes;
0160 u32 guest_gs_ar_bytes;
0161 u32 guest_ldtr_ar_bytes;
0162 u32 guest_tr_ar_bytes;
0163 u32 guest_interruptibility_info;
0164 u32 guest_activity_state;
0165 u32 guest_sysenter_cs;
0166 u32 host_ia32_sysenter_cs;
0167 u32 vmx_preemption_timer_value;
0168 u32 padding32[7];
0169 u16 virtual_processor_id;
0170 u16 posted_intr_nv;
0171 u16 guest_es_selector;
0172 u16 guest_cs_selector;
0173 u16 guest_ss_selector;
0174 u16 guest_ds_selector;
0175 u16 guest_fs_selector;
0176 u16 guest_gs_selector;
0177 u16 guest_ldtr_selector;
0178 u16 guest_tr_selector;
0179 u16 guest_intr_status;
0180 u16 host_es_selector;
0181 u16 host_cs_selector;
0182 u16 host_ss_selector;
0183 u16 host_ds_selector;
0184 u16 host_fs_selector;
0185 u16 host_gs_selector;
0186 u16 host_tr_selector;
0187 u16 guest_pml_index;
0188 };
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198 #define VMCS12_REVISION 0x11e57ed0
0199
0200
0201
0202
0203
0204
0205
0206 #define VMCS12_SIZE KVM_STATE_NESTED_VMX_VMCS_SIZE
0207
0208
0209
0210
0211 #define CHECK_OFFSET(field, loc) \
0212 BUILD_BUG_ON_MSG(offsetof(struct vmcs12, field) != (loc), \
0213 "Offset of " #field " in struct vmcs12 has changed.")
0214
0215 static inline void vmx_check_vmcs12_offsets(void)
0216 {
0217 CHECK_OFFSET(hdr, 0);
0218 CHECK_OFFSET(abort, 4);
0219 CHECK_OFFSET(launch_state, 8);
0220 CHECK_OFFSET(io_bitmap_a, 40);
0221 CHECK_OFFSET(io_bitmap_b, 48);
0222 CHECK_OFFSET(msr_bitmap, 56);
0223 CHECK_OFFSET(vm_exit_msr_store_addr, 64);
0224 CHECK_OFFSET(vm_exit_msr_load_addr, 72);
0225 CHECK_OFFSET(vm_entry_msr_load_addr, 80);
0226 CHECK_OFFSET(tsc_offset, 88);
0227 CHECK_OFFSET(virtual_apic_page_addr, 96);
0228 CHECK_OFFSET(apic_access_addr, 104);
0229 CHECK_OFFSET(posted_intr_desc_addr, 112);
0230 CHECK_OFFSET(ept_pointer, 120);
0231 CHECK_OFFSET(eoi_exit_bitmap0, 128);
0232 CHECK_OFFSET(eoi_exit_bitmap1, 136);
0233 CHECK_OFFSET(eoi_exit_bitmap2, 144);
0234 CHECK_OFFSET(eoi_exit_bitmap3, 152);
0235 CHECK_OFFSET(xss_exit_bitmap, 160);
0236 CHECK_OFFSET(guest_physical_address, 168);
0237 CHECK_OFFSET(vmcs_link_pointer, 176);
0238 CHECK_OFFSET(guest_ia32_debugctl, 184);
0239 CHECK_OFFSET(guest_ia32_pat, 192);
0240 CHECK_OFFSET(guest_ia32_efer, 200);
0241 CHECK_OFFSET(guest_ia32_perf_global_ctrl, 208);
0242 CHECK_OFFSET(guest_pdptr0, 216);
0243 CHECK_OFFSET(guest_pdptr1, 224);
0244 CHECK_OFFSET(guest_pdptr2, 232);
0245 CHECK_OFFSET(guest_pdptr3, 240);
0246 CHECK_OFFSET(guest_bndcfgs, 248);
0247 CHECK_OFFSET(host_ia32_pat, 256);
0248 CHECK_OFFSET(host_ia32_efer, 264);
0249 CHECK_OFFSET(host_ia32_perf_global_ctrl, 272);
0250 CHECK_OFFSET(vmread_bitmap, 280);
0251 CHECK_OFFSET(vmwrite_bitmap, 288);
0252 CHECK_OFFSET(vm_function_control, 296);
0253 CHECK_OFFSET(eptp_list_address, 304);
0254 CHECK_OFFSET(pml_address, 312);
0255 CHECK_OFFSET(encls_exiting_bitmap, 320);
0256 CHECK_OFFSET(tsc_multiplier, 328);
0257 CHECK_OFFSET(cr0_guest_host_mask, 344);
0258 CHECK_OFFSET(cr4_guest_host_mask, 352);
0259 CHECK_OFFSET(cr0_read_shadow, 360);
0260 CHECK_OFFSET(cr4_read_shadow, 368);
0261 CHECK_OFFSET(dead_space, 376);
0262 CHECK_OFFSET(exit_qualification, 408);
0263 CHECK_OFFSET(guest_linear_address, 416);
0264 CHECK_OFFSET(guest_cr0, 424);
0265 CHECK_OFFSET(guest_cr3, 432);
0266 CHECK_OFFSET(guest_cr4, 440);
0267 CHECK_OFFSET(guest_es_base, 448);
0268 CHECK_OFFSET(guest_cs_base, 456);
0269 CHECK_OFFSET(guest_ss_base, 464);
0270 CHECK_OFFSET(guest_ds_base, 472);
0271 CHECK_OFFSET(guest_fs_base, 480);
0272 CHECK_OFFSET(guest_gs_base, 488);
0273 CHECK_OFFSET(guest_ldtr_base, 496);
0274 CHECK_OFFSET(guest_tr_base, 504);
0275 CHECK_OFFSET(guest_gdtr_base, 512);
0276 CHECK_OFFSET(guest_idtr_base, 520);
0277 CHECK_OFFSET(guest_dr7, 528);
0278 CHECK_OFFSET(guest_rsp, 536);
0279 CHECK_OFFSET(guest_rip, 544);
0280 CHECK_OFFSET(guest_rflags, 552);
0281 CHECK_OFFSET(guest_pending_dbg_exceptions, 560);
0282 CHECK_OFFSET(guest_sysenter_esp, 568);
0283 CHECK_OFFSET(guest_sysenter_eip, 576);
0284 CHECK_OFFSET(host_cr0, 584);
0285 CHECK_OFFSET(host_cr3, 592);
0286 CHECK_OFFSET(host_cr4, 600);
0287 CHECK_OFFSET(host_fs_base, 608);
0288 CHECK_OFFSET(host_gs_base, 616);
0289 CHECK_OFFSET(host_tr_base, 624);
0290 CHECK_OFFSET(host_gdtr_base, 632);
0291 CHECK_OFFSET(host_idtr_base, 640);
0292 CHECK_OFFSET(host_ia32_sysenter_esp, 648);
0293 CHECK_OFFSET(host_ia32_sysenter_eip, 656);
0294 CHECK_OFFSET(host_rsp, 664);
0295 CHECK_OFFSET(host_rip, 672);
0296 CHECK_OFFSET(pin_based_vm_exec_control, 744);
0297 CHECK_OFFSET(cpu_based_vm_exec_control, 748);
0298 CHECK_OFFSET(exception_bitmap, 752);
0299 CHECK_OFFSET(page_fault_error_code_mask, 756);
0300 CHECK_OFFSET(page_fault_error_code_match, 760);
0301 CHECK_OFFSET(cr3_target_count, 764);
0302 CHECK_OFFSET(vm_exit_controls, 768);
0303 CHECK_OFFSET(vm_exit_msr_store_count, 772);
0304 CHECK_OFFSET(vm_exit_msr_load_count, 776);
0305 CHECK_OFFSET(vm_entry_controls, 780);
0306 CHECK_OFFSET(vm_entry_msr_load_count, 784);
0307 CHECK_OFFSET(vm_entry_intr_info_field, 788);
0308 CHECK_OFFSET(vm_entry_exception_error_code, 792);
0309 CHECK_OFFSET(vm_entry_instruction_len, 796);
0310 CHECK_OFFSET(tpr_threshold, 800);
0311 CHECK_OFFSET(secondary_vm_exec_control, 804);
0312 CHECK_OFFSET(vm_instruction_error, 808);
0313 CHECK_OFFSET(vm_exit_reason, 812);
0314 CHECK_OFFSET(vm_exit_intr_info, 816);
0315 CHECK_OFFSET(vm_exit_intr_error_code, 820);
0316 CHECK_OFFSET(idt_vectoring_info_field, 824);
0317 CHECK_OFFSET(idt_vectoring_error_code, 828);
0318 CHECK_OFFSET(vm_exit_instruction_len, 832);
0319 CHECK_OFFSET(vmx_instruction_info, 836);
0320 CHECK_OFFSET(guest_es_limit, 840);
0321 CHECK_OFFSET(guest_cs_limit, 844);
0322 CHECK_OFFSET(guest_ss_limit, 848);
0323 CHECK_OFFSET(guest_ds_limit, 852);
0324 CHECK_OFFSET(guest_fs_limit, 856);
0325 CHECK_OFFSET(guest_gs_limit, 860);
0326 CHECK_OFFSET(guest_ldtr_limit, 864);
0327 CHECK_OFFSET(guest_tr_limit, 868);
0328 CHECK_OFFSET(guest_gdtr_limit, 872);
0329 CHECK_OFFSET(guest_idtr_limit, 876);
0330 CHECK_OFFSET(guest_es_ar_bytes, 880);
0331 CHECK_OFFSET(guest_cs_ar_bytes, 884);
0332 CHECK_OFFSET(guest_ss_ar_bytes, 888);
0333 CHECK_OFFSET(guest_ds_ar_bytes, 892);
0334 CHECK_OFFSET(guest_fs_ar_bytes, 896);
0335 CHECK_OFFSET(guest_gs_ar_bytes, 900);
0336 CHECK_OFFSET(guest_ldtr_ar_bytes, 904);
0337 CHECK_OFFSET(guest_tr_ar_bytes, 908);
0338 CHECK_OFFSET(guest_interruptibility_info, 912);
0339 CHECK_OFFSET(guest_activity_state, 916);
0340 CHECK_OFFSET(guest_sysenter_cs, 920);
0341 CHECK_OFFSET(host_ia32_sysenter_cs, 924);
0342 CHECK_OFFSET(vmx_preemption_timer_value, 928);
0343 CHECK_OFFSET(virtual_processor_id, 960);
0344 CHECK_OFFSET(posted_intr_nv, 962);
0345 CHECK_OFFSET(guest_es_selector, 964);
0346 CHECK_OFFSET(guest_cs_selector, 966);
0347 CHECK_OFFSET(guest_ss_selector, 968);
0348 CHECK_OFFSET(guest_ds_selector, 970);
0349 CHECK_OFFSET(guest_fs_selector, 972);
0350 CHECK_OFFSET(guest_gs_selector, 974);
0351 CHECK_OFFSET(guest_ldtr_selector, 976);
0352 CHECK_OFFSET(guest_tr_selector, 978);
0353 CHECK_OFFSET(guest_intr_status, 980);
0354 CHECK_OFFSET(host_es_selector, 982);
0355 CHECK_OFFSET(host_cs_selector, 984);
0356 CHECK_OFFSET(host_ss_selector, 986);
0357 CHECK_OFFSET(host_ds_selector, 988);
0358 CHECK_OFFSET(host_fs_selector, 990);
0359 CHECK_OFFSET(host_gs_selector, 992);
0360 CHECK_OFFSET(host_tr_selector, 994);
0361 CHECK_OFFSET(guest_pml_index, 996);
0362 }
0363
0364 extern const unsigned short vmcs12_field_offsets[];
0365 extern const unsigned int nr_vmcs12_fields;
0366
0367 static inline short get_vmcs12_field_offset(unsigned long field)
0368 {
0369 unsigned short offset;
0370 unsigned int index;
0371
0372 if (field >> 15)
0373 return -ENOENT;
0374
0375 index = ROL16(field, 6);
0376 if (index >= nr_vmcs12_fields)
0377 return -ENOENT;
0378
0379 index = array_index_nospec(index, nr_vmcs12_fields);
0380 offset = vmcs12_field_offsets[index];
0381 if (offset == 0)
0382 return -ENOENT;
0383 return offset;
0384 }
0385
0386 static inline u64 vmcs12_read_any(struct vmcs12 *vmcs12, unsigned long field,
0387 u16 offset)
0388 {
0389 char *p = (char *)vmcs12 + offset;
0390
0391 switch (vmcs_field_width(field)) {
0392 case VMCS_FIELD_WIDTH_NATURAL_WIDTH:
0393 return *((natural_width *)p);
0394 case VMCS_FIELD_WIDTH_U16:
0395 return *((u16 *)p);
0396 case VMCS_FIELD_WIDTH_U32:
0397 return *((u32 *)p);
0398 case VMCS_FIELD_WIDTH_U64:
0399 return *((u64 *)p);
0400 default:
0401 WARN_ON_ONCE(1);
0402 return -1;
0403 }
0404 }
0405
0406 static inline void vmcs12_write_any(struct vmcs12 *vmcs12, unsigned long field,
0407 u16 offset, u64 field_value)
0408 {
0409 char *p = (char *)vmcs12 + offset;
0410
0411 switch (vmcs_field_width(field)) {
0412 case VMCS_FIELD_WIDTH_U16:
0413 *(u16 *)p = field_value;
0414 break;
0415 case VMCS_FIELD_WIDTH_U32:
0416 *(u32 *)p = field_value;
0417 break;
0418 case VMCS_FIELD_WIDTH_U64:
0419 *(u64 *)p = field_value;
0420 break;
0421 case VMCS_FIELD_WIDTH_NATURAL_WIDTH:
0422 *(natural_width *)p = field_value;
0423 break;
0424 default:
0425 WARN_ON_ONCE(1);
0426 break;
0427 }
0428 }
0429
0430 #endif