1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * tools/testing/selftests/kvm/include/vmx.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
21extern bool enable_evmcs;
22
23struct 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
32struct 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
222extern struct hv_enlightened_vmcs *current_evmcs;
223extern struct hv_vp_assist_page *current_vp_assist;
224
225int vcpu_enable_evmcs(struct kvm_vm *vm, int vcpu_id);
226
227static 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
241static 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
251static 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
259static 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
646static 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
1033static 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)&current_evmcs->host_rsp),
1059			       [host_rip]"r"
1060			       ((uint64_t)&current_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 */
1069static 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)&current_evmcs->host_rsp),
1095			       [host_rip]"r"
1096			       ((uint64_t)&current_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