~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/tools/testing/selftests/kvm/include/x86_64/evmcs.h

Version: ~ [ linux-6.11-rc3 ] ~ [ linux-6.10.4 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.45 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.104 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.164 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.223 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.281 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.319 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

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

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php