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