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