18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * tools/testing/selftests/kvm/include/vmx.h
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (C) 2018, Red Hat, Inc.
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci */
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#ifndef SELFTEST_KVM_EVMCS_H
108c2ecf20Sopenharmony_ci#define SELFTEST_KVM_EVMCS_H
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include <stdint.h>
138c2ecf20Sopenharmony_ci#include "vmx.h"
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#define u16 uint16_t
168c2ecf20Sopenharmony_ci#define u32 uint32_t
178c2ecf20Sopenharmony_ci#define u64 uint64_t
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci#define EVMCS_VERSION 1
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ciextern bool enable_evmcs;
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_cistruct hv_vp_assist_page {
248c2ecf20Sopenharmony_ci	__u32 apic_assist;
258c2ecf20Sopenharmony_ci	__u32 reserved;
268c2ecf20Sopenharmony_ci	__u64 vtl_control[2];
278c2ecf20Sopenharmony_ci	__u64 nested_enlightenments_control[2];
288c2ecf20Sopenharmony_ci	__u32 enlighten_vmentry;
298c2ecf20Sopenharmony_ci	__u64 current_nested_vmcs;
308c2ecf20Sopenharmony_ci};
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_cistruct hv_enlightened_vmcs {
338c2ecf20Sopenharmony_ci	u32 revision_id;
348c2ecf20Sopenharmony_ci	u32 abort;
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci	u16 host_es_selector;
378c2ecf20Sopenharmony_ci	u16 host_cs_selector;
388c2ecf20Sopenharmony_ci	u16 host_ss_selector;
398c2ecf20Sopenharmony_ci	u16 host_ds_selector;
408c2ecf20Sopenharmony_ci	u16 host_fs_selector;
418c2ecf20Sopenharmony_ci	u16 host_gs_selector;
428c2ecf20Sopenharmony_ci	u16 host_tr_selector;
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci	u64 host_ia32_pat;
458c2ecf20Sopenharmony_ci	u64 host_ia32_efer;
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci	u64 host_cr0;
488c2ecf20Sopenharmony_ci	u64 host_cr3;
498c2ecf20Sopenharmony_ci	u64 host_cr4;
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci	u64 host_ia32_sysenter_esp;
528c2ecf20Sopenharmony_ci	u64 host_ia32_sysenter_eip;
538c2ecf20Sopenharmony_ci	u64 host_rip;
548c2ecf20Sopenharmony_ci	u32 host_ia32_sysenter_cs;
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci	u32 pin_based_vm_exec_control;
578c2ecf20Sopenharmony_ci	u32 vm_exit_controls;
588c2ecf20Sopenharmony_ci	u32 secondary_vm_exec_control;
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_ci	u64 io_bitmap_a;
618c2ecf20Sopenharmony_ci	u64 io_bitmap_b;
628c2ecf20Sopenharmony_ci	u64 msr_bitmap;
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_ci	u16 guest_es_selector;
658c2ecf20Sopenharmony_ci	u16 guest_cs_selector;
668c2ecf20Sopenharmony_ci	u16 guest_ss_selector;
678c2ecf20Sopenharmony_ci	u16 guest_ds_selector;
688c2ecf20Sopenharmony_ci	u16 guest_fs_selector;
698c2ecf20Sopenharmony_ci	u16 guest_gs_selector;
708c2ecf20Sopenharmony_ci	u16 guest_ldtr_selector;
718c2ecf20Sopenharmony_ci	u16 guest_tr_selector;
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_ci	u32 guest_es_limit;
748c2ecf20Sopenharmony_ci	u32 guest_cs_limit;
758c2ecf20Sopenharmony_ci	u32 guest_ss_limit;
768c2ecf20Sopenharmony_ci	u32 guest_ds_limit;
778c2ecf20Sopenharmony_ci	u32 guest_fs_limit;
788c2ecf20Sopenharmony_ci	u32 guest_gs_limit;
798c2ecf20Sopenharmony_ci	u32 guest_ldtr_limit;
808c2ecf20Sopenharmony_ci	u32 guest_tr_limit;
818c2ecf20Sopenharmony_ci	u32 guest_gdtr_limit;
828c2ecf20Sopenharmony_ci	u32 guest_idtr_limit;
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_ci	u32 guest_es_ar_bytes;
858c2ecf20Sopenharmony_ci	u32 guest_cs_ar_bytes;
868c2ecf20Sopenharmony_ci	u32 guest_ss_ar_bytes;
878c2ecf20Sopenharmony_ci	u32 guest_ds_ar_bytes;
888c2ecf20Sopenharmony_ci	u32 guest_fs_ar_bytes;
898c2ecf20Sopenharmony_ci	u32 guest_gs_ar_bytes;
908c2ecf20Sopenharmony_ci	u32 guest_ldtr_ar_bytes;
918c2ecf20Sopenharmony_ci	u32 guest_tr_ar_bytes;
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_ci	u64 guest_es_base;
948c2ecf20Sopenharmony_ci	u64 guest_cs_base;
958c2ecf20Sopenharmony_ci	u64 guest_ss_base;
968c2ecf20Sopenharmony_ci	u64 guest_ds_base;
978c2ecf20Sopenharmony_ci	u64 guest_fs_base;
988c2ecf20Sopenharmony_ci	u64 guest_gs_base;
998c2ecf20Sopenharmony_ci	u64 guest_ldtr_base;
1008c2ecf20Sopenharmony_ci	u64 guest_tr_base;
1018c2ecf20Sopenharmony_ci	u64 guest_gdtr_base;
1028c2ecf20Sopenharmony_ci	u64 guest_idtr_base;
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_ci	u64 padding64_1[3];
1058c2ecf20Sopenharmony_ci
1068c2ecf20Sopenharmony_ci	u64 vm_exit_msr_store_addr;
1078c2ecf20Sopenharmony_ci	u64 vm_exit_msr_load_addr;
1088c2ecf20Sopenharmony_ci	u64 vm_entry_msr_load_addr;
1098c2ecf20Sopenharmony_ci
1108c2ecf20Sopenharmony_ci	u64 cr3_target_value0;
1118c2ecf20Sopenharmony_ci	u64 cr3_target_value1;
1128c2ecf20Sopenharmony_ci	u64 cr3_target_value2;
1138c2ecf20Sopenharmony_ci	u64 cr3_target_value3;
1148c2ecf20Sopenharmony_ci
1158c2ecf20Sopenharmony_ci	u32 page_fault_error_code_mask;
1168c2ecf20Sopenharmony_ci	u32 page_fault_error_code_match;
1178c2ecf20Sopenharmony_ci
1188c2ecf20Sopenharmony_ci	u32 cr3_target_count;
1198c2ecf20Sopenharmony_ci	u32 vm_exit_msr_store_count;
1208c2ecf20Sopenharmony_ci	u32 vm_exit_msr_load_count;
1218c2ecf20Sopenharmony_ci	u32 vm_entry_msr_load_count;
1228c2ecf20Sopenharmony_ci
1238c2ecf20Sopenharmony_ci	u64 tsc_offset;
1248c2ecf20Sopenharmony_ci	u64 virtual_apic_page_addr;
1258c2ecf20Sopenharmony_ci	u64 vmcs_link_pointer;
1268c2ecf20Sopenharmony_ci
1278c2ecf20Sopenharmony_ci	u64 guest_ia32_debugctl;
1288c2ecf20Sopenharmony_ci	u64 guest_ia32_pat;
1298c2ecf20Sopenharmony_ci	u64 guest_ia32_efer;
1308c2ecf20Sopenharmony_ci
1318c2ecf20Sopenharmony_ci	u64 guest_pdptr0;
1328c2ecf20Sopenharmony_ci	u64 guest_pdptr1;
1338c2ecf20Sopenharmony_ci	u64 guest_pdptr2;
1348c2ecf20Sopenharmony_ci	u64 guest_pdptr3;
1358c2ecf20Sopenharmony_ci
1368c2ecf20Sopenharmony_ci	u64 guest_pending_dbg_exceptions;
1378c2ecf20Sopenharmony_ci	u64 guest_sysenter_esp;
1388c2ecf20Sopenharmony_ci	u64 guest_sysenter_eip;
1398c2ecf20Sopenharmony_ci
1408c2ecf20Sopenharmony_ci	u32 guest_activity_state;
1418c2ecf20Sopenharmony_ci	u32 guest_sysenter_cs;
1428c2ecf20Sopenharmony_ci
1438c2ecf20Sopenharmony_ci	u64 cr0_guest_host_mask;
1448c2ecf20Sopenharmony_ci	u64 cr4_guest_host_mask;
1458c2ecf20Sopenharmony_ci	u64 cr0_read_shadow;
1468c2ecf20Sopenharmony_ci	u64 cr4_read_shadow;
1478c2ecf20Sopenharmony_ci	u64 guest_cr0;
1488c2ecf20Sopenharmony_ci	u64 guest_cr3;
1498c2ecf20Sopenharmony_ci	u64 guest_cr4;
1508c2ecf20Sopenharmony_ci	u64 guest_dr7;
1518c2ecf20Sopenharmony_ci
1528c2ecf20Sopenharmony_ci	u64 host_fs_base;
1538c2ecf20Sopenharmony_ci	u64 host_gs_base;
1548c2ecf20Sopenharmony_ci	u64 host_tr_base;
1558c2ecf20Sopenharmony_ci	u64 host_gdtr_base;
1568c2ecf20Sopenharmony_ci	u64 host_idtr_base;
1578c2ecf20Sopenharmony_ci	u64 host_rsp;
1588c2ecf20Sopenharmony_ci
1598c2ecf20Sopenharmony_ci	u64 ept_pointer;
1608c2ecf20Sopenharmony_ci
1618c2ecf20Sopenharmony_ci	u16 virtual_processor_id;
1628c2ecf20Sopenharmony_ci	u16 padding16[3];
1638c2ecf20Sopenharmony_ci
1648c2ecf20Sopenharmony_ci	u64 padding64_2[5];
1658c2ecf20Sopenharmony_ci	u64 guest_physical_address;
1668c2ecf20Sopenharmony_ci
1678c2ecf20Sopenharmony_ci	u32 vm_instruction_error;
1688c2ecf20Sopenharmony_ci	u32 vm_exit_reason;
1698c2ecf20Sopenharmony_ci	u32 vm_exit_intr_info;
1708c2ecf20Sopenharmony_ci	u32 vm_exit_intr_error_code;
1718c2ecf20Sopenharmony_ci	u32 idt_vectoring_info_field;
1728c2ecf20Sopenharmony_ci	u32 idt_vectoring_error_code;
1738c2ecf20Sopenharmony_ci	u32 vm_exit_instruction_len;
1748c2ecf20Sopenharmony_ci	u32 vmx_instruction_info;
1758c2ecf20Sopenharmony_ci
1768c2ecf20Sopenharmony_ci	u64 exit_qualification;
1778c2ecf20Sopenharmony_ci	u64 exit_io_instruction_ecx;
1788c2ecf20Sopenharmony_ci	u64 exit_io_instruction_esi;
1798c2ecf20Sopenharmony_ci	u64 exit_io_instruction_edi;
1808c2ecf20Sopenharmony_ci	u64 exit_io_instruction_eip;
1818c2ecf20Sopenharmony_ci
1828c2ecf20Sopenharmony_ci	u64 guest_linear_address;
1838c2ecf20Sopenharmony_ci	u64 guest_rsp;
1848c2ecf20Sopenharmony_ci	u64 guest_rflags;
1858c2ecf20Sopenharmony_ci
1868c2ecf20Sopenharmony_ci	u32 guest_interruptibility_info;
1878c2ecf20Sopenharmony_ci	u32 cpu_based_vm_exec_control;
1888c2ecf20Sopenharmony_ci	u32 exception_bitmap;
1898c2ecf20Sopenharmony_ci	u32 vm_entry_controls;
1908c2ecf20Sopenharmony_ci	u32 vm_entry_intr_info_field;
1918c2ecf20Sopenharmony_ci	u32 vm_entry_exception_error_code;
1928c2ecf20Sopenharmony_ci	u32 vm_entry_instruction_len;
1938c2ecf20Sopenharmony_ci	u32 tpr_threshold;
1948c2ecf20Sopenharmony_ci
1958c2ecf20Sopenharmony_ci	u64 guest_rip;
1968c2ecf20Sopenharmony_ci
1978c2ecf20Sopenharmony_ci	u32 hv_clean_fields;
1988c2ecf20Sopenharmony_ci	u32 hv_padding_32;
1998c2ecf20Sopenharmony_ci	u32 hv_synthetic_controls;
2008c2ecf20Sopenharmony_ci	struct {
2018c2ecf20Sopenharmony_ci		u32 nested_flush_hypercall:1;
2028c2ecf20Sopenharmony_ci		u32 msr_bitmap:1;
2038c2ecf20Sopenharmony_ci		u32 reserved:30;
2048c2ecf20Sopenharmony_ci	} hv_enlightenments_control;
2058c2ecf20Sopenharmony_ci	u32 hv_vp_id;
2068c2ecf20Sopenharmony_ci
2078c2ecf20Sopenharmony_ci	u64 hv_vm_id;
2088c2ecf20Sopenharmony_ci	u64 partition_assist_page;
2098c2ecf20Sopenharmony_ci	u64 padding64_4[4];
2108c2ecf20Sopenharmony_ci	u64 guest_bndcfgs;
2118c2ecf20Sopenharmony_ci	u64 padding64_5[7];
2128c2ecf20Sopenharmony_ci	u64 xss_exit_bitmap;
2138c2ecf20Sopenharmony_ci	u64 padding64_6[7];
2148c2ecf20Sopenharmony_ci};
2158c2ecf20Sopenharmony_ci
2168c2ecf20Sopenharmony_ci#define HV_X64_MSR_VP_ASSIST_PAGE		0x40000073
2178c2ecf20Sopenharmony_ci#define HV_X64_MSR_VP_ASSIST_PAGE_ENABLE	0x00000001
2188c2ecf20Sopenharmony_ci#define HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_SHIFT	12
2198c2ecf20Sopenharmony_ci#define HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_MASK	\
2208c2ecf20Sopenharmony_ci		(~((1ull << HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_SHIFT) - 1))
2218c2ecf20Sopenharmony_ci
2228c2ecf20Sopenharmony_ciextern struct hv_enlightened_vmcs *current_evmcs;
2238c2ecf20Sopenharmony_ciextern struct hv_vp_assist_page *current_vp_assist;
2248c2ecf20Sopenharmony_ci
2258c2ecf20Sopenharmony_ciint vcpu_enable_evmcs(struct kvm_vm *vm, int vcpu_id);
2268c2ecf20Sopenharmony_ci
2278c2ecf20Sopenharmony_cistatic inline int enable_vp_assist(uint64_t vp_assist_pa, void *vp_assist)
2288c2ecf20Sopenharmony_ci{
2298c2ecf20Sopenharmony_ci	u64 val = (vp_assist_pa & HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_MASK) |
2308c2ecf20Sopenharmony_ci		HV_X64_MSR_VP_ASSIST_PAGE_ENABLE;
2318c2ecf20Sopenharmony_ci
2328c2ecf20Sopenharmony_ci	wrmsr(HV_X64_MSR_VP_ASSIST_PAGE, val);
2338c2ecf20Sopenharmony_ci
2348c2ecf20Sopenharmony_ci	current_vp_assist = vp_assist;
2358c2ecf20Sopenharmony_ci
2368c2ecf20Sopenharmony_ci	enable_evmcs = true;
2378c2ecf20Sopenharmony_ci
2388c2ecf20Sopenharmony_ci	return 0;
2398c2ecf20Sopenharmony_ci}
2408c2ecf20Sopenharmony_ci
2418c2ecf20Sopenharmony_cistatic inline int evmcs_vmptrld(uint64_t vmcs_pa, void *vmcs)
2428c2ecf20Sopenharmony_ci{
2438c2ecf20Sopenharmony_ci	current_vp_assist->current_nested_vmcs = vmcs_pa;
2448c2ecf20Sopenharmony_ci	current_vp_assist->enlighten_vmentry = 1;
2458c2ecf20Sopenharmony_ci
2468c2ecf20Sopenharmony_ci	current_evmcs = vmcs;
2478c2ecf20Sopenharmony_ci
2488c2ecf20Sopenharmony_ci	return 0;
2498c2ecf20Sopenharmony_ci}
2508c2ecf20Sopenharmony_ci
2518c2ecf20Sopenharmony_cistatic inline int evmcs_vmptrst(uint64_t *value)
2528c2ecf20Sopenharmony_ci{
2538c2ecf20Sopenharmony_ci	*value = current_vp_assist->current_nested_vmcs &
2548c2ecf20Sopenharmony_ci		~HV_X64_MSR_VP_ASSIST_PAGE_ENABLE;
2558c2ecf20Sopenharmony_ci
2568c2ecf20Sopenharmony_ci	return 0;
2578c2ecf20Sopenharmony_ci}
2588c2ecf20Sopenharmony_ci
2598c2ecf20Sopenharmony_cistatic inline int evmcs_vmread(uint64_t encoding, uint64_t *value)
2608c2ecf20Sopenharmony_ci{
2618c2ecf20Sopenharmony_ci	switch (encoding) {
2628c2ecf20Sopenharmony_ci	case GUEST_RIP:
2638c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_rip;
2648c2ecf20Sopenharmony_ci		break;
2658c2ecf20Sopenharmony_ci	case GUEST_RSP:
2668c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_rsp;
2678c2ecf20Sopenharmony_ci		break;
2688c2ecf20Sopenharmony_ci	case GUEST_RFLAGS:
2698c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_rflags;
2708c2ecf20Sopenharmony_ci		break;
2718c2ecf20Sopenharmony_ci	case HOST_IA32_PAT:
2728c2ecf20Sopenharmony_ci		*value = current_evmcs->host_ia32_pat;
2738c2ecf20Sopenharmony_ci		break;
2748c2ecf20Sopenharmony_ci	case HOST_IA32_EFER:
2758c2ecf20Sopenharmony_ci		*value = current_evmcs->host_ia32_efer;
2768c2ecf20Sopenharmony_ci		break;
2778c2ecf20Sopenharmony_ci	case HOST_CR0:
2788c2ecf20Sopenharmony_ci		*value = current_evmcs->host_cr0;
2798c2ecf20Sopenharmony_ci		break;
2808c2ecf20Sopenharmony_ci	case HOST_CR3:
2818c2ecf20Sopenharmony_ci		*value = current_evmcs->host_cr3;
2828c2ecf20Sopenharmony_ci		break;
2838c2ecf20Sopenharmony_ci	case HOST_CR4:
2848c2ecf20Sopenharmony_ci		*value = current_evmcs->host_cr4;
2858c2ecf20Sopenharmony_ci		break;
2868c2ecf20Sopenharmony_ci	case HOST_IA32_SYSENTER_ESP:
2878c2ecf20Sopenharmony_ci		*value = current_evmcs->host_ia32_sysenter_esp;
2888c2ecf20Sopenharmony_ci		break;
2898c2ecf20Sopenharmony_ci	case HOST_IA32_SYSENTER_EIP:
2908c2ecf20Sopenharmony_ci		*value = current_evmcs->host_ia32_sysenter_eip;
2918c2ecf20Sopenharmony_ci		break;
2928c2ecf20Sopenharmony_ci	case HOST_RIP:
2938c2ecf20Sopenharmony_ci		*value = current_evmcs->host_rip;
2948c2ecf20Sopenharmony_ci		break;
2958c2ecf20Sopenharmony_ci	case IO_BITMAP_A:
2968c2ecf20Sopenharmony_ci		*value = current_evmcs->io_bitmap_a;
2978c2ecf20Sopenharmony_ci		break;
2988c2ecf20Sopenharmony_ci	case IO_BITMAP_B:
2998c2ecf20Sopenharmony_ci		*value = current_evmcs->io_bitmap_b;
3008c2ecf20Sopenharmony_ci		break;
3018c2ecf20Sopenharmony_ci	case MSR_BITMAP:
3028c2ecf20Sopenharmony_ci		*value = current_evmcs->msr_bitmap;
3038c2ecf20Sopenharmony_ci		break;
3048c2ecf20Sopenharmony_ci	case GUEST_ES_BASE:
3058c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_es_base;
3068c2ecf20Sopenharmony_ci		break;
3078c2ecf20Sopenharmony_ci	case GUEST_CS_BASE:
3088c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_cs_base;
3098c2ecf20Sopenharmony_ci		break;
3108c2ecf20Sopenharmony_ci	case GUEST_SS_BASE:
3118c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_ss_base;
3128c2ecf20Sopenharmony_ci		break;
3138c2ecf20Sopenharmony_ci	case GUEST_DS_BASE:
3148c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_ds_base;
3158c2ecf20Sopenharmony_ci		break;
3168c2ecf20Sopenharmony_ci	case GUEST_FS_BASE:
3178c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_fs_base;
3188c2ecf20Sopenharmony_ci		break;
3198c2ecf20Sopenharmony_ci	case GUEST_GS_BASE:
3208c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_gs_base;
3218c2ecf20Sopenharmony_ci		break;
3228c2ecf20Sopenharmony_ci	case GUEST_LDTR_BASE:
3238c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_ldtr_base;
3248c2ecf20Sopenharmony_ci		break;
3258c2ecf20Sopenharmony_ci	case GUEST_TR_BASE:
3268c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_tr_base;
3278c2ecf20Sopenharmony_ci		break;
3288c2ecf20Sopenharmony_ci	case GUEST_GDTR_BASE:
3298c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_gdtr_base;
3308c2ecf20Sopenharmony_ci		break;
3318c2ecf20Sopenharmony_ci	case GUEST_IDTR_BASE:
3328c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_idtr_base;
3338c2ecf20Sopenharmony_ci		break;
3348c2ecf20Sopenharmony_ci	case TSC_OFFSET:
3358c2ecf20Sopenharmony_ci		*value = current_evmcs->tsc_offset;
3368c2ecf20Sopenharmony_ci		break;
3378c2ecf20Sopenharmony_ci	case VIRTUAL_APIC_PAGE_ADDR:
3388c2ecf20Sopenharmony_ci		*value = current_evmcs->virtual_apic_page_addr;
3398c2ecf20Sopenharmony_ci		break;
3408c2ecf20Sopenharmony_ci	case VMCS_LINK_POINTER:
3418c2ecf20Sopenharmony_ci		*value = current_evmcs->vmcs_link_pointer;
3428c2ecf20Sopenharmony_ci		break;
3438c2ecf20Sopenharmony_ci	case GUEST_IA32_DEBUGCTL:
3448c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_ia32_debugctl;
3458c2ecf20Sopenharmony_ci		break;
3468c2ecf20Sopenharmony_ci	case GUEST_IA32_PAT:
3478c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_ia32_pat;
3488c2ecf20Sopenharmony_ci		break;
3498c2ecf20Sopenharmony_ci	case GUEST_IA32_EFER:
3508c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_ia32_efer;
3518c2ecf20Sopenharmony_ci		break;
3528c2ecf20Sopenharmony_ci	case GUEST_PDPTR0:
3538c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_pdptr0;
3548c2ecf20Sopenharmony_ci		break;
3558c2ecf20Sopenharmony_ci	case GUEST_PDPTR1:
3568c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_pdptr1;
3578c2ecf20Sopenharmony_ci		break;
3588c2ecf20Sopenharmony_ci	case GUEST_PDPTR2:
3598c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_pdptr2;
3608c2ecf20Sopenharmony_ci		break;
3618c2ecf20Sopenharmony_ci	case GUEST_PDPTR3:
3628c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_pdptr3;
3638c2ecf20Sopenharmony_ci		break;
3648c2ecf20Sopenharmony_ci	case GUEST_PENDING_DBG_EXCEPTIONS:
3658c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_pending_dbg_exceptions;
3668c2ecf20Sopenharmony_ci		break;
3678c2ecf20Sopenharmony_ci	case GUEST_SYSENTER_ESP:
3688c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_sysenter_esp;
3698c2ecf20Sopenharmony_ci		break;
3708c2ecf20Sopenharmony_ci	case GUEST_SYSENTER_EIP:
3718c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_sysenter_eip;
3728c2ecf20Sopenharmony_ci		break;
3738c2ecf20Sopenharmony_ci	case CR0_GUEST_HOST_MASK:
3748c2ecf20Sopenharmony_ci		*value = current_evmcs->cr0_guest_host_mask;
3758c2ecf20Sopenharmony_ci		break;
3768c2ecf20Sopenharmony_ci	case CR4_GUEST_HOST_MASK:
3778c2ecf20Sopenharmony_ci		*value = current_evmcs->cr4_guest_host_mask;
3788c2ecf20Sopenharmony_ci		break;
3798c2ecf20Sopenharmony_ci	case CR0_READ_SHADOW:
3808c2ecf20Sopenharmony_ci		*value = current_evmcs->cr0_read_shadow;
3818c2ecf20Sopenharmony_ci		break;
3828c2ecf20Sopenharmony_ci	case CR4_READ_SHADOW:
3838c2ecf20Sopenharmony_ci		*value = current_evmcs->cr4_read_shadow;
3848c2ecf20Sopenharmony_ci		break;
3858c2ecf20Sopenharmony_ci	case GUEST_CR0:
3868c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_cr0;
3878c2ecf20Sopenharmony_ci		break;
3888c2ecf20Sopenharmony_ci	case GUEST_CR3:
3898c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_cr3;
3908c2ecf20Sopenharmony_ci		break;
3918c2ecf20Sopenharmony_ci	case GUEST_CR4:
3928c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_cr4;
3938c2ecf20Sopenharmony_ci		break;
3948c2ecf20Sopenharmony_ci	case GUEST_DR7:
3958c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_dr7;
3968c2ecf20Sopenharmony_ci		break;
3978c2ecf20Sopenharmony_ci	case HOST_FS_BASE:
3988c2ecf20Sopenharmony_ci		*value = current_evmcs->host_fs_base;
3998c2ecf20Sopenharmony_ci		break;
4008c2ecf20Sopenharmony_ci	case HOST_GS_BASE:
4018c2ecf20Sopenharmony_ci		*value = current_evmcs->host_gs_base;
4028c2ecf20Sopenharmony_ci		break;
4038c2ecf20Sopenharmony_ci	case HOST_TR_BASE:
4048c2ecf20Sopenharmony_ci		*value = current_evmcs->host_tr_base;
4058c2ecf20Sopenharmony_ci		break;
4068c2ecf20Sopenharmony_ci	case HOST_GDTR_BASE:
4078c2ecf20Sopenharmony_ci		*value = current_evmcs->host_gdtr_base;
4088c2ecf20Sopenharmony_ci		break;
4098c2ecf20Sopenharmony_ci	case HOST_IDTR_BASE:
4108c2ecf20Sopenharmony_ci		*value = current_evmcs->host_idtr_base;
4118c2ecf20Sopenharmony_ci		break;
4128c2ecf20Sopenharmony_ci	case HOST_RSP:
4138c2ecf20Sopenharmony_ci		*value = current_evmcs->host_rsp;
4148c2ecf20Sopenharmony_ci		break;
4158c2ecf20Sopenharmony_ci	case EPT_POINTER:
4168c2ecf20Sopenharmony_ci		*value = current_evmcs->ept_pointer;
4178c2ecf20Sopenharmony_ci		break;
4188c2ecf20Sopenharmony_ci	case GUEST_BNDCFGS:
4198c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_bndcfgs;
4208c2ecf20Sopenharmony_ci		break;
4218c2ecf20Sopenharmony_ci	case XSS_EXIT_BITMAP:
4228c2ecf20Sopenharmony_ci		*value = current_evmcs->xss_exit_bitmap;
4238c2ecf20Sopenharmony_ci		break;
4248c2ecf20Sopenharmony_ci	case GUEST_PHYSICAL_ADDRESS:
4258c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_physical_address;
4268c2ecf20Sopenharmony_ci		break;
4278c2ecf20Sopenharmony_ci	case EXIT_QUALIFICATION:
4288c2ecf20Sopenharmony_ci		*value = current_evmcs->exit_qualification;
4298c2ecf20Sopenharmony_ci		break;
4308c2ecf20Sopenharmony_ci	case GUEST_LINEAR_ADDRESS:
4318c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_linear_address;
4328c2ecf20Sopenharmony_ci		break;
4338c2ecf20Sopenharmony_ci	case VM_EXIT_MSR_STORE_ADDR:
4348c2ecf20Sopenharmony_ci		*value = current_evmcs->vm_exit_msr_store_addr;
4358c2ecf20Sopenharmony_ci		break;
4368c2ecf20Sopenharmony_ci	case VM_EXIT_MSR_LOAD_ADDR:
4378c2ecf20Sopenharmony_ci		*value = current_evmcs->vm_exit_msr_load_addr;
4388c2ecf20Sopenharmony_ci		break;
4398c2ecf20Sopenharmony_ci	case VM_ENTRY_MSR_LOAD_ADDR:
4408c2ecf20Sopenharmony_ci		*value = current_evmcs->vm_entry_msr_load_addr;
4418c2ecf20Sopenharmony_ci		break;
4428c2ecf20Sopenharmony_ci	case CR3_TARGET_VALUE0:
4438c2ecf20Sopenharmony_ci		*value = current_evmcs->cr3_target_value0;
4448c2ecf20Sopenharmony_ci		break;
4458c2ecf20Sopenharmony_ci	case CR3_TARGET_VALUE1:
4468c2ecf20Sopenharmony_ci		*value = current_evmcs->cr3_target_value1;
4478c2ecf20Sopenharmony_ci		break;
4488c2ecf20Sopenharmony_ci	case CR3_TARGET_VALUE2:
4498c2ecf20Sopenharmony_ci		*value = current_evmcs->cr3_target_value2;
4508c2ecf20Sopenharmony_ci		break;
4518c2ecf20Sopenharmony_ci	case CR3_TARGET_VALUE3:
4528c2ecf20Sopenharmony_ci		*value = current_evmcs->cr3_target_value3;
4538c2ecf20Sopenharmony_ci		break;
4548c2ecf20Sopenharmony_ci	case TPR_THRESHOLD:
4558c2ecf20Sopenharmony_ci		*value = current_evmcs->tpr_threshold;
4568c2ecf20Sopenharmony_ci		break;
4578c2ecf20Sopenharmony_ci	case GUEST_INTERRUPTIBILITY_INFO:
4588c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_interruptibility_info;
4598c2ecf20Sopenharmony_ci		break;
4608c2ecf20Sopenharmony_ci	case CPU_BASED_VM_EXEC_CONTROL:
4618c2ecf20Sopenharmony_ci		*value = current_evmcs->cpu_based_vm_exec_control;
4628c2ecf20Sopenharmony_ci		break;
4638c2ecf20Sopenharmony_ci	case EXCEPTION_BITMAP:
4648c2ecf20Sopenharmony_ci		*value = current_evmcs->exception_bitmap;
4658c2ecf20Sopenharmony_ci		break;
4668c2ecf20Sopenharmony_ci	case VM_ENTRY_CONTROLS:
4678c2ecf20Sopenharmony_ci		*value = current_evmcs->vm_entry_controls;
4688c2ecf20Sopenharmony_ci		break;
4698c2ecf20Sopenharmony_ci	case VM_ENTRY_INTR_INFO_FIELD:
4708c2ecf20Sopenharmony_ci		*value = current_evmcs->vm_entry_intr_info_field;
4718c2ecf20Sopenharmony_ci		break;
4728c2ecf20Sopenharmony_ci	case VM_ENTRY_EXCEPTION_ERROR_CODE:
4738c2ecf20Sopenharmony_ci		*value = current_evmcs->vm_entry_exception_error_code;
4748c2ecf20Sopenharmony_ci		break;
4758c2ecf20Sopenharmony_ci	case VM_ENTRY_INSTRUCTION_LEN:
4768c2ecf20Sopenharmony_ci		*value = current_evmcs->vm_entry_instruction_len;
4778c2ecf20Sopenharmony_ci		break;
4788c2ecf20Sopenharmony_ci	case HOST_IA32_SYSENTER_CS:
4798c2ecf20Sopenharmony_ci		*value = current_evmcs->host_ia32_sysenter_cs;
4808c2ecf20Sopenharmony_ci		break;
4818c2ecf20Sopenharmony_ci	case PIN_BASED_VM_EXEC_CONTROL:
4828c2ecf20Sopenharmony_ci		*value = current_evmcs->pin_based_vm_exec_control;
4838c2ecf20Sopenharmony_ci		break;
4848c2ecf20Sopenharmony_ci	case VM_EXIT_CONTROLS:
4858c2ecf20Sopenharmony_ci		*value = current_evmcs->vm_exit_controls;
4868c2ecf20Sopenharmony_ci		break;
4878c2ecf20Sopenharmony_ci	case SECONDARY_VM_EXEC_CONTROL:
4888c2ecf20Sopenharmony_ci		*value = current_evmcs->secondary_vm_exec_control;
4898c2ecf20Sopenharmony_ci		break;
4908c2ecf20Sopenharmony_ci	case GUEST_ES_LIMIT:
4918c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_es_limit;
4928c2ecf20Sopenharmony_ci		break;
4938c2ecf20Sopenharmony_ci	case GUEST_CS_LIMIT:
4948c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_cs_limit;
4958c2ecf20Sopenharmony_ci		break;
4968c2ecf20Sopenharmony_ci	case GUEST_SS_LIMIT:
4978c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_ss_limit;
4988c2ecf20Sopenharmony_ci		break;
4998c2ecf20Sopenharmony_ci	case GUEST_DS_LIMIT:
5008c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_ds_limit;
5018c2ecf20Sopenharmony_ci		break;
5028c2ecf20Sopenharmony_ci	case GUEST_FS_LIMIT:
5038c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_fs_limit;
5048c2ecf20Sopenharmony_ci		break;
5058c2ecf20Sopenharmony_ci	case GUEST_GS_LIMIT:
5068c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_gs_limit;
5078c2ecf20Sopenharmony_ci		break;
5088c2ecf20Sopenharmony_ci	case GUEST_LDTR_LIMIT:
5098c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_ldtr_limit;
5108c2ecf20Sopenharmony_ci		break;
5118c2ecf20Sopenharmony_ci	case GUEST_TR_LIMIT:
5128c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_tr_limit;
5138c2ecf20Sopenharmony_ci		break;
5148c2ecf20Sopenharmony_ci	case GUEST_GDTR_LIMIT:
5158c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_gdtr_limit;
5168c2ecf20Sopenharmony_ci		break;
5178c2ecf20Sopenharmony_ci	case GUEST_IDTR_LIMIT:
5188c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_idtr_limit;
5198c2ecf20Sopenharmony_ci		break;
5208c2ecf20Sopenharmony_ci	case GUEST_ES_AR_BYTES:
5218c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_es_ar_bytes;
5228c2ecf20Sopenharmony_ci		break;
5238c2ecf20Sopenharmony_ci	case GUEST_CS_AR_BYTES:
5248c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_cs_ar_bytes;
5258c2ecf20Sopenharmony_ci		break;
5268c2ecf20Sopenharmony_ci	case GUEST_SS_AR_BYTES:
5278c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_ss_ar_bytes;
5288c2ecf20Sopenharmony_ci		break;
5298c2ecf20Sopenharmony_ci	case GUEST_DS_AR_BYTES:
5308c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_ds_ar_bytes;
5318c2ecf20Sopenharmony_ci		break;
5328c2ecf20Sopenharmony_ci	case GUEST_FS_AR_BYTES:
5338c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_fs_ar_bytes;
5348c2ecf20Sopenharmony_ci		break;
5358c2ecf20Sopenharmony_ci	case GUEST_GS_AR_BYTES:
5368c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_gs_ar_bytes;
5378c2ecf20Sopenharmony_ci		break;
5388c2ecf20Sopenharmony_ci	case GUEST_LDTR_AR_BYTES:
5398c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_ldtr_ar_bytes;
5408c2ecf20Sopenharmony_ci		break;
5418c2ecf20Sopenharmony_ci	case GUEST_TR_AR_BYTES:
5428c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_tr_ar_bytes;
5438c2ecf20Sopenharmony_ci		break;
5448c2ecf20Sopenharmony_ci	case GUEST_ACTIVITY_STATE:
5458c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_activity_state;
5468c2ecf20Sopenharmony_ci		break;
5478c2ecf20Sopenharmony_ci	case GUEST_SYSENTER_CS:
5488c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_sysenter_cs;
5498c2ecf20Sopenharmony_ci		break;
5508c2ecf20Sopenharmony_ci	case VM_INSTRUCTION_ERROR:
5518c2ecf20Sopenharmony_ci		*value = current_evmcs->vm_instruction_error;
5528c2ecf20Sopenharmony_ci		break;
5538c2ecf20Sopenharmony_ci	case VM_EXIT_REASON:
5548c2ecf20Sopenharmony_ci		*value = current_evmcs->vm_exit_reason;
5558c2ecf20Sopenharmony_ci		break;
5568c2ecf20Sopenharmony_ci	case VM_EXIT_INTR_INFO:
5578c2ecf20Sopenharmony_ci		*value = current_evmcs->vm_exit_intr_info;
5588c2ecf20Sopenharmony_ci		break;
5598c2ecf20Sopenharmony_ci	case VM_EXIT_INTR_ERROR_CODE:
5608c2ecf20Sopenharmony_ci		*value = current_evmcs->vm_exit_intr_error_code;
5618c2ecf20Sopenharmony_ci		break;
5628c2ecf20Sopenharmony_ci	case IDT_VECTORING_INFO_FIELD:
5638c2ecf20Sopenharmony_ci		*value = current_evmcs->idt_vectoring_info_field;
5648c2ecf20Sopenharmony_ci		break;
5658c2ecf20Sopenharmony_ci	case IDT_VECTORING_ERROR_CODE:
5668c2ecf20Sopenharmony_ci		*value = current_evmcs->idt_vectoring_error_code;
5678c2ecf20Sopenharmony_ci		break;
5688c2ecf20Sopenharmony_ci	case VM_EXIT_INSTRUCTION_LEN:
5698c2ecf20Sopenharmony_ci		*value = current_evmcs->vm_exit_instruction_len;
5708c2ecf20Sopenharmony_ci		break;
5718c2ecf20Sopenharmony_ci	case VMX_INSTRUCTION_INFO:
5728c2ecf20Sopenharmony_ci		*value = current_evmcs->vmx_instruction_info;
5738c2ecf20Sopenharmony_ci		break;
5748c2ecf20Sopenharmony_ci	case PAGE_FAULT_ERROR_CODE_MASK:
5758c2ecf20Sopenharmony_ci		*value = current_evmcs->page_fault_error_code_mask;
5768c2ecf20Sopenharmony_ci		break;
5778c2ecf20Sopenharmony_ci	case PAGE_FAULT_ERROR_CODE_MATCH:
5788c2ecf20Sopenharmony_ci		*value = current_evmcs->page_fault_error_code_match;
5798c2ecf20Sopenharmony_ci		break;
5808c2ecf20Sopenharmony_ci	case CR3_TARGET_COUNT:
5818c2ecf20Sopenharmony_ci		*value = current_evmcs->cr3_target_count;
5828c2ecf20Sopenharmony_ci		break;
5838c2ecf20Sopenharmony_ci	case VM_EXIT_MSR_STORE_COUNT:
5848c2ecf20Sopenharmony_ci		*value = current_evmcs->vm_exit_msr_store_count;
5858c2ecf20Sopenharmony_ci		break;
5868c2ecf20Sopenharmony_ci	case VM_EXIT_MSR_LOAD_COUNT:
5878c2ecf20Sopenharmony_ci		*value = current_evmcs->vm_exit_msr_load_count;
5888c2ecf20Sopenharmony_ci		break;
5898c2ecf20Sopenharmony_ci	case VM_ENTRY_MSR_LOAD_COUNT:
5908c2ecf20Sopenharmony_ci		*value = current_evmcs->vm_entry_msr_load_count;
5918c2ecf20Sopenharmony_ci		break;
5928c2ecf20Sopenharmony_ci	case HOST_ES_SELECTOR:
5938c2ecf20Sopenharmony_ci		*value = current_evmcs->host_es_selector;
5948c2ecf20Sopenharmony_ci		break;
5958c2ecf20Sopenharmony_ci	case HOST_CS_SELECTOR:
5968c2ecf20Sopenharmony_ci		*value = current_evmcs->host_cs_selector;
5978c2ecf20Sopenharmony_ci		break;
5988c2ecf20Sopenharmony_ci	case HOST_SS_SELECTOR:
5998c2ecf20Sopenharmony_ci		*value = current_evmcs->host_ss_selector;
6008c2ecf20Sopenharmony_ci		break;
6018c2ecf20Sopenharmony_ci	case HOST_DS_SELECTOR:
6028c2ecf20Sopenharmony_ci		*value = current_evmcs->host_ds_selector;
6038c2ecf20Sopenharmony_ci		break;
6048c2ecf20Sopenharmony_ci	case HOST_FS_SELECTOR:
6058c2ecf20Sopenharmony_ci		*value = current_evmcs->host_fs_selector;
6068c2ecf20Sopenharmony_ci		break;
6078c2ecf20Sopenharmony_ci	case HOST_GS_SELECTOR:
6088c2ecf20Sopenharmony_ci		*value = current_evmcs->host_gs_selector;
6098c2ecf20Sopenharmony_ci		break;
6108c2ecf20Sopenharmony_ci	case HOST_TR_SELECTOR:
6118c2ecf20Sopenharmony_ci		*value = current_evmcs->host_tr_selector;
6128c2ecf20Sopenharmony_ci		break;
6138c2ecf20Sopenharmony_ci	case GUEST_ES_SELECTOR:
6148c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_es_selector;
6158c2ecf20Sopenharmony_ci		break;
6168c2ecf20Sopenharmony_ci	case GUEST_CS_SELECTOR:
6178c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_cs_selector;
6188c2ecf20Sopenharmony_ci		break;
6198c2ecf20Sopenharmony_ci	case GUEST_SS_SELECTOR:
6208c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_ss_selector;
6218c2ecf20Sopenharmony_ci		break;
6228c2ecf20Sopenharmony_ci	case GUEST_DS_SELECTOR:
6238c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_ds_selector;
6248c2ecf20Sopenharmony_ci		break;
6258c2ecf20Sopenharmony_ci	case GUEST_FS_SELECTOR:
6268c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_fs_selector;
6278c2ecf20Sopenharmony_ci		break;
6288c2ecf20Sopenharmony_ci	case GUEST_GS_SELECTOR:
6298c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_gs_selector;
6308c2ecf20Sopenharmony_ci		break;
6318c2ecf20Sopenharmony_ci	case GUEST_LDTR_SELECTOR:
6328c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_ldtr_selector;
6338c2ecf20Sopenharmony_ci		break;
6348c2ecf20Sopenharmony_ci	case GUEST_TR_SELECTOR:
6358c2ecf20Sopenharmony_ci		*value = current_evmcs->guest_tr_selector;
6368c2ecf20Sopenharmony_ci		break;
6378c2ecf20Sopenharmony_ci	case VIRTUAL_PROCESSOR_ID:
6388c2ecf20Sopenharmony_ci		*value = current_evmcs->virtual_processor_id;
6398c2ecf20Sopenharmony_ci		break;
6408c2ecf20Sopenharmony_ci	default: return 1;
6418c2ecf20Sopenharmony_ci	}
6428c2ecf20Sopenharmony_ci
6438c2ecf20Sopenharmony_ci	return 0;
6448c2ecf20Sopenharmony_ci}
6458c2ecf20Sopenharmony_ci
6468c2ecf20Sopenharmony_cistatic inline int evmcs_vmwrite(uint64_t encoding, uint64_t value)
6478c2ecf20Sopenharmony_ci{
6488c2ecf20Sopenharmony_ci	switch (encoding) {
6498c2ecf20Sopenharmony_ci	case GUEST_RIP:
6508c2ecf20Sopenharmony_ci		current_evmcs->guest_rip = value;
6518c2ecf20Sopenharmony_ci		break;
6528c2ecf20Sopenharmony_ci	case GUEST_RSP:
6538c2ecf20Sopenharmony_ci		current_evmcs->guest_rsp = value;
6548c2ecf20Sopenharmony_ci		break;
6558c2ecf20Sopenharmony_ci	case GUEST_RFLAGS:
6568c2ecf20Sopenharmony_ci		current_evmcs->guest_rflags = value;
6578c2ecf20Sopenharmony_ci		break;
6588c2ecf20Sopenharmony_ci	case HOST_IA32_PAT:
6598c2ecf20Sopenharmony_ci		current_evmcs->host_ia32_pat = value;
6608c2ecf20Sopenharmony_ci		break;
6618c2ecf20Sopenharmony_ci	case HOST_IA32_EFER:
6628c2ecf20Sopenharmony_ci		current_evmcs->host_ia32_efer = value;
6638c2ecf20Sopenharmony_ci		break;
6648c2ecf20Sopenharmony_ci	case HOST_CR0:
6658c2ecf20Sopenharmony_ci		current_evmcs->host_cr0 = value;
6668c2ecf20Sopenharmony_ci		break;
6678c2ecf20Sopenharmony_ci	case HOST_CR3:
6688c2ecf20Sopenharmony_ci		current_evmcs->host_cr3 = value;
6698c2ecf20Sopenharmony_ci		break;
6708c2ecf20Sopenharmony_ci	case HOST_CR4:
6718c2ecf20Sopenharmony_ci		current_evmcs->host_cr4 = value;
6728c2ecf20Sopenharmony_ci		break;
6738c2ecf20Sopenharmony_ci	case HOST_IA32_SYSENTER_ESP:
6748c2ecf20Sopenharmony_ci		current_evmcs->host_ia32_sysenter_esp = value;
6758c2ecf20Sopenharmony_ci		break;
6768c2ecf20Sopenharmony_ci	case HOST_IA32_SYSENTER_EIP:
6778c2ecf20Sopenharmony_ci		current_evmcs->host_ia32_sysenter_eip = value;
6788c2ecf20Sopenharmony_ci		break;
6798c2ecf20Sopenharmony_ci	case HOST_RIP:
6808c2ecf20Sopenharmony_ci		current_evmcs->host_rip = value;
6818c2ecf20Sopenharmony_ci		break;
6828c2ecf20Sopenharmony_ci	case IO_BITMAP_A:
6838c2ecf20Sopenharmony_ci		current_evmcs->io_bitmap_a = value;
6848c2ecf20Sopenharmony_ci		break;
6858c2ecf20Sopenharmony_ci	case IO_BITMAP_B:
6868c2ecf20Sopenharmony_ci		current_evmcs->io_bitmap_b = value;
6878c2ecf20Sopenharmony_ci		break;
6888c2ecf20Sopenharmony_ci	case MSR_BITMAP:
6898c2ecf20Sopenharmony_ci		current_evmcs->msr_bitmap = value;
6908c2ecf20Sopenharmony_ci		break;
6918c2ecf20Sopenharmony_ci	case GUEST_ES_BASE:
6928c2ecf20Sopenharmony_ci		current_evmcs->guest_es_base = value;
6938c2ecf20Sopenharmony_ci		break;
6948c2ecf20Sopenharmony_ci	case GUEST_CS_BASE:
6958c2ecf20Sopenharmony_ci		current_evmcs->guest_cs_base = value;
6968c2ecf20Sopenharmony_ci		break;
6978c2ecf20Sopenharmony_ci	case GUEST_SS_BASE:
6988c2ecf20Sopenharmony_ci		current_evmcs->guest_ss_base = value;
6998c2ecf20Sopenharmony_ci		break;
7008c2ecf20Sopenharmony_ci	case GUEST_DS_BASE:
7018c2ecf20Sopenharmony_ci		current_evmcs->guest_ds_base = value;
7028c2ecf20Sopenharmony_ci		break;
7038c2ecf20Sopenharmony_ci	case GUEST_FS_BASE:
7048c2ecf20Sopenharmony_ci		current_evmcs->guest_fs_base = value;
7058c2ecf20Sopenharmony_ci		break;
7068c2ecf20Sopenharmony_ci	case GUEST_GS_BASE:
7078c2ecf20Sopenharmony_ci		current_evmcs->guest_gs_base = value;
7088c2ecf20Sopenharmony_ci		break;
7098c2ecf20Sopenharmony_ci	case GUEST_LDTR_BASE:
7108c2ecf20Sopenharmony_ci		current_evmcs->guest_ldtr_base = value;
7118c2ecf20Sopenharmony_ci		break;
7128c2ecf20Sopenharmony_ci	case GUEST_TR_BASE:
7138c2ecf20Sopenharmony_ci		current_evmcs->guest_tr_base = value;
7148c2ecf20Sopenharmony_ci		break;
7158c2ecf20Sopenharmony_ci	case GUEST_GDTR_BASE:
7168c2ecf20Sopenharmony_ci		current_evmcs->guest_gdtr_base = value;
7178c2ecf20Sopenharmony_ci		break;
7188c2ecf20Sopenharmony_ci	case GUEST_IDTR_BASE:
7198c2ecf20Sopenharmony_ci		current_evmcs->guest_idtr_base = value;
7208c2ecf20Sopenharmony_ci		break;
7218c2ecf20Sopenharmony_ci	case TSC_OFFSET:
7228c2ecf20Sopenharmony_ci		current_evmcs->tsc_offset = value;
7238c2ecf20Sopenharmony_ci		break;
7248c2ecf20Sopenharmony_ci	case VIRTUAL_APIC_PAGE_ADDR:
7258c2ecf20Sopenharmony_ci		current_evmcs->virtual_apic_page_addr = value;
7268c2ecf20Sopenharmony_ci		break;
7278c2ecf20Sopenharmony_ci	case VMCS_LINK_POINTER:
7288c2ecf20Sopenharmony_ci		current_evmcs->vmcs_link_pointer = value;
7298c2ecf20Sopenharmony_ci		break;
7308c2ecf20Sopenharmony_ci	case GUEST_IA32_DEBUGCTL:
7318c2ecf20Sopenharmony_ci		current_evmcs->guest_ia32_debugctl = value;
7328c2ecf20Sopenharmony_ci		break;
7338c2ecf20Sopenharmony_ci	case GUEST_IA32_PAT:
7348c2ecf20Sopenharmony_ci		current_evmcs->guest_ia32_pat = value;
7358c2ecf20Sopenharmony_ci		break;
7368c2ecf20Sopenharmony_ci	case GUEST_IA32_EFER:
7378c2ecf20Sopenharmony_ci		current_evmcs->guest_ia32_efer = value;
7388c2ecf20Sopenharmony_ci		break;
7398c2ecf20Sopenharmony_ci	case GUEST_PDPTR0:
7408c2ecf20Sopenharmony_ci		current_evmcs->guest_pdptr0 = value;
7418c2ecf20Sopenharmony_ci		break;
7428c2ecf20Sopenharmony_ci	case GUEST_PDPTR1:
7438c2ecf20Sopenharmony_ci		current_evmcs->guest_pdptr1 = value;
7448c2ecf20Sopenharmony_ci		break;
7458c2ecf20Sopenharmony_ci	case GUEST_PDPTR2:
7468c2ecf20Sopenharmony_ci		current_evmcs->guest_pdptr2 = value;
7478c2ecf20Sopenharmony_ci		break;
7488c2ecf20Sopenharmony_ci	case GUEST_PDPTR3:
7498c2ecf20Sopenharmony_ci		current_evmcs->guest_pdptr3 = value;
7508c2ecf20Sopenharmony_ci		break;
7518c2ecf20Sopenharmony_ci	case GUEST_PENDING_DBG_EXCEPTIONS:
7528c2ecf20Sopenharmony_ci		current_evmcs->guest_pending_dbg_exceptions = value;
7538c2ecf20Sopenharmony_ci		break;
7548c2ecf20Sopenharmony_ci	case GUEST_SYSENTER_ESP:
7558c2ecf20Sopenharmony_ci		current_evmcs->guest_sysenter_esp = value;
7568c2ecf20Sopenharmony_ci		break;
7578c2ecf20Sopenharmony_ci	case GUEST_SYSENTER_EIP:
7588c2ecf20Sopenharmony_ci		current_evmcs->guest_sysenter_eip = value;
7598c2ecf20Sopenharmony_ci		break;
7608c2ecf20Sopenharmony_ci	case CR0_GUEST_HOST_MASK:
7618c2ecf20Sopenharmony_ci		current_evmcs->cr0_guest_host_mask = value;
7628c2ecf20Sopenharmony_ci		break;
7638c2ecf20Sopenharmony_ci	case CR4_GUEST_HOST_MASK:
7648c2ecf20Sopenharmony_ci		current_evmcs->cr4_guest_host_mask = value;
7658c2ecf20Sopenharmony_ci		break;
7668c2ecf20Sopenharmony_ci	case CR0_READ_SHADOW:
7678c2ecf20Sopenharmony_ci		current_evmcs->cr0_read_shadow = value;
7688c2ecf20Sopenharmony_ci		break;
7698c2ecf20Sopenharmony_ci	case CR4_READ_SHADOW:
7708c2ecf20Sopenharmony_ci		current_evmcs->cr4_read_shadow = value;
7718c2ecf20Sopenharmony_ci		break;
7728c2ecf20Sopenharmony_ci	case GUEST_CR0:
7738c2ecf20Sopenharmony_ci		current_evmcs->guest_cr0 = value;
7748c2ecf20Sopenharmony_ci		break;
7758c2ecf20Sopenharmony_ci	case GUEST_CR3:
7768c2ecf20Sopenharmony_ci		current_evmcs->guest_cr3 = value;
7778c2ecf20Sopenharmony_ci		break;
7788c2ecf20Sopenharmony_ci	case GUEST_CR4:
7798c2ecf20Sopenharmony_ci		current_evmcs->guest_cr4 = value;
7808c2ecf20Sopenharmony_ci		break;
7818c2ecf20Sopenharmony_ci	case GUEST_DR7:
7828c2ecf20Sopenharmony_ci		current_evmcs->guest_dr7 = value;
7838c2ecf20Sopenharmony_ci		break;
7848c2ecf20Sopenharmony_ci	case HOST_FS_BASE:
7858c2ecf20Sopenharmony_ci		current_evmcs->host_fs_base = value;
7868c2ecf20Sopenharmony_ci		break;
7878c2ecf20Sopenharmony_ci	case HOST_GS_BASE:
7888c2ecf20Sopenharmony_ci		current_evmcs->host_gs_base = value;
7898c2ecf20Sopenharmony_ci		break;
7908c2ecf20Sopenharmony_ci	case HOST_TR_BASE:
7918c2ecf20Sopenharmony_ci		current_evmcs->host_tr_base = value;
7928c2ecf20Sopenharmony_ci		break;
7938c2ecf20Sopenharmony_ci	case HOST_GDTR_BASE:
7948c2ecf20Sopenharmony_ci		current_evmcs->host_gdtr_base = value;
7958c2ecf20Sopenharmony_ci		break;
7968c2ecf20Sopenharmony_ci	case HOST_IDTR_BASE:
7978c2ecf20Sopenharmony_ci		current_evmcs->host_idtr_base = value;
7988c2ecf20Sopenharmony_ci		break;
7998c2ecf20Sopenharmony_ci	case HOST_RSP:
8008c2ecf20Sopenharmony_ci		current_evmcs->host_rsp = value;
8018c2ecf20Sopenharmony_ci		break;
8028c2ecf20Sopenharmony_ci	case EPT_POINTER:
8038c2ecf20Sopenharmony_ci		current_evmcs->ept_pointer = value;
8048c2ecf20Sopenharmony_ci		break;
8058c2ecf20Sopenharmony_ci	case GUEST_BNDCFGS:
8068c2ecf20Sopenharmony_ci		current_evmcs->guest_bndcfgs = value;
8078c2ecf20Sopenharmony_ci		break;
8088c2ecf20Sopenharmony_ci	case XSS_EXIT_BITMAP:
8098c2ecf20Sopenharmony_ci		current_evmcs->xss_exit_bitmap = value;
8108c2ecf20Sopenharmony_ci		break;
8118c2ecf20Sopenharmony_ci	case GUEST_PHYSICAL_ADDRESS:
8128c2ecf20Sopenharmony_ci		current_evmcs->guest_physical_address = value;
8138c2ecf20Sopenharmony_ci		break;
8148c2ecf20Sopenharmony_ci	case EXIT_QUALIFICATION:
8158c2ecf20Sopenharmony_ci		current_evmcs->exit_qualification = value;
8168c2ecf20Sopenharmony_ci		break;
8178c2ecf20Sopenharmony_ci	case GUEST_LINEAR_ADDRESS:
8188c2ecf20Sopenharmony_ci		current_evmcs->guest_linear_address = value;
8198c2ecf20Sopenharmony_ci		break;
8208c2ecf20Sopenharmony_ci	case VM_EXIT_MSR_STORE_ADDR:
8218c2ecf20Sopenharmony_ci		current_evmcs->vm_exit_msr_store_addr = value;
8228c2ecf20Sopenharmony_ci		break;
8238c2ecf20Sopenharmony_ci	case VM_EXIT_MSR_LOAD_ADDR:
8248c2ecf20Sopenharmony_ci		current_evmcs->vm_exit_msr_load_addr = value;
8258c2ecf20Sopenharmony_ci		break;
8268c2ecf20Sopenharmony_ci	case VM_ENTRY_MSR_LOAD_ADDR:
8278c2ecf20Sopenharmony_ci		current_evmcs->vm_entry_msr_load_addr = value;
8288c2ecf20Sopenharmony_ci		break;
8298c2ecf20Sopenharmony_ci	case CR3_TARGET_VALUE0:
8308c2ecf20Sopenharmony_ci		current_evmcs->cr3_target_value0 = value;
8318c2ecf20Sopenharmony_ci		break;
8328c2ecf20Sopenharmony_ci	case CR3_TARGET_VALUE1:
8338c2ecf20Sopenharmony_ci		current_evmcs->cr3_target_value1 = value;
8348c2ecf20Sopenharmony_ci		break;
8358c2ecf20Sopenharmony_ci	case CR3_TARGET_VALUE2:
8368c2ecf20Sopenharmony_ci		current_evmcs->cr3_target_value2 = value;
8378c2ecf20Sopenharmony_ci		break;
8388c2ecf20Sopenharmony_ci	case CR3_TARGET_VALUE3:
8398c2ecf20Sopenharmony_ci		current_evmcs->cr3_target_value3 = value;
8408c2ecf20Sopenharmony_ci		break;
8418c2ecf20Sopenharmony_ci	case TPR_THRESHOLD:
8428c2ecf20Sopenharmony_ci		current_evmcs->tpr_threshold = value;
8438c2ecf20Sopenharmony_ci		break;
8448c2ecf20Sopenharmony_ci	case GUEST_INTERRUPTIBILITY_INFO:
8458c2ecf20Sopenharmony_ci		current_evmcs->guest_interruptibility_info = value;
8468c2ecf20Sopenharmony_ci		break;
8478c2ecf20Sopenharmony_ci	case CPU_BASED_VM_EXEC_CONTROL:
8488c2ecf20Sopenharmony_ci		current_evmcs->cpu_based_vm_exec_control = value;
8498c2ecf20Sopenharmony_ci		break;
8508c2ecf20Sopenharmony_ci	case EXCEPTION_BITMAP:
8518c2ecf20Sopenharmony_ci		current_evmcs->exception_bitmap = value;
8528c2ecf20Sopenharmony_ci		break;
8538c2ecf20Sopenharmony_ci	case VM_ENTRY_CONTROLS:
8548c2ecf20Sopenharmony_ci		current_evmcs->vm_entry_controls = value;
8558c2ecf20Sopenharmony_ci		break;
8568c2ecf20Sopenharmony_ci	case VM_ENTRY_INTR_INFO_FIELD:
8578c2ecf20Sopenharmony_ci		current_evmcs->vm_entry_intr_info_field = value;
8588c2ecf20Sopenharmony_ci		break;
8598c2ecf20Sopenharmony_ci	case VM_ENTRY_EXCEPTION_ERROR_CODE:
8608c2ecf20Sopenharmony_ci		current_evmcs->vm_entry_exception_error_code = value;
8618c2ecf20Sopenharmony_ci		break;
8628c2ecf20Sopenharmony_ci	case VM_ENTRY_INSTRUCTION_LEN:
8638c2ecf20Sopenharmony_ci		current_evmcs->vm_entry_instruction_len = value;
8648c2ecf20Sopenharmony_ci		break;
8658c2ecf20Sopenharmony_ci	case HOST_IA32_SYSENTER_CS:
8668c2ecf20Sopenharmony_ci		current_evmcs->host_ia32_sysenter_cs = value;
8678c2ecf20Sopenharmony_ci		break;
8688c2ecf20Sopenharmony_ci	case PIN_BASED_VM_EXEC_CONTROL:
8698c2ecf20Sopenharmony_ci		current_evmcs->pin_based_vm_exec_control = value;
8708c2ecf20Sopenharmony_ci		break;
8718c2ecf20Sopenharmony_ci	case VM_EXIT_CONTROLS:
8728c2ecf20Sopenharmony_ci		current_evmcs->vm_exit_controls = value;
8738c2ecf20Sopenharmony_ci		break;
8748c2ecf20Sopenharmony_ci	case SECONDARY_VM_EXEC_CONTROL:
8758c2ecf20Sopenharmony_ci		current_evmcs->secondary_vm_exec_control = value;
8768c2ecf20Sopenharmony_ci		break;
8778c2ecf20Sopenharmony_ci	case GUEST_ES_LIMIT:
8788c2ecf20Sopenharmony_ci		current_evmcs->guest_es_limit = value;
8798c2ecf20Sopenharmony_ci		break;
8808c2ecf20Sopenharmony_ci	case GUEST_CS_LIMIT:
8818c2ecf20Sopenharmony_ci		current_evmcs->guest_cs_limit = value;
8828c2ecf20Sopenharmony_ci		break;
8838c2ecf20Sopenharmony_ci	case GUEST_SS_LIMIT:
8848c2ecf20Sopenharmony_ci		current_evmcs->guest_ss_limit = value;
8858c2ecf20Sopenharmony_ci		break;
8868c2ecf20Sopenharmony_ci	case GUEST_DS_LIMIT:
8878c2ecf20Sopenharmony_ci		current_evmcs->guest_ds_limit = value;
8888c2ecf20Sopenharmony_ci		break;
8898c2ecf20Sopenharmony_ci	case GUEST_FS_LIMIT:
8908c2ecf20Sopenharmony_ci		current_evmcs->guest_fs_limit = value;
8918c2ecf20Sopenharmony_ci		break;
8928c2ecf20Sopenharmony_ci	case GUEST_GS_LIMIT:
8938c2ecf20Sopenharmony_ci		current_evmcs->guest_gs_limit = value;
8948c2ecf20Sopenharmony_ci		break;
8958c2ecf20Sopenharmony_ci	case GUEST_LDTR_LIMIT:
8968c2ecf20Sopenharmony_ci		current_evmcs->guest_ldtr_limit = value;
8978c2ecf20Sopenharmony_ci		break;
8988c2ecf20Sopenharmony_ci	case GUEST_TR_LIMIT:
8998c2ecf20Sopenharmony_ci		current_evmcs->guest_tr_limit = value;
9008c2ecf20Sopenharmony_ci		break;
9018c2ecf20Sopenharmony_ci	case GUEST_GDTR_LIMIT:
9028c2ecf20Sopenharmony_ci		current_evmcs->guest_gdtr_limit = value;
9038c2ecf20Sopenharmony_ci		break;
9048c2ecf20Sopenharmony_ci	case GUEST_IDTR_LIMIT:
9058c2ecf20Sopenharmony_ci		current_evmcs->guest_idtr_limit = value;
9068c2ecf20Sopenharmony_ci		break;
9078c2ecf20Sopenharmony_ci	case GUEST_ES_AR_BYTES:
9088c2ecf20Sopenharmony_ci		current_evmcs->guest_es_ar_bytes = value;
9098c2ecf20Sopenharmony_ci		break;
9108c2ecf20Sopenharmony_ci	case GUEST_CS_AR_BYTES:
9118c2ecf20Sopenharmony_ci		current_evmcs->guest_cs_ar_bytes = value;
9128c2ecf20Sopenharmony_ci		break;
9138c2ecf20Sopenharmony_ci	case GUEST_SS_AR_BYTES:
9148c2ecf20Sopenharmony_ci		current_evmcs->guest_ss_ar_bytes = value;
9158c2ecf20Sopenharmony_ci		break;
9168c2ecf20Sopenharmony_ci	case GUEST_DS_AR_BYTES:
9178c2ecf20Sopenharmony_ci		current_evmcs->guest_ds_ar_bytes = value;
9188c2ecf20Sopenharmony_ci		break;
9198c2ecf20Sopenharmony_ci	case GUEST_FS_AR_BYTES:
9208c2ecf20Sopenharmony_ci		current_evmcs->guest_fs_ar_bytes = value;
9218c2ecf20Sopenharmony_ci		break;
9228c2ecf20Sopenharmony_ci	case GUEST_GS_AR_BYTES:
9238c2ecf20Sopenharmony_ci		current_evmcs->guest_gs_ar_bytes = value;
9248c2ecf20Sopenharmony_ci		break;
9258c2ecf20Sopenharmony_ci	case GUEST_LDTR_AR_BYTES:
9268c2ecf20Sopenharmony_ci		current_evmcs->guest_ldtr_ar_bytes = value;
9278c2ecf20Sopenharmony_ci		break;
9288c2ecf20Sopenharmony_ci	case GUEST_TR_AR_BYTES:
9298c2ecf20Sopenharmony_ci		current_evmcs->guest_tr_ar_bytes = value;
9308c2ecf20Sopenharmony_ci		break;
9318c2ecf20Sopenharmony_ci	case GUEST_ACTIVITY_STATE:
9328c2ecf20Sopenharmony_ci		current_evmcs->guest_activity_state = value;
9338c2ecf20Sopenharmony_ci		break;
9348c2ecf20Sopenharmony_ci	case GUEST_SYSENTER_CS:
9358c2ecf20Sopenharmony_ci		current_evmcs->guest_sysenter_cs = value;
9368c2ecf20Sopenharmony_ci		break;
9378c2ecf20Sopenharmony_ci	case VM_INSTRUCTION_ERROR:
9388c2ecf20Sopenharmony_ci		current_evmcs->vm_instruction_error = value;
9398c2ecf20Sopenharmony_ci		break;
9408c2ecf20Sopenharmony_ci	case VM_EXIT_REASON:
9418c2ecf20Sopenharmony_ci		current_evmcs->vm_exit_reason = value;
9428c2ecf20Sopenharmony_ci		break;
9438c2ecf20Sopenharmony_ci	case VM_EXIT_INTR_INFO:
9448c2ecf20Sopenharmony_ci		current_evmcs->vm_exit_intr_info = value;
9458c2ecf20Sopenharmony_ci		break;
9468c2ecf20Sopenharmony_ci	case VM_EXIT_INTR_ERROR_CODE:
9478c2ecf20Sopenharmony_ci		current_evmcs->vm_exit_intr_error_code = value;
9488c2ecf20Sopenharmony_ci		break;
9498c2ecf20Sopenharmony_ci	case IDT_VECTORING_INFO_FIELD:
9508c2ecf20Sopenharmony_ci		current_evmcs->idt_vectoring_info_field = value;
9518c2ecf20Sopenharmony_ci		break;
9528c2ecf20Sopenharmony_ci	case IDT_VECTORING_ERROR_CODE:
9538c2ecf20Sopenharmony_ci		current_evmcs->idt_vectoring_error_code = value;
9548c2ecf20Sopenharmony_ci		break;
9558c2ecf20Sopenharmony_ci	case VM_EXIT_INSTRUCTION_LEN:
9568c2ecf20Sopenharmony_ci		current_evmcs->vm_exit_instruction_len = value;
9578c2ecf20Sopenharmony_ci		break;
9588c2ecf20Sopenharmony_ci	case VMX_INSTRUCTION_INFO:
9598c2ecf20Sopenharmony_ci		current_evmcs->vmx_instruction_info = value;
9608c2ecf20Sopenharmony_ci		break;
9618c2ecf20Sopenharmony_ci	case PAGE_FAULT_ERROR_CODE_MASK:
9628c2ecf20Sopenharmony_ci		current_evmcs->page_fault_error_code_mask = value;
9638c2ecf20Sopenharmony_ci		break;
9648c2ecf20Sopenharmony_ci	case PAGE_FAULT_ERROR_CODE_MATCH:
9658c2ecf20Sopenharmony_ci		current_evmcs->page_fault_error_code_match = value;
9668c2ecf20Sopenharmony_ci		break;
9678c2ecf20Sopenharmony_ci	case CR3_TARGET_COUNT:
9688c2ecf20Sopenharmony_ci		current_evmcs->cr3_target_count = value;
9698c2ecf20Sopenharmony_ci		break;
9708c2ecf20Sopenharmony_ci	case VM_EXIT_MSR_STORE_COUNT:
9718c2ecf20Sopenharmony_ci		current_evmcs->vm_exit_msr_store_count = value;
9728c2ecf20Sopenharmony_ci		break;
9738c2ecf20Sopenharmony_ci	case VM_EXIT_MSR_LOAD_COUNT:
9748c2ecf20Sopenharmony_ci		current_evmcs->vm_exit_msr_load_count = value;
9758c2ecf20Sopenharmony_ci		break;
9768c2ecf20Sopenharmony_ci	case VM_ENTRY_MSR_LOAD_COUNT:
9778c2ecf20Sopenharmony_ci		current_evmcs->vm_entry_msr_load_count = value;
9788c2ecf20Sopenharmony_ci		break;
9798c2ecf20Sopenharmony_ci	case HOST_ES_SELECTOR:
9808c2ecf20Sopenharmony_ci		current_evmcs->host_es_selector = value;
9818c2ecf20Sopenharmony_ci		break;
9828c2ecf20Sopenharmony_ci	case HOST_CS_SELECTOR:
9838c2ecf20Sopenharmony_ci		current_evmcs->host_cs_selector = value;
9848c2ecf20Sopenharmony_ci		break;
9858c2ecf20Sopenharmony_ci	case HOST_SS_SELECTOR:
9868c2ecf20Sopenharmony_ci		current_evmcs->host_ss_selector = value;
9878c2ecf20Sopenharmony_ci		break;
9888c2ecf20Sopenharmony_ci	case HOST_DS_SELECTOR:
9898c2ecf20Sopenharmony_ci		current_evmcs->host_ds_selector = value;
9908c2ecf20Sopenharmony_ci		break;
9918c2ecf20Sopenharmony_ci	case HOST_FS_SELECTOR:
9928c2ecf20Sopenharmony_ci		current_evmcs->host_fs_selector = value;
9938c2ecf20Sopenharmony_ci		break;
9948c2ecf20Sopenharmony_ci	case HOST_GS_SELECTOR:
9958c2ecf20Sopenharmony_ci		current_evmcs->host_gs_selector = value;
9968c2ecf20Sopenharmony_ci		break;
9978c2ecf20Sopenharmony_ci	case HOST_TR_SELECTOR:
9988c2ecf20Sopenharmony_ci		current_evmcs->host_tr_selector = value;
9998c2ecf20Sopenharmony_ci		break;
10008c2ecf20Sopenharmony_ci	case GUEST_ES_SELECTOR:
10018c2ecf20Sopenharmony_ci		current_evmcs->guest_es_selector = value;
10028c2ecf20Sopenharmony_ci		break;
10038c2ecf20Sopenharmony_ci	case GUEST_CS_SELECTOR:
10048c2ecf20Sopenharmony_ci		current_evmcs->guest_cs_selector = value;
10058c2ecf20Sopenharmony_ci		break;
10068c2ecf20Sopenharmony_ci	case GUEST_SS_SELECTOR:
10078c2ecf20Sopenharmony_ci		current_evmcs->guest_ss_selector = value;
10088c2ecf20Sopenharmony_ci		break;
10098c2ecf20Sopenharmony_ci	case GUEST_DS_SELECTOR:
10108c2ecf20Sopenharmony_ci		current_evmcs->guest_ds_selector = value;
10118c2ecf20Sopenharmony_ci		break;
10128c2ecf20Sopenharmony_ci	case GUEST_FS_SELECTOR:
10138c2ecf20Sopenharmony_ci		current_evmcs->guest_fs_selector = value;
10148c2ecf20Sopenharmony_ci		break;
10158c2ecf20Sopenharmony_ci	case GUEST_GS_SELECTOR:
10168c2ecf20Sopenharmony_ci		current_evmcs->guest_gs_selector = value;
10178c2ecf20Sopenharmony_ci		break;
10188c2ecf20Sopenharmony_ci	case GUEST_LDTR_SELECTOR:
10198c2ecf20Sopenharmony_ci		current_evmcs->guest_ldtr_selector = value;
10208c2ecf20Sopenharmony_ci		break;
10218c2ecf20Sopenharmony_ci	case GUEST_TR_SELECTOR:
10228c2ecf20Sopenharmony_ci		current_evmcs->guest_tr_selector = value;
10238c2ecf20Sopenharmony_ci		break;
10248c2ecf20Sopenharmony_ci	case VIRTUAL_PROCESSOR_ID:
10258c2ecf20Sopenharmony_ci		current_evmcs->virtual_processor_id = value;
10268c2ecf20Sopenharmony_ci		break;
10278c2ecf20Sopenharmony_ci	default: return 1;
10288c2ecf20Sopenharmony_ci	}
10298c2ecf20Sopenharmony_ci
10308c2ecf20Sopenharmony_ci	return 0;
10318c2ecf20Sopenharmony_ci}
10328c2ecf20Sopenharmony_ci
10338c2ecf20Sopenharmony_cistatic inline int evmcs_vmlaunch(void)
10348c2ecf20Sopenharmony_ci{
10358c2ecf20Sopenharmony_ci	int ret;
10368c2ecf20Sopenharmony_ci
10378c2ecf20Sopenharmony_ci	current_evmcs->hv_clean_fields = 0;
10388c2ecf20Sopenharmony_ci
10398c2ecf20Sopenharmony_ci	__asm__ __volatile__("push %%rbp;"
10408c2ecf20Sopenharmony_ci			     "push %%rcx;"
10418c2ecf20Sopenharmony_ci			     "push %%rdx;"
10428c2ecf20Sopenharmony_ci			     "push %%rsi;"
10438c2ecf20Sopenharmony_ci			     "push %%rdi;"
10448c2ecf20Sopenharmony_ci			     "push $0;"
10458c2ecf20Sopenharmony_ci			     "mov %%rsp, (%[host_rsp]);"
10468c2ecf20Sopenharmony_ci			     "lea 1f(%%rip), %%rax;"
10478c2ecf20Sopenharmony_ci			     "mov %%rax, (%[host_rip]);"
10488c2ecf20Sopenharmony_ci			     "vmlaunch;"
10498c2ecf20Sopenharmony_ci			     "incq (%%rsp);"
10508c2ecf20Sopenharmony_ci			     "1: pop %%rax;"
10518c2ecf20Sopenharmony_ci			     "pop %%rdi;"
10528c2ecf20Sopenharmony_ci			     "pop %%rsi;"
10538c2ecf20Sopenharmony_ci			     "pop %%rdx;"
10548c2ecf20Sopenharmony_ci			     "pop %%rcx;"
10558c2ecf20Sopenharmony_ci			     "pop %%rbp;"
10568c2ecf20Sopenharmony_ci			     : [ret]"=&a"(ret)
10578c2ecf20Sopenharmony_ci			     : [host_rsp]"r"
10588c2ecf20Sopenharmony_ci			       ((uint64_t)&current_evmcs->host_rsp),
10598c2ecf20Sopenharmony_ci			       [host_rip]"r"
10608c2ecf20Sopenharmony_ci			       ((uint64_t)&current_evmcs->host_rip)
10618c2ecf20Sopenharmony_ci			     : "memory", "cc", "rbx", "r8", "r9", "r10",
10628c2ecf20Sopenharmony_ci			       "r11", "r12", "r13", "r14", "r15");
10638c2ecf20Sopenharmony_ci	return ret;
10648c2ecf20Sopenharmony_ci}
10658c2ecf20Sopenharmony_ci
10668c2ecf20Sopenharmony_ci/*
10678c2ecf20Sopenharmony_ci * No guest state (e.g. GPRs) is established by this vmresume.
10688c2ecf20Sopenharmony_ci */
10698c2ecf20Sopenharmony_cistatic inline int evmcs_vmresume(void)
10708c2ecf20Sopenharmony_ci{
10718c2ecf20Sopenharmony_ci	int ret;
10728c2ecf20Sopenharmony_ci
10738c2ecf20Sopenharmony_ci	current_evmcs->hv_clean_fields = 0;
10748c2ecf20Sopenharmony_ci
10758c2ecf20Sopenharmony_ci	__asm__ __volatile__("push %%rbp;"
10768c2ecf20Sopenharmony_ci			     "push %%rcx;"
10778c2ecf20Sopenharmony_ci			     "push %%rdx;"
10788c2ecf20Sopenharmony_ci			     "push %%rsi;"
10798c2ecf20Sopenharmony_ci			     "push %%rdi;"
10808c2ecf20Sopenharmony_ci			     "push $0;"
10818c2ecf20Sopenharmony_ci			     "mov %%rsp, (%[host_rsp]);"
10828c2ecf20Sopenharmony_ci			     "lea 1f(%%rip), %%rax;"
10838c2ecf20Sopenharmony_ci			     "mov %%rax, (%[host_rip]);"
10848c2ecf20Sopenharmony_ci			     "vmresume;"
10858c2ecf20Sopenharmony_ci			     "incq (%%rsp);"
10868c2ecf20Sopenharmony_ci			     "1: pop %%rax;"
10878c2ecf20Sopenharmony_ci			     "pop %%rdi;"
10888c2ecf20Sopenharmony_ci			     "pop %%rsi;"
10898c2ecf20Sopenharmony_ci			     "pop %%rdx;"
10908c2ecf20Sopenharmony_ci			     "pop %%rcx;"
10918c2ecf20Sopenharmony_ci			     "pop %%rbp;"
10928c2ecf20Sopenharmony_ci			     : [ret]"=&a"(ret)
10938c2ecf20Sopenharmony_ci			     : [host_rsp]"r"
10948c2ecf20Sopenharmony_ci			       ((uint64_t)&current_evmcs->host_rsp),
10958c2ecf20Sopenharmony_ci			       [host_rip]"r"
10968c2ecf20Sopenharmony_ci			       ((uint64_t)&current_evmcs->host_rip)
10978c2ecf20Sopenharmony_ci			     : "memory", "cc", "rbx", "r8", "r9", "r10",
10988c2ecf20Sopenharmony_ci			       "r11", "r12", "r13", "r14", "r15");
10998c2ecf20Sopenharmony_ci	return ret;
11008c2ecf20Sopenharmony_ci}
11018c2ecf20Sopenharmony_ci
11028c2ecf20Sopenharmony_ci#endif /* !SELFTEST_KVM_EVMCS_H */
1103