1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
pub mod control {
use bitflags::bitflags;
pub const VPID: u32 = 0x0;
pub const POSTED_INTERRUPT_NOTIFICATION_VECTOR: u32 = 0x2;
pub const EPTP_INDEX: u32 = 0x4;
pub const IO_BITMAP_A_ADDR_FULL: u32 = 0x2000;
pub const IO_BITMAP_A_ADDR_HIGH: u32 = 0x2001;
pub const IO_BITMAP_B_ADDR_FULL: u32 = 0x2002;
pub const IO_BITMAP_B_ADDR_HIGH: u32 = 0x2003;
pub const MSR_BITMAPS_ADDR_FULL: u32 = 0x2004;
pub const MSR_BITMAPS_ADDR_HIGH: u32 = 0x2005;
pub const VMEXIT_MSR_STORE_ADDR_FULL: u32 = 0x2006;
pub const VMEXIT_MSR_STORE_ADDR_HIGH: u32 = 0x2007;
pub const VMEXIT_MSR_LOAD_ADDR_FULL: u32 = 0x2008;
pub const VMEXIT_MSR_LOAD_ADDR_HIGH: u32 = 0x2009;
pub const VMENTRY_MSR_LOAD_ADDR_FULL: u32 = 0x200A;
pub const VMENTRY_MSR_LOAD_ADDR_HIGH: u32 = 0x200B;
pub const EXECUTIVE_VMCS_PTR_FULL: u32 = 0x200C;
pub const EXECUTIVE_VMCS_PTR_HIGH: u32 = 0x200D;
pub const PML_ADDR_FULL: u32 = 0x200E;
pub const PML_ADDR_HIGH: u32 = 0x200F;
pub const TSC_OFFSET_FULL: u32 = 0x2010;
pub const TSC_OFFSET_HIGH: u32 = 0x2011;
pub const VIRT_APIC_ADDR_FULL: u32 = 0x2012;
pub const VIRT_APIC_ADDR_HIGH: u32 = 0x2013;
pub const APIC_ACCESS_ADDR_FULL: u32 = 0x2014;
pub const APIC_ACCESS_ADDR_HIGH: u32 = 0x2015;
pub const POSTED_INTERRUPT_DESC_ADDR_FULL: u32 = 0x2016;
pub const POSTED_INTERRUPT_DESC_ADDR_HIGH: u32 = 0x2017;
pub const VM_FUNCTION_CONTROLS_FULL: u32 = 0x2018;
pub const VM_FUNCTION_CONTROLS_HIGH: u32 = 0x2019;
pub const EPTP_FULL: u32 = 0x201A;
pub const EPTP_HIGH: u32 = 0x201B;
pub const EOI_EXIT0_FULL: u32 = 0x201C;
pub const EOI_EXIT0_HIGH: u32 = 0x201D;
pub const EOI_EXIT1_FULL: u32 = 0x201E;
pub const EOI_EXIT1_HIGH: u32 = 0x201F;
pub const EOI_EXIT2_FULL: u32 = 0x2020;
pub const EOI_EXIT2_HIGH: u32 = 0x2021;
pub const EOI_EXIT3_FULL: u32 = 0x2022;
pub const EOI_EXIT3_HIGH: u32 = 0x2023;
pub const EPTP_LIST_ADDR_FULL: u32 = 0x2024;
pub const EPTP_LIST_ADDR_HIGH: u32 = 0x2025;
pub const VMREAD_BITMAP_ADDR_FULL: u32 = 0x2026;
pub const VMREAD_BITMAP_ADDR_HIGH: u32 = 0x2027;
pub const VMWRITE_BITMAP_ADDR_FULL: u32 = 0x2028;
pub const VMWRITE_BITMAP_ADDR_HIGH: u32 = 0x2029;
pub const VIRT_EXCEPTION_INFO_ADDR_FULL: u32 = 0x202A;
pub const VIRT_EXCEPTION_INFO_ADDR_HIGH: u32 = 0x202B;
pub const XSS_EXITING_BITMAP_FULL: u32 = 0x202C;
pub const XSS_EXITING_BITMAP_HIGH: u32 = 0x202D;
pub const ENCLS_EXITING_BITMAP_FULL: u32 = 0x202E;
pub const ENCLS_EXITING_BITMAP_HIGH: u32 = 0x202F;
pub const SUBPAGE_PERM_TABLE_PTR_FULL: u32 = 0x2030;
pub const SUBPAGE_PERM_TABLE_PTR_HIGH: u32 = 0x2031;
pub const TSC_MULTIPLIER_FULL: u32 = 0x2032;
pub const TSC_MULTIPLIER_HIGH: u32 = 0x2033;
pub const PINBASED_EXEC_CONTROLS: u32 = 0x4000;
pub const PRIMARY_PROCBASED_EXEC_CONTROLS: u32 = 0x4002;
pub const EXCEPTION_BITMAP: u32 = 0x4004;
pub const PAGE_FAULT_ERR_CODE_MASK: u32 = 0x4006;
pub const PAGE_FAULT_ERR_CODE_MATCH: u32 = 0x4008;
pub const CR3_TARGET_COUNT: u32 = 0x400A;
pub const VMEXIT_CONTROLS: u32 = 0x400C;
pub const VMEXIT_MSR_STORE_COUNT: u32 = 0x400E;
pub const VMEXIT_MSR_LOAD_COUNT: u32 = 0x4010;
pub const VMENTRY_CONTROLS: u32 = 0x4012;
pub const VMENTRY_MSR_LOAD_COUNT: u32 = 0x4014;
pub const VMENTRY_INTERRUPTION_INFO_FIELD: u32 = 0x4016;
pub const VMENTRY_EXCEPTION_ERR_CODE: u32 = 0x4018;
pub const VMENTRY_INSTRUCTION_LEN: u32 = 0x401A;
pub const TPR_THRESHOLD: u32 = 0x401C;
pub const SECONDARY_PROCBASED_EXEC_CONTROLS: u32 = 0x401E;
pub const PLE_GAP: u32 = 0x4020;
pub const PLE_WINDOW: u32 = 0x4022;
pub const CR0_GUEST_HOST_MASK: u32 = 0x6000;
pub const CR4_GUEST_HOST_MASK: u32 = 0x6002;
pub const CR0_READ_SHADOW: u32 = 0x6004;
pub const CR4_READ_SHADOW: u32 = 0x6006;
pub const CR3_TARGET_VALUE0: u32 = 0x6008;
pub const CR3_TARGET_VALUE1: u32 = 0x600A;
pub const CR3_TARGET_VALUE2: u32 = 0x600C;
pub const CR3_TARGET_VALUE3: u32 = 0x600E;
bitflags! {
pub struct PinbasedControls: u32 {
const EXTERNAL_INTERRUPT_EXITING = 1 << 0;
const NMI_EXITING = 1 << 3;
const VIRTUAL_NMIS = 1 << 5;
const VMX_PREEMPTION_TIMER = 1 << 6;
const POSTED_INTERRUPTS = 1 << 7;
}
}
bitflags! {
pub struct PrimaryControls: u32 {
const INTERRUPT_WINDOW_EXITING = 1 << 2;
const USE_TSC_OFFSETTING = 1 << 3;
const HLT_EXITING = 1 << 7;
const INVLPG_EXITING = 1 << 9;
const MWAIT_EXITING = 1 << 10;
const RDPMC_EXITING = 1 << 11;
const RDTSC_EXITING = 1 << 12;
const CR3_LOAD_EXITING = 1 << 15;
const CR3_STORE_EXITING = 1 << 16;
const CR8_LOAD_EXITING = 1 << 19;
const CR8_STORE_EXITING = 1 << 20;
const USE_TPR_SHADOW = 1 << 21;
const NMI_WINDOW_EXITING = 1 << 22;
const MOV_DR_EXITING = 1 << 23;
const UNCOND_IO_EXITING = 1 << 24;
const USE_IO_BITMAPS = 1 << 25;
const MONITOR_TRAP_FLAG = 1 << 27;
const USE_MSR_BITMAPS = 1 << 28;
const MONITOR_EXITING = 1 << 29;
const PAUSE_EXITING = 1 << 30;
const SECONDARY_CONTROLS = 1 << 31;
}
}
bitflags! {
pub struct SecondaryControls: u32 {
const VIRTUALIZE_APIC = 1 << 0;
const ENABLE_EPT = 1 << 1;
const DTABLE_EXITING = 1 << 2;
const ENABLE_RDTSCP = 1 << 3;
const VIRTUALIZE_X2APIC = 1 << 4;
const ENABLE_VPID = 1 << 5;
const WBINVD_EXITING = 1 << 6;
const UNRESTRICTED_GUEST = 1 << 7;
const VIRTUALIZE_APIC_REGISTER = 1 << 8;
const VIRTUAL_INTERRUPT_DELIVERY = 1 << 9;
const PAUSE_LOOP_EXITING = 1 << 10;
const RDRAND_EXITING = 1 << 11;
const ENABLE_INVPCID = 1 << 12;
const ENABLE_VM_FUNCTIONS = 1 << 13;
const VMCS_SHADOWING = 1 << 14;
const ENCLS_EXITING = 1 << 15;
const RDSEED_EXITING = 1 << 16;
const ENABLE_PML = 1 << 17;
const EPT_VIOLATION_VE = 1 << 18;
const CONCEAL_VMX_FROM_PT = 1 << 19;
const ENABLE_XSAVES_XRSTORS = 1 << 20;
const MODE_BASED_EPT = 1 << 22;
const SUB_PAGE_EPT = 1 << 23;
const INTEL_PT_GUEST_PHYSICAL = 1 << 24;
const USE_TSC_SCALING = 1 << 25;
const ENABLE_USER_WAIT_PAUSE = 1 << 26;
const ENCLV_EXITING = 1 << 28;
}
}
bitflags! {
pub struct EntryControls: u32 {
const LOAD_DEBUG_CONTROLS = 1 << 2;
const IA32E_MODE_GUEST = 1 << 9;
const ENTRY_TO_SMM = 1 << 10;
const DEACTIVATE_DUAL_MONITOR = 1 << 11;
const LOAD_IA32_PERF_GLOBAL_CTRL = 1 << 13;
const LOAD_IA32_PAT = 1 << 14;
const LOAD_IA32_EFER = 1 << 15;
const LOAD_IA32_BNDCFGS = 1 << 16;
const CONCEAL_VMX_FROM_PT = 1 << 17;
const LOAD_IA32_RTIT_CTL = 1 << 18;
}
}
bitflags! {
pub struct ExitControls: u32 {
const SAVE_DEBUG_CONTROLS = 1 << 2;
const HOST_ADDRESS_SPACE_SIZE = 1 << 9;
const LOAD_IA32_PERF_GLOBAL_CTRL = 1 << 12;
const ACK_INTERRUPT_ON_EXIT = 1 << 15;
const SAVE_IA32_PAT = 1 << 18;
const LOAD_IA32_PAT = 1 << 19;
const SAVE_IA32_EFER = 1 << 20;
const LOAD_IA32_EFER = 1 << 21;
const SAVE_VMX_PREEMPTION_TIMER = 1 << 22;
const CLEAR_IA32_BNDCFGS = 1 << 23;
const CONCEAL_VMX_FROM_PT = 1 << 24;
const CLEAR_IA32_RTIT_CTL = 1 << 25;
}
}
}
pub mod guest {
pub const ES_SELECTOR: u32 = 0x800;
pub const CS_SELECTOR: u32 = 0x802;
pub const SS_SELECTOR: u32 = 0x804;
pub const DS_SELECTOR: u32 = 0x806;
pub const FS_SELECTOR: u32 = 0x808;
pub const GS_SELECTOR: u32 = 0x80A;
pub const LDTR_SELECTOR: u32 = 0x80C;
pub const TR_SELECTOR: u32 = 0x80E;
pub const INTERRUPT_STATUS: u32 = 0x810;
pub const PML_INDEX: u32 = 0x812;
pub const LINK_PTR_FULL: u32 = 0x2800;
pub const LINK_PTR_HIGH: u32 = 0x2801;
pub const IA32_DEBUGCTL_FULL: u32 = 0x2802;
pub const IA32_DEBUGCTL_HIGH: u32 = 0x2803;
pub const IA32_PAT_FULL: u32 = 0x2804;
pub const IA32_PAT_HIGH: u32 = 0x2805;
pub const IA32_EFER_FULL: u32 = 0x2806;
pub const IA32_EFER_HIGH: u32 = 0x2807;
pub const IA32_PERF_GLOBAL_CTRL_FULL: u32 = 0x2808;
pub const IA32_PERF_GLOBAL_CTRL_HIGH: u32 = 0x2809;
pub const PDPTE0_FULL: u32 = 0x280A;
pub const PDPTE0_HIGH: u32 = 0x280B;
pub const PDPTE1_FULL: u32 = 0x280C;
pub const PDPTE1_HIGH: u32 = 0x280D;
pub const PDPTE2_FULL: u32 = 0x280E;
pub const PDPTE2_HIGH: u32 = 0x280F;
pub const PDPTE3_FULL: u32 = 0x2810;
pub const PDPTE3_HIGH: u32 = 0x2811;
pub const IA32_BNDCFGS_FULL: u32 = 0x2812;
pub const IA32_BNDCFGS_HIGH: u32 = 0x2813;
pub const IA32_RTIT_CTL_FULL: u32 = 0x2814;
pub const IA32_RTIT_CTL_HIGH: u32 = 0x2815;
pub const ES_LIMIT: u32 = 0x4800;
pub const CS_LIMIT: u32 = 0x4802;
pub const SS_LIMIT: u32 = 0x4804;
pub const DS_LIMIT: u32 = 0x4806;
pub const FS_LIMIT: u32 = 0x4808;
pub const GS_LIMIT: u32 = 0x480A;
pub const LDTR_LIMIT: u32 = 0x480C;
pub const TR_LIMIT: u32 = 0x480E;
pub const GDTR_LIMIT: u32 = 0x4810;
pub const IDTR_LIMIT: u32 = 0x4812;
pub const ES_ACCESS_RIGHTS: u32 = 0x4814;
pub const CS_ACCESS_RIGHTS: u32 = 0x4816;
pub const SS_ACCESS_RIGHTS: u32 = 0x4818;
pub const DS_ACCESS_RIGHTS: u32 = 0x481A;
pub const FS_ACCESS_RIGHTS: u32 = 0x481C;
pub const GS_ACCESS_RIGHTS: u32 = 0x481E;
pub const LDTR_ACCESS_RIGHTS: u32 = 0x4820;
pub const TR_ACCESS_RIGHTS: u32 = 0x4822;
pub const INTERRUPTIBILITY_STATE: u32 = 0x4824;
pub const ACTIVITY_STATE: u32 = 0x4826;
pub const SMBASE: u32 = 0x4828;
pub const IA32_SYSENTER_CS: u32 = 0x482A;
pub const VMX_PREEMPTION_TIMER_VALUE: u32 = 0x482E;
pub const CR0: u32 = 0x6800;
pub const CR3: u32 = 0x6802;
pub const CR4: u32 = 0x6804;
pub const ES_BASE: u32 = 0x6806;
pub const CS_BASE: u32 = 0x6808;
pub const SS_BASE: u32 = 0x680A;
pub const DS_BASE: u32 = 0x680C;
pub const FS_BASE: u32 = 0x680E;
pub const GS_BASE: u32 = 0x6810;
pub const LDTR_BASE: u32 = 0x6812;
pub const TR_BASE: u32 = 0x6814;
pub const GDTR_BASE: u32 = 0x6816;
pub const IDTR_BASE: u32 = 0x6818;
pub const DR7: u32 = 0x681A;
pub const RSP: u32 = 0x681C;
pub const RIP: u32 = 0x681E;
pub const RFLAGS: u32 = 0x6820;
pub const PENDING_DBG_EXCEPTIONS: u32 = 0x6822;
pub const IA32_SYSENTER_ESP: u32 = 0x6824;
pub const IA32_SYSENTER_EIP: u32 = 0x6826;
}
pub mod host {
pub const ES_SELECTOR: u32 = 0xC00;
pub const CS_SELECTOR: u32 = 0xC02;
pub const SS_SELECTOR: u32 = 0xC04;
pub const DS_SELECTOR: u32 = 0xC06;
pub const FS_SELECTOR: u32 = 0xC08;
pub const GS_SELECTOR: u32 = 0xC0A;
pub const TR_SELECTOR: u32 = 0xC0C;
pub const IA32_PAT_FULL: u32 = 0x2C00;
pub const IA32_PAT_HIGH: u32 = 0x2C01;
pub const IA32_EFER_FULL: u32 = 0x2C02;
pub const IA32_EFER_HIGH: u32 = 0x2C03;
pub const IA32_PERF_GLOBAL_CTRL_FULL: u32 = 0x2C04;
pub const IA32_PERF_GLOBAL_CTRL_HIGH: u32 = 0x2C05;
pub const IA32_SYSENTER_CS: u32 = 0x4C00;
pub const CR0: u32 = 0x6C00;
pub const CR3: u32 = 0x6C02;
pub const CR4: u32 = 0x6C04;
pub const FS_BASE: u32 = 0x6C06;
pub const GS_BASE: u32 = 0x6C08;
pub const TR_BASE: u32 = 0x6C0A;
pub const GDTR_BASE: u32 = 0x6C0C;
pub const IDTR_BASE: u32 = 0x6C0E;
pub const IA32_SYSENTER_ESP: u32 = 0x6C10;
pub const IA32_SYSENTER_EIP: u32 = 0x6C12;
pub const RSP: u32 = 0x6C14;
pub const RIP: u32 = 0x6C16;
}
pub mod ro {
pub const GUEST_PHYSICAL_ADDR_FULL: u32 = 0x2400;
pub const GUEST_PHYSICAL_ADDR_HIGH: u32 = 0x2401;
pub const VM_INSTRUCTION_ERROR: u32 = 0x4400;
pub const EXIT_REASON: u32 = 0x4402;
pub const VMEXIT_INTERRUPTION_INFO: u32 = 0x4404;
pub const VMEXIT_INTERRUPTION_ERR_CODE: u32 = 0x4406;
pub const IDT_VECTORING_INFO: u32 = 0x4408;
pub const IDT_VECTORING_ERR_CODE: u32 = 0x440A;
pub const VMEXIT_INSTRUCTION_LEN: u32 = 0x440C;
pub const VMEXIT_INSTRUCTION_INFO: u32 = 0x440E;
pub const EXIT_QUALIFICATION: u32 = 0x6400;
pub const IO_RCX: u32 = 0x6402;
pub const IO_RSI: u32 = 0x6404;
pub const IO_RDI: u32 = 0x6406;
pub const IO_RIP: u32 = 0x6408;
pub const GUEST_LINEAR_ADDR: u32 = 0x640A;
}