aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/vmx.c
diff options
context:
space:
mode:
authorNadav Har'El <nyh@il.ibm.com>2011-05-25 16:05:57 -0400
committerAvi Kivity <avi@redhat.com>2011-07-12 04:45:11 -0400
commit22bd035868b06a614debf7352c09fb3efdc7c269 (patch)
treefd7efb3e2928e9b2a5e9764799aa4a23c640a77e /arch/x86/kvm/vmx.c
parentff2f6fe9618806d365f76a6f11a4f37881919412 (diff)
KVM: nVMX: Add VMCS fields to the vmcs12
In this patch we add to vmcs12 (the VMCS that L1 keeps for L2) all the standard VMCS fields. Later patches will enable L1 to read and write these fields using VMREAD/ VMWRITE, and they will be used during a VMLAUNCH/VMRESUME in preparing vmcs02, a hardware VMCS for running L2. Signed-off-by: Nadav Har'El <nyh@il.ibm.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'arch/x86/kvm/vmx.c')
-rw-r--r--arch/x86/kvm/vmx.c281
1 files changed, 281 insertions, 0 deletions
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index 03b29aca6e7f..33476eb152ea 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -158,12 +158,150 @@ struct shared_msr_entry {
158 * machines (necessary for live migration). 158 * machines (necessary for live migration).
159 * If there are changes in this struct, VMCS12_REVISION must be changed. 159 * If there are changes in this struct, VMCS12_REVISION must be changed.
160 */ 160 */
161typedef u64 natural_width;
161struct __packed vmcs12 { 162struct __packed vmcs12 {
162 /* According to the Intel spec, a VMCS region must start with the 163 /* According to the Intel spec, a VMCS region must start with the
163 * following two fields. Then follow implementation-specific data. 164 * following two fields. Then follow implementation-specific data.
164 */ 165 */
165 u32 revision_id; 166 u32 revision_id;
166 u32 abort; 167 u32 abort;
168
169 u64 io_bitmap_a;
170 u64 io_bitmap_b;
171 u64 msr_bitmap;
172 u64 vm_exit_msr_store_addr;
173 u64 vm_exit_msr_load_addr;
174 u64 vm_entry_msr_load_addr;
175 u64 tsc_offset;
176 u64 virtual_apic_page_addr;
177 u64 apic_access_addr;
178 u64 ept_pointer;
179 u64 guest_physical_address;
180 u64 vmcs_link_pointer;
181 u64 guest_ia32_debugctl;
182 u64 guest_ia32_pat;
183 u64 guest_ia32_efer;
184 u64 guest_ia32_perf_global_ctrl;
185 u64 guest_pdptr0;
186 u64 guest_pdptr1;
187 u64 guest_pdptr2;
188 u64 guest_pdptr3;
189 u64 host_ia32_pat;
190 u64 host_ia32_efer;
191 u64 host_ia32_perf_global_ctrl;
192 u64 padding64[8]; /* room for future expansion */
193 /*
194 * To allow migration of L1 (complete with its L2 guests) between
195 * machines of different natural widths (32 or 64 bit), we cannot have
196 * unsigned long fields with no explict size. We use u64 (aliased
197 * natural_width) instead. Luckily, x86 is little-endian.
198 */
199 natural_width cr0_guest_host_mask;
200 natural_width cr4_guest_host_mask;
201 natural_width cr0_read_shadow;
202 natural_width cr4_read_shadow;
203 natural_width cr3_target_value0;
204 natural_width cr3_target_value1;
205 natural_width cr3_target_value2;
206 natural_width cr3_target_value3;
207 natural_width exit_qualification;
208 natural_width guest_linear_address;
209 natural_width guest_cr0;
210 natural_width guest_cr3;
211 natural_width guest_cr4;
212 natural_width guest_es_base;
213 natural_width guest_cs_base;
214 natural_width guest_ss_base;
215 natural_width guest_ds_base;
216 natural_width guest_fs_base;
217 natural_width guest_gs_base;
218 natural_width guest_ldtr_base;
219 natural_width guest_tr_base;
220 natural_width guest_gdtr_base;
221 natural_width guest_idtr_base;
222 natural_width guest_dr7;
223 natural_width guest_rsp;
224 natural_width guest_rip;
225 natural_width guest_rflags;
226 natural_width guest_pending_dbg_exceptions;
227 natural_width guest_sysenter_esp;
228 natural_width guest_sysenter_eip;
229 natural_width host_cr0;
230 natural_width host_cr3;
231 natural_width host_cr4;
232 natural_width host_fs_base;
233 natural_width host_gs_base;
234 natural_width host_tr_base;
235 natural_width host_gdtr_base;
236 natural_width host_idtr_base;
237 natural_width host_ia32_sysenter_esp;
238 natural_width host_ia32_sysenter_eip;
239 natural_width host_rsp;
240 natural_width host_rip;
241 natural_width paddingl[8]; /* room for future expansion */
242 u32 pin_based_vm_exec_control;
243 u32 cpu_based_vm_exec_control;
244 u32 exception_bitmap;
245 u32 page_fault_error_code_mask;
246 u32 page_fault_error_code_match;
247 u32 cr3_target_count;
248 u32 vm_exit_controls;
249 u32 vm_exit_msr_store_count;
250 u32 vm_exit_msr_load_count;
251 u32 vm_entry_controls;
252 u32 vm_entry_msr_load_count;
253 u32 vm_entry_intr_info_field;
254 u32 vm_entry_exception_error_code;
255 u32 vm_entry_instruction_len;
256 u32 tpr_threshold;
257 u32 secondary_vm_exec_control;
258 u32 vm_instruction_error;
259 u32 vm_exit_reason;
260 u32 vm_exit_intr_info;
261 u32 vm_exit_intr_error_code;
262 u32 idt_vectoring_info_field;
263 u32 idt_vectoring_error_code;
264 u32 vm_exit_instruction_len;
265 u32 vmx_instruction_info;
266 u32 guest_es_limit;
267 u32 guest_cs_limit;
268 u32 guest_ss_limit;
269 u32 guest_ds_limit;
270 u32 guest_fs_limit;
271 u32 guest_gs_limit;
272 u32 guest_ldtr_limit;
273 u32 guest_tr_limit;
274 u32 guest_gdtr_limit;
275 u32 guest_idtr_limit;
276 u32 guest_es_ar_bytes;
277 u32 guest_cs_ar_bytes;
278 u32 guest_ss_ar_bytes;
279 u32 guest_ds_ar_bytes;
280 u32 guest_fs_ar_bytes;
281 u32 guest_gs_ar_bytes;
282 u32 guest_ldtr_ar_bytes;
283 u32 guest_tr_ar_bytes;
284 u32 guest_interruptibility_info;
285 u32 guest_activity_state;
286 u32 guest_sysenter_cs;
287 u32 host_ia32_sysenter_cs;
288 u32 padding32[8]; /* room for future expansion */
289 u16 virtual_processor_id;
290 u16 guest_es_selector;
291 u16 guest_cs_selector;
292 u16 guest_ss_selector;
293 u16 guest_ds_selector;
294 u16 guest_fs_selector;
295 u16 guest_gs_selector;
296 u16 guest_ldtr_selector;
297 u16 guest_tr_selector;
298 u16 host_es_selector;
299 u16 host_cs_selector;
300 u16 host_ss_selector;
301 u16 host_ds_selector;
302 u16 host_fs_selector;
303 u16 host_gs_selector;
304 u16 host_tr_selector;
167}; 305};
168 306
169/* 307/*
@@ -284,6 +422,149 @@ static inline struct vcpu_vmx *to_vmx(struct kvm_vcpu *vcpu)
284 return container_of(vcpu, struct vcpu_vmx, vcpu); 422 return container_of(vcpu, struct vcpu_vmx, vcpu);
285} 423}
286 424
425#define VMCS12_OFFSET(x) offsetof(struct vmcs12, x)
426#define FIELD(number, name) [number] = VMCS12_OFFSET(name)
427#define FIELD64(number, name) [number] = VMCS12_OFFSET(name), \
428 [number##_HIGH] = VMCS12_OFFSET(name)+4
429
430static unsigned short vmcs_field_to_offset_table[] = {
431 FIELD(VIRTUAL_PROCESSOR_ID, virtual_processor_id),
432 FIELD(GUEST_ES_SELECTOR, guest_es_selector),
433 FIELD(GUEST_CS_SELECTOR, guest_cs_selector),
434 FIELD(GUEST_SS_SELECTOR, guest_ss_selector),
435 FIELD(GUEST_DS_SELECTOR, guest_ds_selector),
436 FIELD(GUEST_FS_SELECTOR, guest_fs_selector),
437 FIELD(GUEST_GS_SELECTOR, guest_gs_selector),
438 FIELD(GUEST_LDTR_SELECTOR, guest_ldtr_selector),
439 FIELD(GUEST_TR_SELECTOR, guest_tr_selector),
440 FIELD(HOST_ES_SELECTOR, host_es_selector),
441 FIELD(HOST_CS_SELECTOR, host_cs_selector),
442 FIELD(HOST_SS_SELECTOR, host_ss_selector),
443 FIELD(HOST_DS_SELECTOR, host_ds_selector),
444 FIELD(HOST_FS_SELECTOR, host_fs_selector),
445 FIELD(HOST_GS_SELECTOR, host_gs_selector),
446 FIELD(HOST_TR_SELECTOR, host_tr_selector),
447 FIELD64(IO_BITMAP_A, io_bitmap_a),
448 FIELD64(IO_BITMAP_B, io_bitmap_b),
449 FIELD64(MSR_BITMAP, msr_bitmap),
450 FIELD64(VM_EXIT_MSR_STORE_ADDR, vm_exit_msr_store_addr),
451 FIELD64(VM_EXIT_MSR_LOAD_ADDR, vm_exit_msr_load_addr),
452 FIELD64(VM_ENTRY_MSR_LOAD_ADDR, vm_entry_msr_load_addr),
453 FIELD64(TSC_OFFSET, tsc_offset),
454 FIELD64(VIRTUAL_APIC_PAGE_ADDR, virtual_apic_page_addr),
455 FIELD64(APIC_ACCESS_ADDR, apic_access_addr),
456 FIELD64(EPT_POINTER, ept_pointer),
457 FIELD64(GUEST_PHYSICAL_ADDRESS, guest_physical_address),
458 FIELD64(VMCS_LINK_POINTER, vmcs_link_pointer),
459 FIELD64(GUEST_IA32_DEBUGCTL, guest_ia32_debugctl),
460 FIELD64(GUEST_IA32_PAT, guest_ia32_pat),
461 FIELD64(GUEST_IA32_EFER, guest_ia32_efer),
462 FIELD64(GUEST_IA32_PERF_GLOBAL_CTRL, guest_ia32_perf_global_ctrl),
463 FIELD64(GUEST_PDPTR0, guest_pdptr0),
464 FIELD64(GUEST_PDPTR1, guest_pdptr1),
465 FIELD64(GUEST_PDPTR2, guest_pdptr2),
466 FIELD64(GUEST_PDPTR3, guest_pdptr3),
467 FIELD64(HOST_IA32_PAT, host_ia32_pat),
468 FIELD64(HOST_IA32_EFER, host_ia32_efer),
469 FIELD64(HOST_IA32_PERF_GLOBAL_CTRL, host_ia32_perf_global_ctrl),
470 FIELD(PIN_BASED_VM_EXEC_CONTROL, pin_based_vm_exec_control),
471 FIELD(CPU_BASED_VM_EXEC_CONTROL, cpu_based_vm_exec_control),
472 FIELD(EXCEPTION_BITMAP, exception_bitmap),
473 FIELD(PAGE_FAULT_ERROR_CODE_MASK, page_fault_error_code_mask),
474 FIELD(PAGE_FAULT_ERROR_CODE_MATCH, page_fault_error_code_match),
475 FIELD(CR3_TARGET_COUNT, cr3_target_count),
476 FIELD(VM_EXIT_CONTROLS, vm_exit_controls),
477 FIELD(VM_EXIT_MSR_STORE_COUNT, vm_exit_msr_store_count),
478 FIELD(VM_EXIT_MSR_LOAD_COUNT, vm_exit_msr_load_count),
479 FIELD(VM_ENTRY_CONTROLS, vm_entry_controls),
480 FIELD(VM_ENTRY_MSR_LOAD_COUNT, vm_entry_msr_load_count),
481 FIELD(VM_ENTRY_INTR_INFO_FIELD, vm_entry_intr_info_field),
482 FIELD(VM_ENTRY_EXCEPTION_ERROR_CODE, vm_entry_exception_error_code),
483 FIELD(VM_ENTRY_INSTRUCTION_LEN, vm_entry_instruction_len),
484 FIELD(TPR_THRESHOLD, tpr_threshold),
485 FIELD(SECONDARY_VM_EXEC_CONTROL, secondary_vm_exec_control),
486 FIELD(VM_INSTRUCTION_ERROR, vm_instruction_error),
487 FIELD(VM_EXIT_REASON, vm_exit_reason),
488 FIELD(VM_EXIT_INTR_INFO, vm_exit_intr_info),
489 FIELD(VM_EXIT_INTR_ERROR_CODE, vm_exit_intr_error_code),
490 FIELD(IDT_VECTORING_INFO_FIELD, idt_vectoring_info_field),
491 FIELD(IDT_VECTORING_ERROR_CODE, idt_vectoring_error_code),
492 FIELD(VM_EXIT_INSTRUCTION_LEN, vm_exit_instruction_len),
493 FIELD(VMX_INSTRUCTION_INFO, vmx_instruction_info),
494 FIELD(GUEST_ES_LIMIT, guest_es_limit),
495 FIELD(GUEST_CS_LIMIT, guest_cs_limit),
496 FIELD(GUEST_SS_LIMIT, guest_ss_limit),
497 FIELD(GUEST_DS_LIMIT, guest_ds_limit),
498 FIELD(GUEST_FS_LIMIT, guest_fs_limit),
499 FIELD(GUEST_GS_LIMIT, guest_gs_limit),
500 FIELD(GUEST_LDTR_LIMIT, guest_ldtr_limit),
501 FIELD(GUEST_TR_LIMIT, guest_tr_limit),
502 FIELD(GUEST_GDTR_LIMIT, guest_gdtr_limit),
503 FIELD(GUEST_IDTR_LIMIT, guest_idtr_limit),
504 FIELD(GUEST_ES_AR_BYTES, guest_es_ar_bytes),
505 FIELD(GUEST_CS_AR_BYTES, guest_cs_ar_bytes),
506 FIELD(GUEST_SS_AR_BYTES, guest_ss_ar_bytes),
507 FIELD(GUEST_DS_AR_BYTES, guest_ds_ar_bytes),
508 FIELD(GUEST_FS_AR_BYTES, guest_fs_ar_bytes),
509 FIELD(GUEST_GS_AR_BYTES, guest_gs_ar_bytes),
510 FIELD(GUEST_LDTR_AR_BYTES, guest_ldtr_ar_bytes),
511 FIELD(GUEST_TR_AR_BYTES, guest_tr_ar_bytes),
512 FIELD(GUEST_INTERRUPTIBILITY_INFO, guest_interruptibility_info),
513 FIELD(GUEST_ACTIVITY_STATE, guest_activity_state),
514 FIELD(GUEST_SYSENTER_CS, guest_sysenter_cs),
515 FIELD(HOST_IA32_SYSENTER_CS, host_ia32_sysenter_cs),
516 FIELD(CR0_GUEST_HOST_MASK, cr0_guest_host_mask),
517 FIELD(CR4_GUEST_HOST_MASK, cr4_guest_host_mask),
518 FIELD(CR0_READ_SHADOW, cr0_read_shadow),
519 FIELD(CR4_READ_SHADOW, cr4_read_shadow),
520 FIELD(CR3_TARGET_VALUE0, cr3_target_value0),
521 FIELD(CR3_TARGET_VALUE1, cr3_target_value1),
522 FIELD(CR3_TARGET_VALUE2, cr3_target_value2),
523 FIELD(CR3_TARGET_VALUE3, cr3_target_value3),
524 FIELD(EXIT_QUALIFICATION, exit_qualification),
525 FIELD(GUEST_LINEAR_ADDRESS, guest_linear_address),
526 FIELD(GUEST_CR0, guest_cr0),
527 FIELD(GUEST_CR3, guest_cr3),
528 FIELD(GUEST_CR4, guest_cr4),
529 FIELD(GUEST_ES_BASE, guest_es_base),
530 FIELD(GUEST_CS_BASE, guest_cs_base),
531 FIELD(GUEST_SS_BASE, guest_ss_base),
532 FIELD(GUEST_DS_BASE, guest_ds_base),
533 FIELD(GUEST_FS_BASE, guest_fs_base),
534 FIELD(GUEST_GS_BASE, guest_gs_base),
535 FIELD(GUEST_LDTR_BASE, guest_ldtr_base),
536 FIELD(GUEST_TR_BASE, guest_tr_base),
537 FIELD(GUEST_GDTR_BASE, guest_gdtr_base),
538 FIELD(GUEST_IDTR_BASE, guest_idtr_base),
539 FIELD(GUEST_DR7, guest_dr7),
540 FIELD(GUEST_RSP, guest_rsp),
541 FIELD(GUEST_RIP, guest_rip),
542 FIELD(GUEST_RFLAGS, guest_rflags),
543 FIELD(GUEST_PENDING_DBG_EXCEPTIONS, guest_pending_dbg_exceptions),
544 FIELD(GUEST_SYSENTER_ESP, guest_sysenter_esp),
545 FIELD(GUEST_SYSENTER_EIP, guest_sysenter_eip),
546 FIELD(HOST_CR0, host_cr0),
547 FIELD(HOST_CR3, host_cr3),
548 FIELD(HOST_CR4, host_cr4),
549 FIELD(HOST_FS_BASE, host_fs_base),
550 FIELD(HOST_GS_BASE, host_gs_base),
551 FIELD(HOST_TR_BASE, host_tr_base),
552 FIELD(HOST_GDTR_BASE, host_gdtr_base),
553 FIELD(HOST_IDTR_BASE, host_idtr_base),
554 FIELD(HOST_IA32_SYSENTER_ESP, host_ia32_sysenter_esp),
555 FIELD(HOST_IA32_SYSENTER_EIP, host_ia32_sysenter_eip),
556 FIELD(HOST_RSP, host_rsp),
557 FIELD(HOST_RIP, host_rip),
558};
559static const int max_vmcs_field = ARRAY_SIZE(vmcs_field_to_offset_table);
560
561static inline short vmcs_field_to_offset(unsigned long field)
562{
563 if (field >= max_vmcs_field || vmcs_field_to_offset_table[field] == 0)
564 return -1;
565 return vmcs_field_to_offset_table[field];
566}
567
287static inline struct vmcs12 *get_vmcs12(struct kvm_vcpu *vcpu) 568static inline struct vmcs12 *get_vmcs12(struct kvm_vcpu *vcpu)
288{ 569{
289 return to_vmx(vcpu)->nested.current_vmcs12; 570 return to_vmx(vcpu)->nested.current_vmcs12;