1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3 * tools/testing/selftests/kvm/include/x86_64/evmcs.h
4 *
5 * Copyright (C) 2018, Red Hat, Inc.
6 *
7 */
8
9 #ifndef SELFTEST_KVM_EVMCS_H
10 #define SELFTEST_KVM_EVMCS_H
11
12 #include <stdint.h>
13 #include "vmx.h"
14
15 #define u16 uint16_t
16 #define u32 uint32_t
17 #define u64 uint64_t
18
19 #define EVMCS_VERSION 1
20
21 extern bool enable_evmcs;
22
23 struct hv_vp_assist_page {
24 __u32 apic_assist;
25 __u32 reserved;
26 __u64 vtl_control[2];
27 __u64 nested_enlightenments_control[2];
28 __u32 enlighten_vmentry;
29 __u64 current_nested_vmcs;
30 };
31
32 struct hv_enlightened_vmcs {
33 u32 revision_id;
34 u32 abort;
35
36 u16 host_es_selector;
37 u16 host_cs_selector;
38 u16 host_ss_selector;
39 u16 host_ds_selector;
40 u16 host_fs_selector;
41 u16 host_gs_selector;
42 u16 host_tr_selector;
43
44 u64 host_ia32_pat;
45 u64 host_ia32_efer;
46
47 u64 host_cr0;
48 u64 host_cr3;
49 u64 host_cr4;
50
51 u64 host_ia32_sysenter_esp;
52 u64 host_ia32_sysenter_eip;
53 u64 host_rip;
54 u32 host_ia32_sysenter_cs;
55
56 u32 pin_based_vm_exec_control;
57 u32 vm_exit_controls;
58 u32 secondary_vm_exec_control;
59
60 u64 io_bitmap_a;
61 u64 io_bitmap_b;
62 u64 msr_bitmap;
63
64 u16 guest_es_selector;
65 u16 guest_cs_selector;
66 u16 guest_ss_selector;
67 u16 guest_ds_selector;
68 u16 guest_fs_selector;
69 u16 guest_gs_selector;
70 u16 guest_ldtr_selector;
71 u16 guest_tr_selector;
72
73 u32 guest_es_limit;
74 u32 guest_cs_limit;
75 u32 guest_ss_limit;
76 u32 guest_ds_limit;
77 u32 guest_fs_limit;
78 u32 guest_gs_limit;
79 u32 guest_ldtr_limit;
80 u32 guest_tr_limit;
81 u32 guest_gdtr_limit;
82 u32 guest_idtr_limit;
83
84 u32 guest_es_ar_bytes;
85 u32 guest_cs_ar_bytes;
86 u32 guest_ss_ar_bytes;
87 u32 guest_ds_ar_bytes;
88 u32 guest_fs_ar_bytes;
89 u32 guest_gs_ar_bytes;
90 u32 guest_ldtr_ar_bytes;
91 u32 guest_tr_ar_bytes;
92
93 u64 guest_es_base;
94 u64 guest_cs_base;
95 u64 guest_ss_base;
96 u64 guest_ds_base;
97 u64 guest_fs_base;
98 u64 guest_gs_base;
99 u64 guest_ldtr_base;
100 u64 guest_tr_base;
101 u64 guest_gdtr_base;
102 u64 guest_idtr_base;
103
104 u64 padding64_1[3];
105
106 u64 vm_exit_msr_store_addr;
107 u64 vm_exit_msr_load_addr;
108 u64 vm_entry_msr_load_addr;
109
110 u64 cr3_target_value0;
111 u64 cr3_target_value1;
112 u64 cr3_target_value2;
113 u64 cr3_target_value3;
114
115 u32 page_fault_error_code_mask;
116 u32 page_fault_error_code_match;
117
118 u32 cr3_target_count;
119 u32 vm_exit_msr_store_count;
120 u32 vm_exit_msr_load_count;
121 u32 vm_entry_msr_load_count;
122
123 u64 tsc_offset;
124 u64 virtual_apic_page_addr;
125 u64 vmcs_link_pointer;
126
127 u64 guest_ia32_debugctl;
128 u64 guest_ia32_pat;
129 u64 guest_ia32_efer;
130
131 u64 guest_pdptr0;
132 u64 guest_pdptr1;
133 u64 guest_pdptr2;
134 u64 guest_pdptr3;
135
136 u64 guest_pending_dbg_exceptions;
137 u64 guest_sysenter_esp;
138 u64 guest_sysenter_eip;
139
140 u32 guest_activity_state;
141 u32 guest_sysenter_cs;
142
143 u64 cr0_guest_host_mask;
144 u64 cr4_guest_host_mask;
145 u64 cr0_read_shadow;
146 u64 cr4_read_shadow;
147 u64 guest_cr0;
148 u64 guest_cr3;
149 u64 guest_cr4;
150 u64 guest_dr7;
151
152 u64 host_fs_base;
153 u64 host_gs_base;
154 u64 host_tr_base;
155 u64 host_gdtr_base;
156 u64 host_idtr_base;
157 u64 host_rsp;
158
159 u64 ept_pointer;
160
161 u16 virtual_processor_id;
162 u16 padding16[3];
163
164 u64 padding64_2[5];
165 u64 guest_physical_address;
166
167 u32 vm_instruction_error;
168 u32 vm_exit_reason;
169 u32 vm_exit_intr_info;
170 u32 vm_exit_intr_error_code;
171 u32 idt_vectoring_info_field;
172 u32 idt_vectoring_error_code;
173 u32 vm_exit_instruction_len;
174 u32 vmx_instruction_info;
175
176 u64 exit_qualification;
177 u64 exit_io_instruction_ecx;
178 u64 exit_io_instruction_esi;
179 u64 exit_io_instruction_edi;
180 u64 exit_io_instruction_eip;
181
182 u64 guest_linear_address;
183 u64 guest_rsp;
184 u64 guest_rflags;
185
186 u32 guest_interruptibility_info;
187 u32 cpu_based_vm_exec_control;
188 u32 exception_bitmap;
189 u32 vm_entry_controls;
190 u32 vm_entry_intr_info_field;
191 u32 vm_entry_exception_error_code;
192 u32 vm_entry_instruction_len;
193 u32 tpr_threshold;
194
195 u64 guest_rip;
196
197 u32 hv_clean_fields;
198 u32 hv_padding_32;
199 u32 hv_synthetic_controls;
200 struct {
201 u32 nested_flush_hypercall:1;
202 u32 msr_bitmap:1;
203 u32 reserved:30;
204 } hv_enlightenments_control;
205 u32 hv_vp_id;
206
207 u64 hv_vm_id;
208 u64 partition_assist_page;
209 u64 padding64_4[4];
210 u64 guest_bndcfgs;
211 u64 padding64_5[7];
212 u64 xss_exit_bitmap;
213 u64 padding64_6[7];
214 };
215
216 #define HV_X64_MSR_VP_ASSIST_PAGE 0x40000073
217 #define HV_X64_MSR_VP_ASSIST_PAGE_ENABLE 0x00000001
218 #define HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_SHIFT 12
219 #define HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_MASK \
220 (~((1ull << HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_SHIFT) - 1))
221
222 extern struct hv_enlightened_vmcs *current_evmcs;
223 extern struct hv_vp_assist_page *current_vp_assist;
224
225 int vcpu_enable_evmcs(struct kvm_vm *vm, int vcpu_id);
226
enable_vp_assist(uint64_t vp_assist_pa,void * vp_assist)227 static inline int enable_vp_assist(uint64_t vp_assist_pa, void *vp_assist)
228 {
229 u64 val = (vp_assist_pa & HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_MASK) |
230 HV_X64_MSR_VP_ASSIST_PAGE_ENABLE;
231
232 wrmsr(HV_X64_MSR_VP_ASSIST_PAGE, val);
233
234 current_vp_assist = vp_assist;
235
236 enable_evmcs = true;
237
238 return 0;
239 }
240
evmcs_vmptrld(uint64_t vmcs_pa,void * vmcs)241 static inline int evmcs_vmptrld(uint64_t vmcs_pa, void *vmcs)
242 {
243 current_vp_assist->current_nested_vmcs = vmcs_pa;
244 current_vp_assist->enlighten_vmentry = 1;
245
246 current_evmcs = vmcs;
247
248 return 0;
249 }
250
evmcs_vmptrst(uint64_t * value)251 static inline int evmcs_vmptrst(uint64_t *value)
252 {
253 *value = current_vp_assist->current_nested_vmcs &
254 ~HV_X64_MSR_VP_ASSIST_PAGE_ENABLE;
255
256 return 0;
257 }
258
evmcs_vmread(uint64_t encoding,uint64_t * value)259 static inline int evmcs_vmread(uint64_t encoding, uint64_t *value)
260 {
261 switch (encoding) {
262 case GUEST_RIP:
263 *value = current_evmcs->guest_rip;
264 break;
265 case GUEST_RSP:
266 *value = current_evmcs->guest_rsp;
267 break;
268 case GUEST_RFLAGS:
269 *value = current_evmcs->guest_rflags;
270 break;
271 case HOST_IA32_PAT:
272 *value = current_evmcs->host_ia32_pat;
273 break;
274 case HOST_IA32_EFER:
275 *value = current_evmcs->host_ia32_efer;
276 break;
277 case HOST_CR0:
278 *value = current_evmcs->host_cr0;
279 break;
280 case HOST_CR3:
281 *value = current_evmcs->host_cr3;
282 break;
283 case HOST_CR4:
284 *value = current_evmcs->host_cr4;
285 break;
286 case HOST_IA32_SYSENTER_ESP:
287 *value = current_evmcs->host_ia32_sysenter_esp;
288 break;
289 case HOST_IA32_SYSENTER_EIP:
290 *value = current_evmcs->host_ia32_sysenter_eip;
291 break;
292 case HOST_RIP:
293 *value = current_evmcs->host_rip;
294 break;
295 case IO_BITMAP_A:
296 *value = current_evmcs->io_bitmap_a;
297 break;
298 case IO_BITMAP_B:
299 *value = current_evmcs->io_bitmap_b;
300 break;
301 case MSR_BITMAP:
302 *value = current_evmcs->msr_bitmap;
303 break;
304 case GUEST_ES_BASE:
305 *value = current_evmcs->guest_es_base;
306 break;
307 case GUEST_CS_BASE:
308 *value = current_evmcs->guest_cs_base;
309 break;
310 case GUEST_SS_BASE:
311 *value = current_evmcs->guest_ss_base;
312 break;
313 case GUEST_DS_BASE:
314 *value = current_evmcs->guest_ds_base;
315 break;
316 case GUEST_FS_BASE:
317 *value = current_evmcs->guest_fs_base;
318 break;
319 case GUEST_GS_BASE:
320 *value = current_evmcs->guest_gs_base;
321 break;
322 case GUEST_LDTR_BASE:
323 *value = current_evmcs->guest_ldtr_base;
324 break;
325 case GUEST_TR_BASE:
326 *value = current_evmcs->guest_tr_base;
327 break;
328 case GUEST_GDTR_BASE:
329 *value = current_evmcs->guest_gdtr_base;
330 break;
331 case GUEST_IDTR_BASE:
332 *value = current_evmcs->guest_idtr_base;
333 break;
334 case TSC_OFFSET:
335 *value = current_evmcs->tsc_offset;
336 break;
337 case VIRTUAL_APIC_PAGE_ADDR:
338 *value = current_evmcs->virtual_apic_page_addr;
339 break;
340 case VMCS_LINK_POINTER:
341 *value = current_evmcs->vmcs_link_pointer;
342 break;
343 case GUEST_IA32_DEBUGCTL:
344 *value = current_evmcs->guest_ia32_debugctl;
345 break;
346 case GUEST_IA32_PAT:
347 *value = current_evmcs->guest_ia32_pat;
348 break;
349 case GUEST_IA32_EFER:
350 *value = current_evmcs->guest_ia32_efer;
351 break;
352 case GUEST_PDPTR0:
353 *value = current_evmcs->guest_pdptr0;
354 break;
355 case GUEST_PDPTR1:
356 *value = current_evmcs->guest_pdptr1;
357 break;
358 case GUEST_PDPTR2:
359 *value = current_evmcs->guest_pdptr2;
360 break;
361 case GUEST_PDPTR3:
362 *value = current_evmcs->guest_pdptr3;
363 break;
364 case GUEST_PENDING_DBG_EXCEPTIONS:
365 *value = current_evmcs->guest_pending_dbg_exceptions;
366 break;
367 case GUEST_SYSENTER_ESP:
368 *value = current_evmcs->guest_sysenter_esp;
369 break;
370 case GUEST_SYSENTER_EIP:
371 *value = current_evmcs->guest_sysenter_eip;
372 break;
373 case CR0_GUEST_HOST_MASK:
374 *value = current_evmcs->cr0_guest_host_mask;
375 break;
376 case CR4_GUEST_HOST_MASK:
377 *value = current_evmcs->cr4_guest_host_mask;
378 break;
379 case CR0_READ_SHADOW:
380 *value = current_evmcs->cr0_read_shadow;
381 break;
382 case CR4_READ_SHADOW:
383 *value = current_evmcs->cr4_read_shadow;
384 break;
385 case GUEST_CR0:
386 *value = current_evmcs->guest_cr0;
387 break;
388 case GUEST_CR3:
389 *value = current_evmcs->guest_cr3;
390 break;
391 case GUEST_CR4:
392 *value = current_evmcs->guest_cr4;
393 break;
394 case GUEST_DR7:
395 *value = current_evmcs->guest_dr7;
396 break;
397 case HOST_FS_BASE:
398 *value = current_evmcs->host_fs_base;
399 break;
400 case HOST_GS_BASE:
401 *value = current_evmcs->host_gs_base;
402 break;
403 case HOST_TR_BASE:
404 *value = current_evmcs->host_tr_base;
405 break;
406 case HOST_GDTR_BASE:
407 *value = current_evmcs->host_gdtr_base;
408 break;
409 case HOST_IDTR_BASE:
410 *value = current_evmcs->host_idtr_base;
411 break;
412 case HOST_RSP:
413 *value = current_evmcs->host_rsp;
414 break;
415 case EPT_POINTER:
416 *value = current_evmcs->ept_pointer;
417 break;
418 case GUEST_BNDCFGS:
419 *value = current_evmcs->guest_bndcfgs;
420 break;
421 case XSS_EXIT_BITMAP:
422 *value = current_evmcs->xss_exit_bitmap;
423 break;
424 case GUEST_PHYSICAL_ADDRESS:
425 *value = current_evmcs->guest_physical_address;
426 break;
427 case EXIT_QUALIFICATION:
428 *value = current_evmcs->exit_qualification;
429 break;
430 case GUEST_LINEAR_ADDRESS:
431 *value = current_evmcs->guest_linear_address;
432 break;
433 case VM_EXIT_MSR_STORE_ADDR:
434 *value = current_evmcs->vm_exit_msr_store_addr;
435 break;
436 case VM_EXIT_MSR_LOAD_ADDR:
437 *value = current_evmcs->vm_exit_msr_load_addr;
438 break;
439 case VM_ENTRY_MSR_LOAD_ADDR:
440 *value = current_evmcs->vm_entry_msr_load_addr;
441 break;
442 case CR3_TARGET_VALUE0:
443 *value = current_evmcs->cr3_target_value0;
444 break;
445 case CR3_TARGET_VALUE1:
446 *value = current_evmcs->cr3_target_value1;
447 break;
448 case CR3_TARGET_VALUE2:
449 *value = current_evmcs->cr3_target_value2;
450 break;
451 case CR3_TARGET_VALUE3:
452 *value = current_evmcs->cr3_target_value3;
453 break;
454 case TPR_THRESHOLD:
455 *value = current_evmcs->tpr_threshold;
456 break;
457 case GUEST_INTERRUPTIBILITY_INFO:
458 *value = current_evmcs->guest_interruptibility_info;
459 break;
460 case CPU_BASED_VM_EXEC_CONTROL:
461 *value = current_evmcs->cpu_based_vm_exec_control;
462 break;
463 case EXCEPTION_BITMAP:
464 *value = current_evmcs->exception_bitmap;
465 break;
466 case VM_ENTRY_CONTROLS:
467 *value = current_evmcs->vm_entry_controls;
468 break;
469 case VM_ENTRY_INTR_INFO_FIELD:
470 *value = current_evmcs->vm_entry_intr_info_field;
471 break;
472 case VM_ENTRY_EXCEPTION_ERROR_CODE:
473 *value = current_evmcs->vm_entry_exception_error_code;
474 break;
475 case VM_ENTRY_INSTRUCTION_LEN:
476 *value = current_evmcs->vm_entry_instruction_len;
477 break;
478 case HOST_IA32_SYSENTER_CS:
479 *value = current_evmcs->host_ia32_sysenter_cs;
480 break;
481 case PIN_BASED_VM_EXEC_CONTROL:
482 *value = current_evmcs->pin_based_vm_exec_control;
483 break;
484 case VM_EXIT_CONTROLS:
485 *value = current_evmcs->vm_exit_controls;
486 break;
487 case SECONDARY_VM_EXEC_CONTROL:
488 *value = current_evmcs->secondary_vm_exec_control;
489 break;
490 case GUEST_ES_LIMIT:
491 *value = current_evmcs->guest_es_limit;
492 break;
493 case GUEST_CS_LIMIT:
494 *value = current_evmcs->guest_cs_limit;
495 break;
496 case GUEST_SS_LIMIT:
497 *value = current_evmcs->guest_ss_limit;
498 break;
499 case GUEST_DS_LIMIT:
500 *value = current_evmcs->guest_ds_limit;
501 break;
502 case GUEST_FS_LIMIT:
503 *value = current_evmcs->guest_fs_limit;
504 break;
505 case GUEST_GS_LIMIT:
506 *value = current_evmcs->guest_gs_limit;
507 break;
508 case GUEST_LDTR_LIMIT:
509 *value = current_evmcs->guest_ldtr_limit;
510 break;
511 case GUEST_TR_LIMIT:
512 *value = current_evmcs->guest_tr_limit;
513 break;
514 case GUEST_GDTR_LIMIT:
515 *value = current_evmcs->guest_gdtr_limit;
516 break;
517 case GUEST_IDTR_LIMIT:
518 *value = current_evmcs->guest_idtr_limit;
519 break;
520 case GUEST_ES_AR_BYTES:
521 *value = current_evmcs->guest_es_ar_bytes;
522 break;
523 case GUEST_CS_AR_BYTES:
524 *value = current_evmcs->guest_cs_ar_bytes;
525 break;
526 case GUEST_SS_AR_BYTES:
527 *value = current_evmcs->guest_ss_ar_bytes;
528 break;
529 case GUEST_DS_AR_BYTES:
530 *value = current_evmcs->guest_ds_ar_bytes;
531 break;
532 case GUEST_FS_AR_BYTES:
533 *value = current_evmcs->guest_fs_ar_bytes;
534 break;
535 case GUEST_GS_AR_BYTES:
536 *value = current_evmcs->guest_gs_ar_bytes;
537 break;
538 case GUEST_LDTR_AR_BYTES:
539 *value = current_evmcs->guest_ldtr_ar_bytes;
540 break;
541 case GUEST_TR_AR_BYTES:
542 *value = current_evmcs->guest_tr_ar_bytes;
543 break;
544 case GUEST_ACTIVITY_STATE:
545 *value = current_evmcs->guest_activity_state;
546 break;
547 case GUEST_SYSENTER_CS:
548 *value = current_evmcs->guest_sysenter_cs;
549 break;
550 case VM_INSTRUCTION_ERROR:
551 *value = current_evmcs->vm_instruction_error;
552 break;
553 case VM_EXIT_REASON:
554 *value = current_evmcs->vm_exit_reason;
555 break;
556 case VM_EXIT_INTR_INFO:
557 *value = current_evmcs->vm_exit_intr_info;
558 break;
559 case VM_EXIT_INTR_ERROR_CODE:
560 *value = current_evmcs->vm_exit_intr_error_code;
561 break;
562 case IDT_VECTORING_INFO_FIELD:
563 *value = current_evmcs->idt_vectoring_info_field;
564 break;
565 case IDT_VECTORING_ERROR_CODE:
566 *value = current_evmcs->idt_vectoring_error_code;
567 break;
568 case VM_EXIT_INSTRUCTION_LEN:
569 *value = current_evmcs->vm_exit_instruction_len;
570 break;
571 case VMX_INSTRUCTION_INFO:
572 *value = current_evmcs->vmx_instruction_info;
573 break;
574 case PAGE_FAULT_ERROR_CODE_MASK:
575 *value = current_evmcs->page_fault_error_code_mask;
576 break;
577 case PAGE_FAULT_ERROR_CODE_MATCH:
578 *value = current_evmcs->page_fault_error_code_match;
579 break;
580 case CR3_TARGET_COUNT:
581 *value = current_evmcs->cr3_target_count;
582 break;
583 case VM_EXIT_MSR_STORE_COUNT:
584 *value = current_evmcs->vm_exit_msr_store_count;
585 break;
586 case VM_EXIT_MSR_LOAD_COUNT:
587 *value = current_evmcs->vm_exit_msr_load_count;
588 break;
589 case VM_ENTRY_MSR_LOAD_COUNT:
590 *value = current_evmcs->vm_entry_msr_load_count;
591 break;
592 case HOST_ES_SELECTOR:
593 *value = current_evmcs->host_es_selector;
594 break;
595 case HOST_CS_SELECTOR:
596 *value = current_evmcs->host_cs_selector;
597 break;
598 case HOST_SS_SELECTOR:
599 *value = current_evmcs->host_ss_selector;
600 break;
601 case HOST_DS_SELECTOR:
602 *value = current_evmcs->host_ds_selector;
603 break;
604 case HOST_FS_SELECTOR:
605 *value = current_evmcs->host_fs_selector;
606 break;
607 case HOST_GS_SELECTOR:
608 *value = current_evmcs->host_gs_selector;
609 break;
610 case HOST_TR_SELECTOR:
611 *value = current_evmcs->host_tr_selector;
612 break;
613 case GUEST_ES_SELECTOR:
614 *value = current_evmcs->guest_es_selector;
615 break;
616 case GUEST_CS_SELECTOR:
617 *value = current_evmcs->guest_cs_selector;
618 break;
619 case GUEST_SS_SELECTOR:
620 *value = current_evmcs->guest_ss_selector;
621 break;
622 case GUEST_DS_SELECTOR:
623 *value = current_evmcs->guest_ds_selector;
624 break;
625 case GUEST_FS_SELECTOR:
626 *value = current_evmcs->guest_fs_selector;
627 break;
628 case GUEST_GS_SELECTOR:
629 *value = current_evmcs->guest_gs_selector;
630 break;
631 case GUEST_LDTR_SELECTOR:
632 *value = current_evmcs->guest_ldtr_selector;
633 break;
634 case GUEST_TR_SELECTOR:
635 *value = current_evmcs->guest_tr_selector;
636 break;
637 case VIRTUAL_PROCESSOR_ID:
638 *value = current_evmcs->virtual_processor_id;
639 break;
640 default: return 1;
641 }
642
643 return 0;
644 }
645
evmcs_vmwrite(uint64_t encoding,uint64_t value)646 static inline int evmcs_vmwrite(uint64_t encoding, uint64_t value)
647 {
648 switch (encoding) {
649 case GUEST_RIP:
650 current_evmcs->guest_rip = value;
651 break;
652 case GUEST_RSP:
653 current_evmcs->guest_rsp = value;
654 break;
655 case GUEST_RFLAGS:
656 current_evmcs->guest_rflags = value;
657 break;
658 case HOST_IA32_PAT:
659 current_evmcs->host_ia32_pat = value;
660 break;
661 case HOST_IA32_EFER:
662 current_evmcs->host_ia32_efer = value;
663 break;
664 case HOST_CR0:
665 current_evmcs->host_cr0 = value;
666 break;
667 case HOST_CR3:
668 current_evmcs->host_cr3 = value;
669 break;
670 case HOST_CR4:
671 current_evmcs->host_cr4 = value;
672 break;
673 case HOST_IA32_SYSENTER_ESP:
674 current_evmcs->host_ia32_sysenter_esp = value;
675 break;
676 case HOST_IA32_SYSENTER_EIP:
677 current_evmcs->host_ia32_sysenter_eip = value;
678 break;
679 case HOST_RIP:
680 current_evmcs->host_rip = value;
681 break;
682 case IO_BITMAP_A:
683 current_evmcs->io_bitmap_a = value;
684 break;
685 case IO_BITMAP_B:
686 current_evmcs->io_bitmap_b = value;
687 break;
688 case MSR_BITMAP:
689 current_evmcs->msr_bitmap = value;
690 break;
691 case GUEST_ES_BASE:
692 current_evmcs->guest_es_base = value;
693 break;
694 case GUEST_CS_BASE:
695 current_evmcs->guest_cs_base = value;
696 break;
697 case GUEST_SS_BASE:
698 current_evmcs->guest_ss_base = value;
699 break;
700 case GUEST_DS_BASE:
701 current_evmcs->guest_ds_base = value;
702 break;
703 case GUEST_FS_BASE:
704 current_evmcs->guest_fs_base = value;
705 break;
706 case GUEST_GS_BASE:
707 current_evmcs->guest_gs_base = value;
708 break;
709 case GUEST_LDTR_BASE:
710 current_evmcs->guest_ldtr_base = value;
711 break;
712 case GUEST_TR_BASE:
713 current_evmcs->guest_tr_base = value;
714 break;
715 case GUEST_GDTR_BASE:
716 current_evmcs->guest_gdtr_base = value;
717 break;
718 case GUEST_IDTR_BASE:
719 current_evmcs->guest_idtr_base = value;
720 break;
721 case TSC_OFFSET:
722 current_evmcs->tsc_offset = value;
723 break;
724 case VIRTUAL_APIC_PAGE_ADDR:
725 current_evmcs->virtual_apic_page_addr = value;
726 break;
727 case VMCS_LINK_POINTER:
728 current_evmcs->vmcs_link_pointer = value;
729 break;
730 case GUEST_IA32_DEBUGCTL:
731 current_evmcs->guest_ia32_debugctl = value;
732 break;
733 case GUEST_IA32_PAT:
734 current_evmcs->guest_ia32_pat = value;
735 break;
736 case GUEST_IA32_EFER:
737 current_evmcs->guest_ia32_efer = value;
738 break;
739 case GUEST_PDPTR0:
740 current_evmcs->guest_pdptr0 = value;
741 break;
742 case GUEST_PDPTR1:
743 current_evmcs->guest_pdptr1 = value;
744 break;
745 case GUEST_PDPTR2:
746 current_evmcs->guest_pdptr2 = value;
747 break;
748 case GUEST_PDPTR3:
749 current_evmcs->guest_pdptr3 = value;
750 break;
751 case GUEST_PENDING_DBG_EXCEPTIONS:
752 current_evmcs->guest_pending_dbg_exceptions = value;
753 break;
754 case GUEST_SYSENTER_ESP:
755 current_evmcs->guest_sysenter_esp = value;
756 break;
757 case GUEST_SYSENTER_EIP:
758 current_evmcs->guest_sysenter_eip = value;
759 break;
760 case CR0_GUEST_HOST_MASK:
761 current_evmcs->cr0_guest_host_mask = value;
762 break;
763 case CR4_GUEST_HOST_MASK:
764 current_evmcs->cr4_guest_host_mask = value;
765 break;
766 case CR0_READ_SHADOW:
767 current_evmcs->cr0_read_shadow = value;
768 break;
769 case CR4_READ_SHADOW:
770 current_evmcs->cr4_read_shadow = value;
771 break;
772 case GUEST_CR0:
773 current_evmcs->guest_cr0 = value;
774 break;
775 case GUEST_CR3:
776 current_evmcs->guest_cr3 = value;
777 break;
778 case GUEST_CR4:
779 current_evmcs->guest_cr4 = value;
780 break;
781 case GUEST_DR7:
782 current_evmcs->guest_dr7 = value;
783 break;
784 case HOST_FS_BASE:
785 current_evmcs->host_fs_base = value;
786 break;
787 case HOST_GS_BASE:
788 current_evmcs->host_gs_base = value;
789 break;
790 case HOST_TR_BASE:
791 current_evmcs->host_tr_base = value;
792 break;
793 case HOST_GDTR_BASE:
794 current_evmcs->host_gdtr_base = value;
795 break;
796 case HOST_IDTR_BASE:
797 current_evmcs->host_idtr_base = value;
798 break;
799 case HOST_RSP:
800 current_evmcs->host_rsp = value;
801 break;
802 case EPT_POINTER:
803 current_evmcs->ept_pointer = value;
804 break;
805 case GUEST_BNDCFGS:
806 current_evmcs->guest_bndcfgs = value;
807 break;
808 case XSS_EXIT_BITMAP:
809 current_evmcs->xss_exit_bitmap = value;
810 break;
811 case GUEST_PHYSICAL_ADDRESS:
812 current_evmcs->guest_physical_address = value;
813 break;
814 case EXIT_QUALIFICATION:
815 current_evmcs->exit_qualification = value;
816 break;
817 case GUEST_LINEAR_ADDRESS:
818 current_evmcs->guest_linear_address = value;
819 break;
820 case VM_EXIT_MSR_STORE_ADDR:
821 current_evmcs->vm_exit_msr_store_addr = value;
822 break;
823 case VM_EXIT_MSR_LOAD_ADDR:
824 current_evmcs->vm_exit_msr_load_addr = value;
825 break;
826 case VM_ENTRY_MSR_LOAD_ADDR:
827 current_evmcs->vm_entry_msr_load_addr = value;
828 break;
829 case CR3_TARGET_VALUE0:
830 current_evmcs->cr3_target_value0 = value;
831 break;
832 case CR3_TARGET_VALUE1:
833 current_evmcs->cr3_target_value1 = value;
834 break;
835 case CR3_TARGET_VALUE2:
836 current_evmcs->cr3_target_value2 = value;
837 break;
838 case CR3_TARGET_VALUE3:
839 current_evmcs->cr3_target_value3 = value;
840 break;
841 case TPR_THRESHOLD:
842 current_evmcs->tpr_threshold = value;
843 break;
844 case GUEST_INTERRUPTIBILITY_INFO:
845 current_evmcs->guest_interruptibility_info = value;
846 break;
847 case CPU_BASED_VM_EXEC_CONTROL:
848 current_evmcs->cpu_based_vm_exec_control = value;
849 break;
850 case EXCEPTION_BITMAP:
851 current_evmcs->exception_bitmap = value;
852 break;
853 case VM_ENTRY_CONTROLS:
854 current_evmcs->vm_entry_controls = value;
855 break;
856 case VM_ENTRY_INTR_INFO_FIELD:
857 current_evmcs->vm_entry_intr_info_field = value;
858 break;
859 case VM_ENTRY_EXCEPTION_ERROR_CODE:
860 current_evmcs->vm_entry_exception_error_code = value;
861 break;
862 case VM_ENTRY_INSTRUCTION_LEN:
863 current_evmcs->vm_entry_instruction_len = value;
864 break;
865 case HOST_IA32_SYSENTER_CS:
866 current_evmcs->host_ia32_sysenter_cs = value;
867 break;
868 case PIN_BASED_VM_EXEC_CONTROL:
869 current_evmcs->pin_based_vm_exec_control = value;
870 break;
871 case VM_EXIT_CONTROLS:
872 current_evmcs->vm_exit_controls = value;
873 break;
874 case SECONDARY_VM_EXEC_CONTROL:
875 current_evmcs->secondary_vm_exec_control = value;
876 break;
877 case GUEST_ES_LIMIT:
878 current_evmcs->guest_es_limit = value;
879 break;
880 case GUEST_CS_LIMIT:
881 current_evmcs->guest_cs_limit = value;
882 break;
883 case GUEST_SS_LIMIT:
884 current_evmcs->guest_ss_limit = value;
885 break;
886 case GUEST_DS_LIMIT:
887 current_evmcs->guest_ds_limit = value;
888 break;
889 case GUEST_FS_LIMIT:
890 current_evmcs->guest_fs_limit = value;
891 break;
892 case GUEST_GS_LIMIT:
893 current_evmcs->guest_gs_limit = value;
894 break;
895 case GUEST_LDTR_LIMIT:
896 current_evmcs->guest_ldtr_limit = value;
897 break;
898 case GUEST_TR_LIMIT:
899 current_evmcs->guest_tr_limit = value;
900 break;
901 case GUEST_GDTR_LIMIT:
902 current_evmcs->guest_gdtr_limit = value;
903 break;
904 case GUEST_IDTR_LIMIT:
905 current_evmcs->guest_idtr_limit = value;
906 break;
907 case GUEST_ES_AR_BYTES:
908 current_evmcs->guest_es_ar_bytes = value;
909 break;
910 case GUEST_CS_AR_BYTES:
911 current_evmcs->guest_cs_ar_bytes = value;
912 break;
913 case GUEST_SS_AR_BYTES:
914 current_evmcs->guest_ss_ar_bytes = value;
915 break;
916 case GUEST_DS_AR_BYTES:
917 current_evmcs->guest_ds_ar_bytes = value;
918 break;
919 case GUEST_FS_AR_BYTES:
920 current_evmcs->guest_fs_ar_bytes = value;
921 break;
922 case GUEST_GS_AR_BYTES:
923 current_evmcs->guest_gs_ar_bytes = value;
924 break;
925 case GUEST_LDTR_AR_BYTES:
926 current_evmcs->guest_ldtr_ar_bytes = value;
927 break;
928 case GUEST_TR_AR_BYTES:
929 current_evmcs->guest_tr_ar_bytes = value;
930 break;
931 case GUEST_ACTIVITY_STATE:
932 current_evmcs->guest_activity_state = value;
933 break;
934 case GUEST_SYSENTER_CS:
935 current_evmcs->guest_sysenter_cs = value;
936 break;
937 case VM_INSTRUCTION_ERROR:
938 current_evmcs->vm_instruction_error = value;
939 break;
940 case VM_EXIT_REASON:
941 current_evmcs->vm_exit_reason = value;
942 break;
943 case VM_EXIT_INTR_INFO:
944 current_evmcs->vm_exit_intr_info = value;
945 break;
946 case VM_EXIT_INTR_ERROR_CODE:
947 current_evmcs->vm_exit_intr_error_code = value;
948 break;
949 case IDT_VECTORING_INFO_FIELD:
950 current_evmcs->idt_vectoring_info_field = value;
951 break;
952 case IDT_VECTORING_ERROR_CODE:
953 current_evmcs->idt_vectoring_error_code = value;
954 break;
955 case VM_EXIT_INSTRUCTION_LEN:
956 current_evmcs->vm_exit_instruction_len = value;
957 break;
958 case VMX_INSTRUCTION_INFO:
959 current_evmcs->vmx_instruction_info = value;
960 break;
961 case PAGE_FAULT_ERROR_CODE_MASK:
962 current_evmcs->page_fault_error_code_mask = value;
963 break;
964 case PAGE_FAULT_ERROR_CODE_MATCH:
965 current_evmcs->page_fault_error_code_match = value;
966 break;
967 case CR3_TARGET_COUNT:
968 current_evmcs->cr3_target_count = value;
969 break;
970 case VM_EXIT_MSR_STORE_COUNT:
971 current_evmcs->vm_exit_msr_store_count = value;
972 break;
973 case VM_EXIT_MSR_LOAD_COUNT:
974 current_evmcs->vm_exit_msr_load_count = value;
975 break;
976 case VM_ENTRY_MSR_LOAD_COUNT:
977 current_evmcs->vm_entry_msr_load_count = value;
978 break;
979 case HOST_ES_SELECTOR:
980 current_evmcs->host_es_selector = value;
981 break;
982 case HOST_CS_SELECTOR:
983 current_evmcs->host_cs_selector = value;
984 break;
985 case HOST_SS_SELECTOR:
986 current_evmcs->host_ss_selector = value;
987 break;
988 case HOST_DS_SELECTOR:
989 current_evmcs->host_ds_selector = value;
990 break;
991 case HOST_FS_SELECTOR:
992 current_evmcs->host_fs_selector = value;
993 break;
994 case HOST_GS_SELECTOR:
995 current_evmcs->host_gs_selector = value;
996 break;
997 case HOST_TR_SELECTOR:
998 current_evmcs->host_tr_selector = value;
999 break;
1000 case GUEST_ES_SELECTOR:
1001 current_evmcs->guest_es_selector = value;
1002 break;
1003 case GUEST_CS_SELECTOR:
1004 current_evmcs->guest_cs_selector = value;
1005 break;
1006 case GUEST_SS_SELECTOR:
1007 current_evmcs->guest_ss_selector = value;
1008 break;
1009 case GUEST_DS_SELECTOR:
1010 current_evmcs->guest_ds_selector = value;
1011 break;
1012 case GUEST_FS_SELECTOR:
1013 current_evmcs->guest_fs_selector = value;
1014 break;
1015 case GUEST_GS_SELECTOR:
1016 current_evmcs->guest_gs_selector = value;
1017 break;
1018 case GUEST_LDTR_SELECTOR:
1019 current_evmcs->guest_ldtr_selector = value;
1020 break;
1021 case GUEST_TR_SELECTOR:
1022 current_evmcs->guest_tr_selector = value;
1023 break;
1024 case VIRTUAL_PROCESSOR_ID:
1025 current_evmcs->virtual_processor_id = value;
1026 break;
1027 default: return 1;
1028 }
1029
1030 return 0;
1031 }
1032
evmcs_vmlaunch(void)1033 static inline int evmcs_vmlaunch(void)
1034 {
1035 int ret;
1036
1037 current_evmcs->hv_clean_fields = 0;
1038
1039 __asm__ __volatile__("push %%rbp;"
1040 "push %%rcx;"
1041 "push %%rdx;"
1042 "push %%rsi;"
1043 "push %%rdi;"
1044 "push $0;"
1045 "mov %%rsp, (%[host_rsp]);"
1046 "lea 1f(%%rip), %%rax;"
1047 "mov %%rax, (%[host_rip]);"
1048 "vmlaunch;"
1049 "incq (%%rsp);"
1050 "1: pop %%rax;"
1051 "pop %%rdi;"
1052 "pop %%rsi;"
1053 "pop %%rdx;"
1054 "pop %%rcx;"
1055 "pop %%rbp;"
1056 : [ret]"=&a"(ret)
1057 : [host_rsp]"r"
1058 ((uint64_t)¤t_evmcs->host_rsp),
1059 [host_rip]"r"
1060 ((uint64_t)¤t_evmcs->host_rip)
1061 : "memory", "cc", "rbx", "r8", "r9", "r10",
1062 "r11", "r12", "r13", "r14", "r15");
1063 return ret;
1064 }
1065
1066 /*
1067 * No guest state (e.g. GPRs) is established by this vmresume.
1068 */
evmcs_vmresume(void)1069 static inline int evmcs_vmresume(void)
1070 {
1071 int ret;
1072
1073 current_evmcs->hv_clean_fields = 0;
1074
1075 __asm__ __volatile__("push %%rbp;"
1076 "push %%rcx;"
1077 "push %%rdx;"
1078 "push %%rsi;"
1079 "push %%rdi;"
1080 "push $0;"
1081 "mov %%rsp, (%[host_rsp]);"
1082 "lea 1f(%%rip), %%rax;"
1083 "mov %%rax, (%[host_rip]);"
1084 "vmresume;"
1085 "incq (%%rsp);"
1086 "1: pop %%rax;"
1087 "pop %%rdi;"
1088 "pop %%rsi;"
1089 "pop %%rdx;"
1090 "pop %%rcx;"
1091 "pop %%rbp;"
1092 : [ret]"=&a"(ret)
1093 : [host_rsp]"r"
1094 ((uint64_t)¤t_evmcs->host_rsp),
1095 [host_rip]"r"
1096 ((uint64_t)¤t_evmcs->host_rip)
1097 : "memory", "cc", "rbx", "r8", "r9", "r10",
1098 "r11", "r12", "r13", "r14", "r15");
1099 return ret;
1100 }
1101
1102 #endif /* !SELFTEST_KVM_EVMCS_H */
1103