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