| /* SPDX-License-Identifier: GPL-2.0 */ | 
 | /* | 
 |  * tools/testing/selftests/kvm/include/vmx.h | 
 |  * | 
 |  * Copyright (C) 2018, Red Hat, Inc. | 
 |  * | 
 |  */ | 
 |  | 
 | #ifndef SELFTEST_KVM_EVMCS_H | 
 | #define SELFTEST_KVM_EVMCS_H | 
 |  | 
 | #include <stdint.h> | 
 | #include "vmx.h" | 
 |  | 
 | #define u16 uint16_t | 
 | #define u32 uint32_t | 
 | #define u64 uint64_t | 
 |  | 
 | extern bool enable_evmcs; | 
 |  | 
 | struct hv_vp_assist_page { | 
 | 	__u32 apic_assist; | 
 | 	__u32 reserved; | 
 | 	__u64 vtl_control[2]; | 
 | 	__u64 nested_enlightenments_control[2]; | 
 | 	__u32 enlighten_vmentry; | 
 | 	__u64 current_nested_vmcs; | 
 | }; | 
 |  | 
 | struct hv_enlightened_vmcs { | 
 | 	u32 revision_id; | 
 | 	u32 abort; | 
 |  | 
 | 	u16 host_es_selector; | 
 | 	u16 host_cs_selector; | 
 | 	u16 host_ss_selector; | 
 | 	u16 host_ds_selector; | 
 | 	u16 host_fs_selector; | 
 | 	u16 host_gs_selector; | 
 | 	u16 host_tr_selector; | 
 |  | 
 | 	u64 host_ia32_pat; | 
 | 	u64 host_ia32_efer; | 
 |  | 
 | 	u64 host_cr0; | 
 | 	u64 host_cr3; | 
 | 	u64 host_cr4; | 
 |  | 
 | 	u64 host_ia32_sysenter_esp; | 
 | 	u64 host_ia32_sysenter_eip; | 
 | 	u64 host_rip; | 
 | 	u32 host_ia32_sysenter_cs; | 
 |  | 
 | 	u32 pin_based_vm_exec_control; | 
 | 	u32 vm_exit_controls; | 
 | 	u32 secondary_vm_exec_control; | 
 |  | 
 | 	u64 io_bitmap_a; | 
 | 	u64 io_bitmap_b; | 
 | 	u64 msr_bitmap; | 
 |  | 
 | 	u16 guest_es_selector; | 
 | 	u16 guest_cs_selector; | 
 | 	u16 guest_ss_selector; | 
 | 	u16 guest_ds_selector; | 
 | 	u16 guest_fs_selector; | 
 | 	u16 guest_gs_selector; | 
 | 	u16 guest_ldtr_selector; | 
 | 	u16 guest_tr_selector; | 
 |  | 
 | 	u32 guest_es_limit; | 
 | 	u32 guest_cs_limit; | 
 | 	u32 guest_ss_limit; | 
 | 	u32 guest_ds_limit; | 
 | 	u32 guest_fs_limit; | 
 | 	u32 guest_gs_limit; | 
 | 	u32 guest_ldtr_limit; | 
 | 	u32 guest_tr_limit; | 
 | 	u32 guest_gdtr_limit; | 
 | 	u32 guest_idtr_limit; | 
 |  | 
 | 	u32 guest_es_ar_bytes; | 
 | 	u32 guest_cs_ar_bytes; | 
 | 	u32 guest_ss_ar_bytes; | 
 | 	u32 guest_ds_ar_bytes; | 
 | 	u32 guest_fs_ar_bytes; | 
 | 	u32 guest_gs_ar_bytes; | 
 | 	u32 guest_ldtr_ar_bytes; | 
 | 	u32 guest_tr_ar_bytes; | 
 |  | 
 | 	u64 guest_es_base; | 
 | 	u64 guest_cs_base; | 
 | 	u64 guest_ss_base; | 
 | 	u64 guest_ds_base; | 
 | 	u64 guest_fs_base; | 
 | 	u64 guest_gs_base; | 
 | 	u64 guest_ldtr_base; | 
 | 	u64 guest_tr_base; | 
 | 	u64 guest_gdtr_base; | 
 | 	u64 guest_idtr_base; | 
 |  | 
 | 	u64 padding64_1[3]; | 
 |  | 
 | 	u64 vm_exit_msr_store_addr; | 
 | 	u64 vm_exit_msr_load_addr; | 
 | 	u64 vm_entry_msr_load_addr; | 
 |  | 
 | 	u64 cr3_target_value0; | 
 | 	u64 cr3_target_value1; | 
 | 	u64 cr3_target_value2; | 
 | 	u64 cr3_target_value3; | 
 |  | 
 | 	u32 page_fault_error_code_mask; | 
 | 	u32 page_fault_error_code_match; | 
 |  | 
 | 	u32 cr3_target_count; | 
 | 	u32 vm_exit_msr_store_count; | 
 | 	u32 vm_exit_msr_load_count; | 
 | 	u32 vm_entry_msr_load_count; | 
 |  | 
 | 	u64 tsc_offset; | 
 | 	u64 virtual_apic_page_addr; | 
 | 	u64 vmcs_link_pointer; | 
 |  | 
 | 	u64 guest_ia32_debugctl; | 
 | 	u64 guest_ia32_pat; | 
 | 	u64 guest_ia32_efer; | 
 |  | 
 | 	u64 guest_pdptr0; | 
 | 	u64 guest_pdptr1; | 
 | 	u64 guest_pdptr2; | 
 | 	u64 guest_pdptr3; | 
 |  | 
 | 	u64 guest_pending_dbg_exceptions; | 
 | 	u64 guest_sysenter_esp; | 
 | 	u64 guest_sysenter_eip; | 
 |  | 
 | 	u32 guest_activity_state; | 
 | 	u32 guest_sysenter_cs; | 
 |  | 
 | 	u64 cr0_guest_host_mask; | 
 | 	u64 cr4_guest_host_mask; | 
 | 	u64 cr0_read_shadow; | 
 | 	u64 cr4_read_shadow; | 
 | 	u64 guest_cr0; | 
 | 	u64 guest_cr3; | 
 | 	u64 guest_cr4; | 
 | 	u64 guest_dr7; | 
 |  | 
 | 	u64 host_fs_base; | 
 | 	u64 host_gs_base; | 
 | 	u64 host_tr_base; | 
 | 	u64 host_gdtr_base; | 
 | 	u64 host_idtr_base; | 
 | 	u64 host_rsp; | 
 |  | 
 | 	u64 ept_pointer; | 
 |  | 
 | 	u16 virtual_processor_id; | 
 | 	u16 padding16[3]; | 
 |  | 
 | 	u64 padding64_2[5]; | 
 | 	u64 guest_physical_address; | 
 |  | 
 | 	u32 vm_instruction_error; | 
 | 	u32 vm_exit_reason; | 
 | 	u32 vm_exit_intr_info; | 
 | 	u32 vm_exit_intr_error_code; | 
 | 	u32 idt_vectoring_info_field; | 
 | 	u32 idt_vectoring_error_code; | 
 | 	u32 vm_exit_instruction_len; | 
 | 	u32 vmx_instruction_info; | 
 |  | 
 | 	u64 exit_qualification; | 
 | 	u64 exit_io_instruction_ecx; | 
 | 	u64 exit_io_instruction_esi; | 
 | 	u64 exit_io_instruction_edi; | 
 | 	u64 exit_io_instruction_eip; | 
 |  | 
 | 	u64 guest_linear_address; | 
 | 	u64 guest_rsp; | 
 | 	u64 guest_rflags; | 
 |  | 
 | 	u32 guest_interruptibility_info; | 
 | 	u32 cpu_based_vm_exec_control; | 
 | 	u32 exception_bitmap; | 
 | 	u32 vm_entry_controls; | 
 | 	u32 vm_entry_intr_info_field; | 
 | 	u32 vm_entry_exception_error_code; | 
 | 	u32 vm_entry_instruction_len; | 
 | 	u32 tpr_threshold; | 
 |  | 
 | 	u64 guest_rip; | 
 |  | 
 | 	u32 hv_clean_fields; | 
 | 	u32 hv_padding_32; | 
 | 	u32 hv_synthetic_controls; | 
 | 	struct { | 
 | 		u32 nested_flush_hypercall:1; | 
 | 		u32 msr_bitmap:1; | 
 | 		u32 reserved:30; | 
 | 	} hv_enlightenments_control; | 
 | 	u32 hv_vp_id; | 
 |  | 
 | 	u64 hv_vm_id; | 
 | 	u64 partition_assist_page; | 
 | 	u64 padding64_4[4]; | 
 | 	u64 guest_bndcfgs; | 
 | 	u64 padding64_5[7]; | 
 | 	u64 xss_exit_bitmap; | 
 | 	u64 padding64_6[7]; | 
 | }; | 
 |  | 
 | #define HV_X64_MSR_VP_ASSIST_PAGE		0x40000073 | 
 | #define HV_X64_MSR_VP_ASSIST_PAGE_ENABLE	0x00000001 | 
 | #define HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_SHIFT	12 | 
 | #define HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_MASK	\ | 
 | 		(~((1ull << HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_SHIFT) - 1)) | 
 |  | 
 | struct hv_enlightened_vmcs *current_evmcs; | 
 | struct hv_vp_assist_page *current_vp_assist; | 
 |  | 
 | static inline int enable_vp_assist(uint64_t vp_assist_pa, void *vp_assist) | 
 | { | 
 | 	u64 val = (vp_assist_pa & HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_MASK) | | 
 | 		HV_X64_MSR_VP_ASSIST_PAGE_ENABLE; | 
 |  | 
 | 	wrmsr(HV_X64_MSR_VP_ASSIST_PAGE, val); | 
 |  | 
 | 	current_vp_assist = vp_assist; | 
 |  | 
 | 	enable_evmcs = true; | 
 |  | 
 | 	return 0; | 
 | } | 
 |  | 
 | static inline int evmcs_vmptrld(uint64_t vmcs_pa, void *vmcs) | 
 | { | 
 | 	current_vp_assist->current_nested_vmcs = vmcs_pa; | 
 | 	current_vp_assist->enlighten_vmentry = 1; | 
 |  | 
 | 	current_evmcs = vmcs; | 
 |  | 
 | 	return 0; | 
 | } | 
 |  | 
 | static inline int evmcs_vmptrst(uint64_t *value) | 
 | { | 
 | 	*value = current_vp_assist->current_nested_vmcs & | 
 | 		~HV_X64_MSR_VP_ASSIST_PAGE_ENABLE; | 
 |  | 
 | 	return 0; | 
 | } | 
 |  | 
 | static inline int evmcs_vmread(uint64_t encoding, uint64_t *value) | 
 | { | 
 | 	switch (encoding) { | 
 | 	case GUEST_RIP: | 
 | 		*value = current_evmcs->guest_rip; | 
 | 		break; | 
 | 	case GUEST_RSP: | 
 | 		*value = current_evmcs->guest_rsp; | 
 | 		break; | 
 | 	case GUEST_RFLAGS: | 
 | 		*value = current_evmcs->guest_rflags; | 
 | 		break; | 
 | 	case HOST_IA32_PAT: | 
 | 		*value = current_evmcs->host_ia32_pat; | 
 | 		break; | 
 | 	case HOST_IA32_EFER: | 
 | 		*value = current_evmcs->host_ia32_efer; | 
 | 		break; | 
 | 	case HOST_CR0: | 
 | 		*value = current_evmcs->host_cr0; | 
 | 		break; | 
 | 	case HOST_CR3: | 
 | 		*value = current_evmcs->host_cr3; | 
 | 		break; | 
 | 	case HOST_CR4: | 
 | 		*value = current_evmcs->host_cr4; | 
 | 		break; | 
 | 	case HOST_IA32_SYSENTER_ESP: | 
 | 		*value = current_evmcs->host_ia32_sysenter_esp; | 
 | 		break; | 
 | 	case HOST_IA32_SYSENTER_EIP: | 
 | 		*value = current_evmcs->host_ia32_sysenter_eip; | 
 | 		break; | 
 | 	case HOST_RIP: | 
 | 		*value = current_evmcs->host_rip; | 
 | 		break; | 
 | 	case IO_BITMAP_A: | 
 | 		*value = current_evmcs->io_bitmap_a; | 
 | 		break; | 
 | 	case IO_BITMAP_B: | 
 | 		*value = current_evmcs->io_bitmap_b; | 
 | 		break; | 
 | 	case MSR_BITMAP: | 
 | 		*value = current_evmcs->msr_bitmap; | 
 | 		break; | 
 | 	case GUEST_ES_BASE: | 
 | 		*value = current_evmcs->guest_es_base; | 
 | 		break; | 
 | 	case GUEST_CS_BASE: | 
 | 		*value = current_evmcs->guest_cs_base; | 
 | 		break; | 
 | 	case GUEST_SS_BASE: | 
 | 		*value = current_evmcs->guest_ss_base; | 
 | 		break; | 
 | 	case GUEST_DS_BASE: | 
 | 		*value = current_evmcs->guest_ds_base; | 
 | 		break; | 
 | 	case GUEST_FS_BASE: | 
 | 		*value = current_evmcs->guest_fs_base; | 
 | 		break; | 
 | 	case GUEST_GS_BASE: | 
 | 		*value = current_evmcs->guest_gs_base; | 
 | 		break; | 
 | 	case GUEST_LDTR_BASE: | 
 | 		*value = current_evmcs->guest_ldtr_base; | 
 | 		break; | 
 | 	case GUEST_TR_BASE: | 
 | 		*value = current_evmcs->guest_tr_base; | 
 | 		break; | 
 | 	case GUEST_GDTR_BASE: | 
 | 		*value = current_evmcs->guest_gdtr_base; | 
 | 		break; | 
 | 	case GUEST_IDTR_BASE: | 
 | 		*value = current_evmcs->guest_idtr_base; | 
 | 		break; | 
 | 	case TSC_OFFSET: | 
 | 		*value = current_evmcs->tsc_offset; | 
 | 		break; | 
 | 	case VIRTUAL_APIC_PAGE_ADDR: | 
 | 		*value = current_evmcs->virtual_apic_page_addr; | 
 | 		break; | 
 | 	case VMCS_LINK_POINTER: | 
 | 		*value = current_evmcs->vmcs_link_pointer; | 
 | 		break; | 
 | 	case GUEST_IA32_DEBUGCTL: | 
 | 		*value = current_evmcs->guest_ia32_debugctl; | 
 | 		break; | 
 | 	case GUEST_IA32_PAT: | 
 | 		*value = current_evmcs->guest_ia32_pat; | 
 | 		break; | 
 | 	case GUEST_IA32_EFER: | 
 | 		*value = current_evmcs->guest_ia32_efer; | 
 | 		break; | 
 | 	case GUEST_PDPTR0: | 
 | 		*value = current_evmcs->guest_pdptr0; | 
 | 		break; | 
 | 	case GUEST_PDPTR1: | 
 | 		*value = current_evmcs->guest_pdptr1; | 
 | 		break; | 
 | 	case GUEST_PDPTR2: | 
 | 		*value = current_evmcs->guest_pdptr2; | 
 | 		break; | 
 | 	case GUEST_PDPTR3: | 
 | 		*value = current_evmcs->guest_pdptr3; | 
 | 		break; | 
 | 	case GUEST_PENDING_DBG_EXCEPTIONS: | 
 | 		*value = current_evmcs->guest_pending_dbg_exceptions; | 
 | 		break; | 
 | 	case GUEST_SYSENTER_ESP: | 
 | 		*value = current_evmcs->guest_sysenter_esp; | 
 | 		break; | 
 | 	case GUEST_SYSENTER_EIP: | 
 | 		*value = current_evmcs->guest_sysenter_eip; | 
 | 		break; | 
 | 	case CR0_GUEST_HOST_MASK: | 
 | 		*value = current_evmcs->cr0_guest_host_mask; | 
 | 		break; | 
 | 	case CR4_GUEST_HOST_MASK: | 
 | 		*value = current_evmcs->cr4_guest_host_mask; | 
 | 		break; | 
 | 	case CR0_READ_SHADOW: | 
 | 		*value = current_evmcs->cr0_read_shadow; | 
 | 		break; | 
 | 	case CR4_READ_SHADOW: | 
 | 		*value = current_evmcs->cr4_read_shadow; | 
 | 		break; | 
 | 	case GUEST_CR0: | 
 | 		*value = current_evmcs->guest_cr0; | 
 | 		break; | 
 | 	case GUEST_CR3: | 
 | 		*value = current_evmcs->guest_cr3; | 
 | 		break; | 
 | 	case GUEST_CR4: | 
 | 		*value = current_evmcs->guest_cr4; | 
 | 		break; | 
 | 	case GUEST_DR7: | 
 | 		*value = current_evmcs->guest_dr7; | 
 | 		break; | 
 | 	case HOST_FS_BASE: | 
 | 		*value = current_evmcs->host_fs_base; | 
 | 		break; | 
 | 	case HOST_GS_BASE: | 
 | 		*value = current_evmcs->host_gs_base; | 
 | 		break; | 
 | 	case HOST_TR_BASE: | 
 | 		*value = current_evmcs->host_tr_base; | 
 | 		break; | 
 | 	case HOST_GDTR_BASE: | 
 | 		*value = current_evmcs->host_gdtr_base; | 
 | 		break; | 
 | 	case HOST_IDTR_BASE: | 
 | 		*value = current_evmcs->host_idtr_base; | 
 | 		break; | 
 | 	case HOST_RSP: | 
 | 		*value = current_evmcs->host_rsp; | 
 | 		break; | 
 | 	case EPT_POINTER: | 
 | 		*value = current_evmcs->ept_pointer; | 
 | 		break; | 
 | 	case GUEST_BNDCFGS: | 
 | 		*value = current_evmcs->guest_bndcfgs; | 
 | 		break; | 
 | 	case XSS_EXIT_BITMAP: | 
 | 		*value = current_evmcs->xss_exit_bitmap; | 
 | 		break; | 
 | 	case GUEST_PHYSICAL_ADDRESS: | 
 | 		*value = current_evmcs->guest_physical_address; | 
 | 		break; | 
 | 	case EXIT_QUALIFICATION: | 
 | 		*value = current_evmcs->exit_qualification; | 
 | 		break; | 
 | 	case GUEST_LINEAR_ADDRESS: | 
 | 		*value = current_evmcs->guest_linear_address; | 
 | 		break; | 
 | 	case VM_EXIT_MSR_STORE_ADDR: | 
 | 		*value = current_evmcs->vm_exit_msr_store_addr; | 
 | 		break; | 
 | 	case VM_EXIT_MSR_LOAD_ADDR: | 
 | 		*value = current_evmcs->vm_exit_msr_load_addr; | 
 | 		break; | 
 | 	case VM_ENTRY_MSR_LOAD_ADDR: | 
 | 		*value = current_evmcs->vm_entry_msr_load_addr; | 
 | 		break; | 
 | 	case CR3_TARGET_VALUE0: | 
 | 		*value = current_evmcs->cr3_target_value0; | 
 | 		break; | 
 | 	case CR3_TARGET_VALUE1: | 
 | 		*value = current_evmcs->cr3_target_value1; | 
 | 		break; | 
 | 	case CR3_TARGET_VALUE2: | 
 | 		*value = current_evmcs->cr3_target_value2; | 
 | 		break; | 
 | 	case CR3_TARGET_VALUE3: | 
 | 		*value = current_evmcs->cr3_target_value3; | 
 | 		break; | 
 | 	case TPR_THRESHOLD: | 
 | 		*value = current_evmcs->tpr_threshold; | 
 | 		break; | 
 | 	case GUEST_INTERRUPTIBILITY_INFO: | 
 | 		*value = current_evmcs->guest_interruptibility_info; | 
 | 		break; | 
 | 	case CPU_BASED_VM_EXEC_CONTROL: | 
 | 		*value = current_evmcs->cpu_based_vm_exec_control; | 
 | 		break; | 
 | 	case EXCEPTION_BITMAP: | 
 | 		*value = current_evmcs->exception_bitmap; | 
 | 		break; | 
 | 	case VM_ENTRY_CONTROLS: | 
 | 		*value = current_evmcs->vm_entry_controls; | 
 | 		break; | 
 | 	case VM_ENTRY_INTR_INFO_FIELD: | 
 | 		*value = current_evmcs->vm_entry_intr_info_field; | 
 | 		break; | 
 | 	case VM_ENTRY_EXCEPTION_ERROR_CODE: | 
 | 		*value = current_evmcs->vm_entry_exception_error_code; | 
 | 		break; | 
 | 	case VM_ENTRY_INSTRUCTION_LEN: | 
 | 		*value = current_evmcs->vm_entry_instruction_len; | 
 | 		break; | 
 | 	case HOST_IA32_SYSENTER_CS: | 
 | 		*value = current_evmcs->host_ia32_sysenter_cs; | 
 | 		break; | 
 | 	case PIN_BASED_VM_EXEC_CONTROL: | 
 | 		*value = current_evmcs->pin_based_vm_exec_control; | 
 | 		break; | 
 | 	case VM_EXIT_CONTROLS: | 
 | 		*value = current_evmcs->vm_exit_controls; | 
 | 		break; | 
 | 	case SECONDARY_VM_EXEC_CONTROL: | 
 | 		*value = current_evmcs->secondary_vm_exec_control; | 
 | 		break; | 
 | 	case GUEST_ES_LIMIT: | 
 | 		*value = current_evmcs->guest_es_limit; | 
 | 		break; | 
 | 	case GUEST_CS_LIMIT: | 
 | 		*value = current_evmcs->guest_cs_limit; | 
 | 		break; | 
 | 	case GUEST_SS_LIMIT: | 
 | 		*value = current_evmcs->guest_ss_limit; | 
 | 		break; | 
 | 	case GUEST_DS_LIMIT: | 
 | 		*value = current_evmcs->guest_ds_limit; | 
 | 		break; | 
 | 	case GUEST_FS_LIMIT: | 
 | 		*value = current_evmcs->guest_fs_limit; | 
 | 		break; | 
 | 	case GUEST_GS_LIMIT: | 
 | 		*value = current_evmcs->guest_gs_limit; | 
 | 		break; | 
 | 	case GUEST_LDTR_LIMIT: | 
 | 		*value = current_evmcs->guest_ldtr_limit; | 
 | 		break; | 
 | 	case GUEST_TR_LIMIT: | 
 | 		*value = current_evmcs->guest_tr_limit; | 
 | 		break; | 
 | 	case GUEST_GDTR_LIMIT: | 
 | 		*value = current_evmcs->guest_gdtr_limit; | 
 | 		break; | 
 | 	case GUEST_IDTR_LIMIT: | 
 | 		*value = current_evmcs->guest_idtr_limit; | 
 | 		break; | 
 | 	case GUEST_ES_AR_BYTES: | 
 | 		*value = current_evmcs->guest_es_ar_bytes; | 
 | 		break; | 
 | 	case GUEST_CS_AR_BYTES: | 
 | 		*value = current_evmcs->guest_cs_ar_bytes; | 
 | 		break; | 
 | 	case GUEST_SS_AR_BYTES: | 
 | 		*value = current_evmcs->guest_ss_ar_bytes; | 
 | 		break; | 
 | 	case GUEST_DS_AR_BYTES: | 
 | 		*value = current_evmcs->guest_ds_ar_bytes; | 
 | 		break; | 
 | 	case GUEST_FS_AR_BYTES: | 
 | 		*value = current_evmcs->guest_fs_ar_bytes; | 
 | 		break; | 
 | 	case GUEST_GS_AR_BYTES: | 
 | 		*value = current_evmcs->guest_gs_ar_bytes; | 
 | 		break; | 
 | 	case GUEST_LDTR_AR_BYTES: | 
 | 		*value = current_evmcs->guest_ldtr_ar_bytes; | 
 | 		break; | 
 | 	case GUEST_TR_AR_BYTES: | 
 | 		*value = current_evmcs->guest_tr_ar_bytes; | 
 | 		break; | 
 | 	case GUEST_ACTIVITY_STATE: | 
 | 		*value = current_evmcs->guest_activity_state; | 
 | 		break; | 
 | 	case GUEST_SYSENTER_CS: | 
 | 		*value = current_evmcs->guest_sysenter_cs; | 
 | 		break; | 
 | 	case VM_INSTRUCTION_ERROR: | 
 | 		*value = current_evmcs->vm_instruction_error; | 
 | 		break; | 
 | 	case VM_EXIT_REASON: | 
 | 		*value = current_evmcs->vm_exit_reason; | 
 | 		break; | 
 | 	case VM_EXIT_INTR_INFO: | 
 | 		*value = current_evmcs->vm_exit_intr_info; | 
 | 		break; | 
 | 	case VM_EXIT_INTR_ERROR_CODE: | 
 | 		*value = current_evmcs->vm_exit_intr_error_code; | 
 | 		break; | 
 | 	case IDT_VECTORING_INFO_FIELD: | 
 | 		*value = current_evmcs->idt_vectoring_info_field; | 
 | 		break; | 
 | 	case IDT_VECTORING_ERROR_CODE: | 
 | 		*value = current_evmcs->idt_vectoring_error_code; | 
 | 		break; | 
 | 	case VM_EXIT_INSTRUCTION_LEN: | 
 | 		*value = current_evmcs->vm_exit_instruction_len; | 
 | 		break; | 
 | 	case VMX_INSTRUCTION_INFO: | 
 | 		*value = current_evmcs->vmx_instruction_info; | 
 | 		break; | 
 | 	case PAGE_FAULT_ERROR_CODE_MASK: | 
 | 		*value = current_evmcs->page_fault_error_code_mask; | 
 | 		break; | 
 | 	case PAGE_FAULT_ERROR_CODE_MATCH: | 
 | 		*value = current_evmcs->page_fault_error_code_match; | 
 | 		break; | 
 | 	case CR3_TARGET_COUNT: | 
 | 		*value = current_evmcs->cr3_target_count; | 
 | 		break; | 
 | 	case VM_EXIT_MSR_STORE_COUNT: | 
 | 		*value = current_evmcs->vm_exit_msr_store_count; | 
 | 		break; | 
 | 	case VM_EXIT_MSR_LOAD_COUNT: | 
 | 		*value = current_evmcs->vm_exit_msr_load_count; | 
 | 		break; | 
 | 	case VM_ENTRY_MSR_LOAD_COUNT: | 
 | 		*value = current_evmcs->vm_entry_msr_load_count; | 
 | 		break; | 
 | 	case HOST_ES_SELECTOR: | 
 | 		*value = current_evmcs->host_es_selector; | 
 | 		break; | 
 | 	case HOST_CS_SELECTOR: | 
 | 		*value = current_evmcs->host_cs_selector; | 
 | 		break; | 
 | 	case HOST_SS_SELECTOR: | 
 | 		*value = current_evmcs->host_ss_selector; | 
 | 		break; | 
 | 	case HOST_DS_SELECTOR: | 
 | 		*value = current_evmcs->host_ds_selector; | 
 | 		break; | 
 | 	case HOST_FS_SELECTOR: | 
 | 		*value = current_evmcs->host_fs_selector; | 
 | 		break; | 
 | 	case HOST_GS_SELECTOR: | 
 | 		*value = current_evmcs->host_gs_selector; | 
 | 		break; | 
 | 	case HOST_TR_SELECTOR: | 
 | 		*value = current_evmcs->host_tr_selector; | 
 | 		break; | 
 | 	case GUEST_ES_SELECTOR: | 
 | 		*value = current_evmcs->guest_es_selector; | 
 | 		break; | 
 | 	case GUEST_CS_SELECTOR: | 
 | 		*value = current_evmcs->guest_cs_selector; | 
 | 		break; | 
 | 	case GUEST_SS_SELECTOR: | 
 | 		*value = current_evmcs->guest_ss_selector; | 
 | 		break; | 
 | 	case GUEST_DS_SELECTOR: | 
 | 		*value = current_evmcs->guest_ds_selector; | 
 | 		break; | 
 | 	case GUEST_FS_SELECTOR: | 
 | 		*value = current_evmcs->guest_fs_selector; | 
 | 		break; | 
 | 	case GUEST_GS_SELECTOR: | 
 | 		*value = current_evmcs->guest_gs_selector; | 
 | 		break; | 
 | 	case GUEST_LDTR_SELECTOR: | 
 | 		*value = current_evmcs->guest_ldtr_selector; | 
 | 		break; | 
 | 	case GUEST_TR_SELECTOR: | 
 | 		*value = current_evmcs->guest_tr_selector; | 
 | 		break; | 
 | 	case VIRTUAL_PROCESSOR_ID: | 
 | 		*value = current_evmcs->virtual_processor_id; | 
 | 		break; | 
 | 	default: return 1; | 
 | 	} | 
 |  | 
 | 	return 0; | 
 | } | 
 |  | 
 | static inline int evmcs_vmwrite(uint64_t encoding, uint64_t value) | 
 | { | 
 | 	switch (encoding) { | 
 | 	case GUEST_RIP: | 
 | 		current_evmcs->guest_rip = value; | 
 | 		break; | 
 | 	case GUEST_RSP: | 
 | 		current_evmcs->guest_rsp = value; | 
 | 		break; | 
 | 	case GUEST_RFLAGS: | 
 | 		current_evmcs->guest_rflags = value; | 
 | 		break; | 
 | 	case HOST_IA32_PAT: | 
 | 		current_evmcs->host_ia32_pat = value; | 
 | 		break; | 
 | 	case HOST_IA32_EFER: | 
 | 		current_evmcs->host_ia32_efer = value; | 
 | 		break; | 
 | 	case HOST_CR0: | 
 | 		current_evmcs->host_cr0 = value; | 
 | 		break; | 
 | 	case HOST_CR3: | 
 | 		current_evmcs->host_cr3 = value; | 
 | 		break; | 
 | 	case HOST_CR4: | 
 | 		current_evmcs->host_cr4 = value; | 
 | 		break; | 
 | 	case HOST_IA32_SYSENTER_ESP: | 
 | 		current_evmcs->host_ia32_sysenter_esp = value; | 
 | 		break; | 
 | 	case HOST_IA32_SYSENTER_EIP: | 
 | 		current_evmcs->host_ia32_sysenter_eip = value; | 
 | 		break; | 
 | 	case HOST_RIP: | 
 | 		current_evmcs->host_rip = value; | 
 | 		break; | 
 | 	case IO_BITMAP_A: | 
 | 		current_evmcs->io_bitmap_a = value; | 
 | 		break; | 
 | 	case IO_BITMAP_B: | 
 | 		current_evmcs->io_bitmap_b = value; | 
 | 		break; | 
 | 	case MSR_BITMAP: | 
 | 		current_evmcs->msr_bitmap = value; | 
 | 		break; | 
 | 	case GUEST_ES_BASE: | 
 | 		current_evmcs->guest_es_base = value; | 
 | 		break; | 
 | 	case GUEST_CS_BASE: | 
 | 		current_evmcs->guest_cs_base = value; | 
 | 		break; | 
 | 	case GUEST_SS_BASE: | 
 | 		current_evmcs->guest_ss_base = value; | 
 | 		break; | 
 | 	case GUEST_DS_BASE: | 
 | 		current_evmcs->guest_ds_base = value; | 
 | 		break; | 
 | 	case GUEST_FS_BASE: | 
 | 		current_evmcs->guest_fs_base = value; | 
 | 		break; | 
 | 	case GUEST_GS_BASE: | 
 | 		current_evmcs->guest_gs_base = value; | 
 | 		break; | 
 | 	case GUEST_LDTR_BASE: | 
 | 		current_evmcs->guest_ldtr_base = value; | 
 | 		break; | 
 | 	case GUEST_TR_BASE: | 
 | 		current_evmcs->guest_tr_base = value; | 
 | 		break; | 
 | 	case GUEST_GDTR_BASE: | 
 | 		current_evmcs->guest_gdtr_base = value; | 
 | 		break; | 
 | 	case GUEST_IDTR_BASE: | 
 | 		current_evmcs->guest_idtr_base = value; | 
 | 		break; | 
 | 	case TSC_OFFSET: | 
 | 		current_evmcs->tsc_offset = value; | 
 | 		break; | 
 | 	case VIRTUAL_APIC_PAGE_ADDR: | 
 | 		current_evmcs->virtual_apic_page_addr = value; | 
 | 		break; | 
 | 	case VMCS_LINK_POINTER: | 
 | 		current_evmcs->vmcs_link_pointer = value; | 
 | 		break; | 
 | 	case GUEST_IA32_DEBUGCTL: | 
 | 		current_evmcs->guest_ia32_debugctl = value; | 
 | 		break; | 
 | 	case GUEST_IA32_PAT: | 
 | 		current_evmcs->guest_ia32_pat = value; | 
 | 		break; | 
 | 	case GUEST_IA32_EFER: | 
 | 		current_evmcs->guest_ia32_efer = value; | 
 | 		break; | 
 | 	case GUEST_PDPTR0: | 
 | 		current_evmcs->guest_pdptr0 = value; | 
 | 		break; | 
 | 	case GUEST_PDPTR1: | 
 | 		current_evmcs->guest_pdptr1 = value; | 
 | 		break; | 
 | 	case GUEST_PDPTR2: | 
 | 		current_evmcs->guest_pdptr2 = value; | 
 | 		break; | 
 | 	case GUEST_PDPTR3: | 
 | 		current_evmcs->guest_pdptr3 = value; | 
 | 		break; | 
 | 	case GUEST_PENDING_DBG_EXCEPTIONS: | 
 | 		current_evmcs->guest_pending_dbg_exceptions = value; | 
 | 		break; | 
 | 	case GUEST_SYSENTER_ESP: | 
 | 		current_evmcs->guest_sysenter_esp = value; | 
 | 		break; | 
 | 	case GUEST_SYSENTER_EIP: | 
 | 		current_evmcs->guest_sysenter_eip = value; | 
 | 		break; | 
 | 	case CR0_GUEST_HOST_MASK: | 
 | 		current_evmcs->cr0_guest_host_mask = value; | 
 | 		break; | 
 | 	case CR4_GUEST_HOST_MASK: | 
 | 		current_evmcs->cr4_guest_host_mask = value; | 
 | 		break; | 
 | 	case CR0_READ_SHADOW: | 
 | 		current_evmcs->cr0_read_shadow = value; | 
 | 		break; | 
 | 	case CR4_READ_SHADOW: | 
 | 		current_evmcs->cr4_read_shadow = value; | 
 | 		break; | 
 | 	case GUEST_CR0: | 
 | 		current_evmcs->guest_cr0 = value; | 
 | 		break; | 
 | 	case GUEST_CR3: | 
 | 		current_evmcs->guest_cr3 = value; | 
 | 		break; | 
 | 	case GUEST_CR4: | 
 | 		current_evmcs->guest_cr4 = value; | 
 | 		break; | 
 | 	case GUEST_DR7: | 
 | 		current_evmcs->guest_dr7 = value; | 
 | 		break; | 
 | 	case HOST_FS_BASE: | 
 | 		current_evmcs->host_fs_base = value; | 
 | 		break; | 
 | 	case HOST_GS_BASE: | 
 | 		current_evmcs->host_gs_base = value; | 
 | 		break; | 
 | 	case HOST_TR_BASE: | 
 | 		current_evmcs->host_tr_base = value; | 
 | 		break; | 
 | 	case HOST_GDTR_BASE: | 
 | 		current_evmcs->host_gdtr_base = value; | 
 | 		break; | 
 | 	case HOST_IDTR_BASE: | 
 | 		current_evmcs->host_idtr_base = value; | 
 | 		break; | 
 | 	case HOST_RSP: | 
 | 		current_evmcs->host_rsp = value; | 
 | 		break; | 
 | 	case EPT_POINTER: | 
 | 		current_evmcs->ept_pointer = value; | 
 | 		break; | 
 | 	case GUEST_BNDCFGS: | 
 | 		current_evmcs->guest_bndcfgs = value; | 
 | 		break; | 
 | 	case XSS_EXIT_BITMAP: | 
 | 		current_evmcs->xss_exit_bitmap = value; | 
 | 		break; | 
 | 	case GUEST_PHYSICAL_ADDRESS: | 
 | 		current_evmcs->guest_physical_address = value; | 
 | 		break; | 
 | 	case EXIT_QUALIFICATION: | 
 | 		current_evmcs->exit_qualification = value; | 
 | 		break; | 
 | 	case GUEST_LINEAR_ADDRESS: | 
 | 		current_evmcs->guest_linear_address = value; | 
 | 		break; | 
 | 	case VM_EXIT_MSR_STORE_ADDR: | 
 | 		current_evmcs->vm_exit_msr_store_addr = value; | 
 | 		break; | 
 | 	case VM_EXIT_MSR_LOAD_ADDR: | 
 | 		current_evmcs->vm_exit_msr_load_addr = value; | 
 | 		break; | 
 | 	case VM_ENTRY_MSR_LOAD_ADDR: | 
 | 		current_evmcs->vm_entry_msr_load_addr = value; | 
 | 		break; | 
 | 	case CR3_TARGET_VALUE0: | 
 | 		current_evmcs->cr3_target_value0 = value; | 
 | 		break; | 
 | 	case CR3_TARGET_VALUE1: | 
 | 		current_evmcs->cr3_target_value1 = value; | 
 | 		break; | 
 | 	case CR3_TARGET_VALUE2: | 
 | 		current_evmcs->cr3_target_value2 = value; | 
 | 		break; | 
 | 	case CR3_TARGET_VALUE3: | 
 | 		current_evmcs->cr3_target_value3 = value; | 
 | 		break; | 
 | 	case TPR_THRESHOLD: | 
 | 		current_evmcs->tpr_threshold = value; | 
 | 		break; | 
 | 	case GUEST_INTERRUPTIBILITY_INFO: | 
 | 		current_evmcs->guest_interruptibility_info = value; | 
 | 		break; | 
 | 	case CPU_BASED_VM_EXEC_CONTROL: | 
 | 		current_evmcs->cpu_based_vm_exec_control = value; | 
 | 		break; | 
 | 	case EXCEPTION_BITMAP: | 
 | 		current_evmcs->exception_bitmap = value; | 
 | 		break; | 
 | 	case VM_ENTRY_CONTROLS: | 
 | 		current_evmcs->vm_entry_controls = value; | 
 | 		break; | 
 | 	case VM_ENTRY_INTR_INFO_FIELD: | 
 | 		current_evmcs->vm_entry_intr_info_field = value; | 
 | 		break; | 
 | 	case VM_ENTRY_EXCEPTION_ERROR_CODE: | 
 | 		current_evmcs->vm_entry_exception_error_code = value; | 
 | 		break; | 
 | 	case VM_ENTRY_INSTRUCTION_LEN: | 
 | 		current_evmcs->vm_entry_instruction_len = value; | 
 | 		break; | 
 | 	case HOST_IA32_SYSENTER_CS: | 
 | 		current_evmcs->host_ia32_sysenter_cs = value; | 
 | 		break; | 
 | 	case PIN_BASED_VM_EXEC_CONTROL: | 
 | 		current_evmcs->pin_based_vm_exec_control = value; | 
 | 		break; | 
 | 	case VM_EXIT_CONTROLS: | 
 | 		current_evmcs->vm_exit_controls = value; | 
 | 		break; | 
 | 	case SECONDARY_VM_EXEC_CONTROL: | 
 | 		current_evmcs->secondary_vm_exec_control = value; | 
 | 		break; | 
 | 	case GUEST_ES_LIMIT: | 
 | 		current_evmcs->guest_es_limit = value; | 
 | 		break; | 
 | 	case GUEST_CS_LIMIT: | 
 | 		current_evmcs->guest_cs_limit = value; | 
 | 		break; | 
 | 	case GUEST_SS_LIMIT: | 
 | 		current_evmcs->guest_ss_limit = value; | 
 | 		break; | 
 | 	case GUEST_DS_LIMIT: | 
 | 		current_evmcs->guest_ds_limit = value; | 
 | 		break; | 
 | 	case GUEST_FS_LIMIT: | 
 | 		current_evmcs->guest_fs_limit = value; | 
 | 		break; | 
 | 	case GUEST_GS_LIMIT: | 
 | 		current_evmcs->guest_gs_limit = value; | 
 | 		break; | 
 | 	case GUEST_LDTR_LIMIT: | 
 | 		current_evmcs->guest_ldtr_limit = value; | 
 | 		break; | 
 | 	case GUEST_TR_LIMIT: | 
 | 		current_evmcs->guest_tr_limit = value; | 
 | 		break; | 
 | 	case GUEST_GDTR_LIMIT: | 
 | 		current_evmcs->guest_gdtr_limit = value; | 
 | 		break; | 
 | 	case GUEST_IDTR_LIMIT: | 
 | 		current_evmcs->guest_idtr_limit = value; | 
 | 		break; | 
 | 	case GUEST_ES_AR_BYTES: | 
 | 		current_evmcs->guest_es_ar_bytes = value; | 
 | 		break; | 
 | 	case GUEST_CS_AR_BYTES: | 
 | 		current_evmcs->guest_cs_ar_bytes = value; | 
 | 		break; | 
 | 	case GUEST_SS_AR_BYTES: | 
 | 		current_evmcs->guest_ss_ar_bytes = value; | 
 | 		break; | 
 | 	case GUEST_DS_AR_BYTES: | 
 | 		current_evmcs->guest_ds_ar_bytes = value; | 
 | 		break; | 
 | 	case GUEST_FS_AR_BYTES: | 
 | 		current_evmcs->guest_fs_ar_bytes = value; | 
 | 		break; | 
 | 	case GUEST_GS_AR_BYTES: | 
 | 		current_evmcs->guest_gs_ar_bytes = value; | 
 | 		break; | 
 | 	case GUEST_LDTR_AR_BYTES: | 
 | 		current_evmcs->guest_ldtr_ar_bytes = value; | 
 | 		break; | 
 | 	case GUEST_TR_AR_BYTES: | 
 | 		current_evmcs->guest_tr_ar_bytes = value; | 
 | 		break; | 
 | 	case GUEST_ACTIVITY_STATE: | 
 | 		current_evmcs->guest_activity_state = value; | 
 | 		break; | 
 | 	case GUEST_SYSENTER_CS: | 
 | 		current_evmcs->guest_sysenter_cs = value; | 
 | 		break; | 
 | 	case VM_INSTRUCTION_ERROR: | 
 | 		current_evmcs->vm_instruction_error = value; | 
 | 		break; | 
 | 	case VM_EXIT_REASON: | 
 | 		current_evmcs->vm_exit_reason = value; | 
 | 		break; | 
 | 	case VM_EXIT_INTR_INFO: | 
 | 		current_evmcs->vm_exit_intr_info = value; | 
 | 		break; | 
 | 	case VM_EXIT_INTR_ERROR_CODE: | 
 | 		current_evmcs->vm_exit_intr_error_code = value; | 
 | 		break; | 
 | 	case IDT_VECTORING_INFO_FIELD: | 
 | 		current_evmcs->idt_vectoring_info_field = value; | 
 | 		break; | 
 | 	case IDT_VECTORING_ERROR_CODE: | 
 | 		current_evmcs->idt_vectoring_error_code = value; | 
 | 		break; | 
 | 	case VM_EXIT_INSTRUCTION_LEN: | 
 | 		current_evmcs->vm_exit_instruction_len = value; | 
 | 		break; | 
 | 	case VMX_INSTRUCTION_INFO: | 
 | 		current_evmcs->vmx_instruction_info = value; | 
 | 		break; | 
 | 	case PAGE_FAULT_ERROR_CODE_MASK: | 
 | 		current_evmcs->page_fault_error_code_mask = value; | 
 | 		break; | 
 | 	case PAGE_FAULT_ERROR_CODE_MATCH: | 
 | 		current_evmcs->page_fault_error_code_match = value; | 
 | 		break; | 
 | 	case CR3_TARGET_COUNT: | 
 | 		current_evmcs->cr3_target_count = value; | 
 | 		break; | 
 | 	case VM_EXIT_MSR_STORE_COUNT: | 
 | 		current_evmcs->vm_exit_msr_store_count = value; | 
 | 		break; | 
 | 	case VM_EXIT_MSR_LOAD_COUNT: | 
 | 		current_evmcs->vm_exit_msr_load_count = value; | 
 | 		break; | 
 | 	case VM_ENTRY_MSR_LOAD_COUNT: | 
 | 		current_evmcs->vm_entry_msr_load_count = value; | 
 | 		break; | 
 | 	case HOST_ES_SELECTOR: | 
 | 		current_evmcs->host_es_selector = value; | 
 | 		break; | 
 | 	case HOST_CS_SELECTOR: | 
 | 		current_evmcs->host_cs_selector = value; | 
 | 		break; | 
 | 	case HOST_SS_SELECTOR: | 
 | 		current_evmcs->host_ss_selector = value; | 
 | 		break; | 
 | 	case HOST_DS_SELECTOR: | 
 | 		current_evmcs->host_ds_selector = value; | 
 | 		break; | 
 | 	case HOST_FS_SELECTOR: | 
 | 		current_evmcs->host_fs_selector = value; | 
 | 		break; | 
 | 	case HOST_GS_SELECTOR: | 
 | 		current_evmcs->host_gs_selector = value; | 
 | 		break; | 
 | 	case HOST_TR_SELECTOR: | 
 | 		current_evmcs->host_tr_selector = value; | 
 | 		break; | 
 | 	case GUEST_ES_SELECTOR: | 
 | 		current_evmcs->guest_es_selector = value; | 
 | 		break; | 
 | 	case GUEST_CS_SELECTOR: | 
 | 		current_evmcs->guest_cs_selector = value; | 
 | 		break; | 
 | 	case GUEST_SS_SELECTOR: | 
 | 		current_evmcs->guest_ss_selector = value; | 
 | 		break; | 
 | 	case GUEST_DS_SELECTOR: | 
 | 		current_evmcs->guest_ds_selector = value; | 
 | 		break; | 
 | 	case GUEST_FS_SELECTOR: | 
 | 		current_evmcs->guest_fs_selector = value; | 
 | 		break; | 
 | 	case GUEST_GS_SELECTOR: | 
 | 		current_evmcs->guest_gs_selector = value; | 
 | 		break; | 
 | 	case GUEST_LDTR_SELECTOR: | 
 | 		current_evmcs->guest_ldtr_selector = value; | 
 | 		break; | 
 | 	case GUEST_TR_SELECTOR: | 
 | 		current_evmcs->guest_tr_selector = value; | 
 | 		break; | 
 | 	case VIRTUAL_PROCESSOR_ID: | 
 | 		current_evmcs->virtual_processor_id = value; | 
 | 		break; | 
 | 	default: return 1; | 
 | 	} | 
 |  | 
 | 	return 0; | 
 | } | 
 |  | 
 | static inline int evmcs_vmlaunch(void) | 
 | { | 
 | 	int ret; | 
 |  | 
 | 	current_evmcs->hv_clean_fields = 0; | 
 |  | 
 | 	__asm__ __volatile__("push %%rbp;" | 
 | 			     "push %%rcx;" | 
 | 			     "push %%rdx;" | 
 | 			     "push %%rsi;" | 
 | 			     "push %%rdi;" | 
 | 			     "push $0;" | 
 | 			     "mov %%rsp, (%[host_rsp]);" | 
 | 			     "lea 1f(%%rip), %%rax;" | 
 | 			     "mov %%rax, (%[host_rip]);" | 
 | 			     "vmlaunch;" | 
 | 			     "incq (%%rsp);" | 
 | 			     "1: pop %%rax;" | 
 | 			     "pop %%rdi;" | 
 | 			     "pop %%rsi;" | 
 | 			     "pop %%rdx;" | 
 | 			     "pop %%rcx;" | 
 | 			     "pop %%rbp;" | 
 | 			     : [ret]"=&a"(ret) | 
 | 			     : [host_rsp]"r" | 
 | 			       ((uint64_t)¤t_evmcs->host_rsp), | 
 | 			       [host_rip]"r" | 
 | 			       ((uint64_t)¤t_evmcs->host_rip) | 
 | 			     : "memory", "cc", "rbx", "r8", "r9", "r10", | 
 | 			       "r11", "r12", "r13", "r14", "r15"); | 
 | 	return ret; | 
 | } | 
 |  | 
 | /* | 
 |  * No guest state (e.g. GPRs) is established by this vmresume. | 
 |  */ | 
 | static inline int evmcs_vmresume(void) | 
 | { | 
 | 	int ret; | 
 |  | 
 | 	current_evmcs->hv_clean_fields = 0; | 
 |  | 
 | 	__asm__ __volatile__("push %%rbp;" | 
 | 			     "push %%rcx;" | 
 | 			     "push %%rdx;" | 
 | 			     "push %%rsi;" | 
 | 			     "push %%rdi;" | 
 | 			     "push $0;" | 
 | 			     "mov %%rsp, (%[host_rsp]);" | 
 | 			     "lea 1f(%%rip), %%rax;" | 
 | 			     "mov %%rax, (%[host_rip]);" | 
 | 			     "vmresume;" | 
 | 			     "incq (%%rsp);" | 
 | 			     "1: pop %%rax;" | 
 | 			     "pop %%rdi;" | 
 | 			     "pop %%rsi;" | 
 | 			     "pop %%rdx;" | 
 | 			     "pop %%rcx;" | 
 | 			     "pop %%rbp;" | 
 | 			     : [ret]"=&a"(ret) | 
 | 			     : [host_rsp]"r" | 
 | 			       ((uint64_t)¤t_evmcs->host_rsp), | 
 | 			       [host_rip]"r" | 
 | 			       ((uint64_t)¤t_evmcs->host_rip) | 
 | 			     : "memory", "cc", "rbx", "r8", "r9", "r10", | 
 | 			       "r11", "r12", "r13", "r14", "r15"); | 
 | 	return ret; | 
 | } | 
 |  | 
 | #endif /* !SELFTEST_KVM_EVMCS_H */ |