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