2 * This file is part of the Palacios Virtual Machine Monitor developed
3 * by the V3VEE Project with funding from the United States National
4 * Science Foundation and the Department of Energy.
6 * The V3VEE Project is a joint project between Northwestern University
7 * and the University of New Mexico. You can find out more at
10 * Copyright (c) 2008, Jack Lange <jarusl@cs.northwestern.edu>
11 * Copyright (c) 2008, The V3VEE Project <http://www.v3vee.org>
12 * All rights reserved.
14 * Author: Jack Lange <jarusl@cs.northwestern.edu>
16 * This is free software. You are permitted to use,
17 * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
20 #include <palacios/vmcs.h>
21 #include <palacios/vmx_lowlevel.h>
22 #include <palacios/vmm.h>
25 // static const char * v3_vmcs_field_to_str(vmcs_field_t field);
27 //extern char * exception_names;
29 // Ignores "HIGH" addresses - 32 bit only for now
33 static inline void print_vmcs_field(vmcs_field_t vmcs_index) {
34 int len = v3_vmcs_get_field_len(vmcs_index);
37 if (vmcs_read(vmcs_index, &val, len) != VMX_SUCCESS) {
38 PrintError("VMCS_READ error for index %x\n", vmcs_index);
43 PrintDebug("%s: %x\n", v3_vmcs_field_to_str(vmcs_index), (uint16_t)val);
44 } else if (len == 4) {
45 PrintDebug("%s: %x\n", v3_vmcs_field_to_str(vmcs_index), (uint32_t)val);
46 } else if (len == 8) {
47 PrintDebug("%s: %p\n", v3_vmcs_field_to_str(vmcs_index), (void *)(addr_t)val);
53 void v3_print_vmcs_guest_state()
55 PrintDebug("\n===== VMCS Guest State =====\n");
56 print_vmcs_field(VMCS_GUEST_RIP);
57 print_vmcs_field(VMCS_GUEST_RSP);
58 print_vmcs_field(VMCS_GUEST_CR0);
59 print_vmcs_field(VMCS_GUEST_CR3);
60 print_vmcs_field(VMCS_GUEST_CR4);
61 print_vmcs_field(VMCS_GUEST_DR7);
63 PrintDebug("\n=== CS Segment===\n");
64 print_vmcs_field(VMCS_GUEST_CS_SELECTOR);
65 print_vmcs_field(VMCS_GUEST_CS_BASE);
66 print_vmcs_field(VMCS_GUEST_CS_LIMIT);
67 print_vmcs_field(VMCS_GUEST_CS_ACCESS);
69 PrintDebug("\n=== SS Segment ===\n");
70 print_vmcs_field(VMCS_GUEST_SS_SELECTOR);
71 print_vmcs_field(VMCS_GUEST_SS_BASE);
72 print_vmcs_field(VMCS_GUEST_SS_LIMIT);
73 print_vmcs_field(VMCS_GUEST_SS_ACCESS);
75 PrintDebug("\n=== DS Segment ===\n");
76 print_vmcs_field(VMCS_GUEST_DS_SELECTOR);
77 print_vmcs_field(VMCS_GUEST_DS_BASE);
78 print_vmcs_field(VMCS_GUEST_DS_LIMIT);
79 print_vmcs_field(VMCS_GUEST_DS_ACCESS);
81 PrintDebug("\n=== ES Segment ===\n");
82 print_vmcs_field(VMCS_GUEST_ES_SELECTOR);
83 print_vmcs_field(VMCS_GUEST_ES_BASE);
84 print_vmcs_field(VMCS_GUEST_ES_LIMIT);
85 print_vmcs_field(VMCS_GUEST_ES_ACCESS);
87 PrintDebug("\n=== FS Segment ===\n");
88 print_vmcs_field(VMCS_GUEST_FS_SELECTOR);
89 print_vmcs_field(VMCS_GUEST_FS_BASE);
90 print_vmcs_field(VMCS_GUEST_FS_LIMIT);
91 print_vmcs_field(VMCS_GUEST_FS_ACCESS);
93 PrintDebug("\n=== GS Segment ===\n");
94 print_vmcs_field(VMCS_GUEST_GS_SELECTOR);
95 print_vmcs_field(VMCS_GUEST_GS_BASE);
96 print_vmcs_field(VMCS_GUEST_GS_LIMIT);
97 print_vmcs_field(VMCS_GUEST_GS_ACCESS);
99 PrintDebug("\n=== LDTR Segment ===\n");
100 print_vmcs_field(VMCS_GUEST_LDTR_SELECTOR);
101 print_vmcs_field(VMCS_GUEST_LDTR_BASE);
102 print_vmcs_field(VMCS_GUEST_LDTR_LIMIT);
103 print_vmcs_field(VMCS_GUEST_LDTR_ACCESS);
105 PrintDebug("\n=== TR Segment ===\n");
106 print_vmcs_field(VMCS_GUEST_TR_SELECTOR);
107 print_vmcs_field(VMCS_GUEST_TR_BASE);
108 print_vmcs_field(VMCS_GUEST_TR_LIMIT);
109 print_vmcs_field(VMCS_GUEST_TR_ACCESS);
111 PrintDebug("\n=== GDTR ===\n");
112 print_vmcs_field(VMCS_GUEST_GDTR_BASE);
113 print_vmcs_field(VMCS_GUEST_GDTR_LIMIT);
115 PrintDebug("\n=== IDTR ===\n");
116 print_vmcs_field(VMCS_GUEST_IDTR_BASE);
117 print_vmcs_field(VMCS_GUEST_IDTR_LIMIT);
120 print_vmcs_field(VMCS_GUEST_RFLAGS);
121 print_vmcs_field(VMCS_GUEST_ACTIVITY_STATE);
122 print_vmcs_field(VMCS_GUEST_INT_STATE);
123 print_vmcs_field(VMCS_GUEST_PENDING_DBG_EXCP);
125 print_vmcs_field(VMCS_GUEST_DBG_CTL);
126 print_vmcs_field(VMCS_GUEST_SYSENTER_CS);
127 print_vmcs_field(VMCS_GUEST_SYSENTER_ESP);
128 print_vmcs_field(VMCS_GUEST_SYSENTER_EIP);
129 print_vmcs_field(VMCS_GUEST_PERF_GLOBAL_CTRL);
130 print_vmcs_field(VMCS_LINK_PTR);
136 void print_debug_vmcs_load_guest() {
137 const int wordsize = sizeof(addr_t);
139 struct vmcs_segment_access tmp_seg;
141 PrintDebug("\n====== Loading Guest State ======\n");
142 PRINT_VMREAD("Guest CR0: %x\n", GUEST_CR0, wordsize);
143 PRINT_VMREAD("Guest CR3: %x\n", GUEST_CR3, wordsize);
144 PRINT_VMREAD("Guest CR4: %x\n", GUEST_CR4, wordsize);
145 PRINT_VMREAD("Guest DR7: %x\n", GUEST_DR7, wordsize);
147 READ_VMCS_SEG(&tmp_seg,CS,wordsize);
148 print_vmcs_segment("CS", &tmp_seg);
150 READ_VMCS_SEG(&tmp_seg,SS,wordsize);
151 print_vmcs_segment("SS", &tmp_seg);
153 READ_VMCS_SEG(&tmp,DS,wordsize);
154 print_vmcs_segment("DS", &tmp_seg);
156 READ_VMCS_SEG(&tmp_seg,ES,wordsize);
157 print_vmcs_segment("ES", &tmp_seg);
159 READ_VMCS_SEG(&tmp_seg,FS,wordsize);
160 print_vmcs_segment("FS", &tmp_seg);
162 READ_VMCS_SEG(&tmp_seg,GS,wordsize);
163 print_vmcs_segment("GS", &tmp_seg);
165 READ_VMCS_SEG(&tmp_seg,TR,wordsize);
166 print_vmcs_segment("TR", &tmp_seg);
168 READ_VMCS_SEG(&tmp_seg,LDTR,wordsize);
169 print_vmcs_segment("LDTR", &tmp_seg);
171 PrintDebug("\n==GDTR==\n");
172 PRINT_VMREAD("GDTR Base: %x\n", GUEST_GDTR_BASE, wordsize);
173 PRINT_VMREAD("GDTR Limit: %x\n", GUEST_GDTR_LIMIT, 32);
174 PrintDebug("====\n");
176 PrintDebug("\n==LDTR==\n");
177 PRINT_VMREAD("LDTR Base: %x\n", GUEST_LDTR_BASE, wordsize);
178 PRINT_VMREAD("LDTR Limit: %x\n", GUEST_LDTR_LIMIT, 32);
179 PrintDebug("=====\n");
181 PRINT_VMREAD("Guest RSP: %x\n", GUEST_RSP, wordsize);
182 PRINT_VMREAD("Guest RIP: %x\n", GUEST_RIP, wordsize);
183 PRINT_VMREAD("Guest RFLAGS: %x\n", GUEST_RFLAGS, wordsize);
184 PRINT_VMREAD("Guest Activity state: %x\n", GUEST_ACTIVITY_STATE, 32);
185 PRINT_VMREAD("Guest Interruptibility state: %x\n", GUEST_INT_STATE, 32);
186 PRINT_VMREAD("Guest pending debug: %x\n", GUEST_PENDING_DEBUG_EXCS, wordsize);
188 PRINT_VMREAD("IA32_DEBUGCTL: %x\n", GUEST_IA32_DEBUGCTL, 64);
189 PRINT_VMREAD("IA32_SYSENTER_CS: %x\n", GUEST_IA32_SYSENTER_CS, 32);
190 PRINT_VMREAD("IA32_SYSTENTER_ESP: %x\n", GUEST_IA32_SYSENTER_ESP, wordsize);
191 PRINT_VMREAD("IA32_SYSTENTER_EIP: %x\n", GUEST_IA32_SYSENTER_EIP, wordsize);
192 PRINT_VMREAD("IA32_PERF_GLOBAL_CTRL: %x\n", GUEST_IA32_PERF_GLOBAL_CTRL, wordsize);
193 PRINT_VMREAD("VMCS Link Ptr: %x\n", VMCS_LINK_PTR, 64);
194 // TODO: Maybe add VMX preemption timer and PDTE (Intel 20-8 Vol. 3b)
197 void print_debug_load_host() {
198 const int wordsize = sizeof(addr_t);
200 vmcs_segment tmp_seg;
202 PrintDebug("\n====== Host State ========\n");
203 PRINT_VMREAD("Host CR0: %x\n", HOST_CR0, wordsize);
204 PRINT_VMREAD("Host CR3: %x\n", HOST_CR3, wordsize);
205 PRINT_VMREAD("Host CR4: %x\n", HOST_CR4, wordsize);
206 PRINT_VMREAD("Host RSP: %x\n", HOST_RSP, wordsize);
207 PRINT_VMREAD("Host RIP: %x\n", HOST_RIP, wordsize);
208 PRINT_VMREAD("IA32_SYSENTER_CS: %x\n", HOST_IA32_SYSENTER_CS, 32);
209 PRINT_VMREAD("IA32_SYSENTER_ESP: %x\n", HOST_IA32_SYSENTER_ESP, wordsize);
210 PRINT_VMREAD("IA32_SYSENTER_EIP: %x\n", HOST_IA32_SYSENTER_EIP, wordsize);
212 PRINT_VMREAD("Host CS Selector: %x\n", HOST_CS_SELECTOR, 16);
213 PRINT_VMREAD("Host SS Selector: %x\n", HOST_SS_SELECTOR, 16);
214 PRINT_VMREAD("Host DS Selector: %x\n", HOST_DS_SELECTOR, 16);
215 PRINT_VMREAD("Host ES Selector: %x\n", HOST_ES_SELECTOR, 16);
216 PRINT_VMREAD("Host FS Selector: %x\n", HOST_FS_SELECTOR, 16);
217 PRINT_VMREAD("Host GS Selector: %x\n", HOST_GS_SELECTOR, 16);
218 PRINT_VMREAD("Host TR Selector: %x\n", HOST_TR_SELECTOR, 16);
220 PRINT_VMREAD("Host FS Base: %x\n", HOST_FS_BASE, wordsize);
221 PRINT_VMREAD("Host GS Base: %x\n", HOST_GS_BASE, wordsize);
222 PRINT_VMREAD("Host TR Base: %x\n", HOST_TR_BASE, wordsize);
223 PRINT_VMREAD("Host GDTR Base: %x\n", HOST_GDTR_BASE, wordsize);
224 PRINT_VMREAD("Host IDTR Base: %x\n", HOSE_IDTR_BASE, wordsize);
227 void print_vmcs_segment(char * name, vmcs_segment* seg)
229 PrintDebug("\n==VMCS %s Segment==\n",name);
230 PrintDebug("\tSelector: %x\n", seg->selector);
231 PrintDebug("\tBase Address: %x\n", seg->baseAddr);
232 PrintDebug("\tLimit: %x\n", seg->limit);
233 PrintDebug("\tAccess: %x\n", seg->access);
237 * Returns the field length in bytes
239 int v3_vmcs_get_field_len(vmcs_field_t field) {
241 /* 16 bit Control Fields */
242 case VMCS_GUEST_ES_SELECTOR:
243 case VMCS_GUEST_CS_SELECTOR:
244 case VMCS_GUEST_SS_SELECTOR:
245 case VMCS_GUEST_DS_SELECTOR:
246 case VMCS_GUEST_FS_SELECTOR:
247 case VMCS_GUEST_GS_SELECTOR:
248 case VMCS_GUEST_LDTR_SELECTOR:
249 case VMCS_GUEST_TR_SELECTOR:
250 case VMCS_HOST_ES_SELECTOR:
251 case VMCS_HOST_CS_SELECTOR:
252 case VMCS_HOST_SS_SELECTOR:
253 case VMCS_HOST_DS_SELECTOR:
254 case VMCS_HOST_FS_SELECTOR:
255 case VMCS_HOST_GS_SELECTOR:
256 case VMCS_HOST_TR_SELECTOR:
259 /* 32 bit Control Fields */
261 case VMCS_PROC_CTRLS:
262 case VMCS_EXCP_BITMAP:
263 case VMCS_PG_FAULT_ERR_MASK:
264 case VMCS_PG_FAULT_ERR_MATCH:
265 case VMCS_CR3_TGT_CNT:
266 case VMCS_EXIT_CTRLS:
267 case VMCS_EXIT_MSR_STORE_CNT:
268 case VMCS_EXIT_MSR_LOAD_CNT:
269 case VMCS_ENTRY_CTRLS:
270 case VMCS_ENTRY_MSR_LOAD_CNT:
271 case VMCS_ENTRY_INT_INFO:
272 case VMCS_ENTRY_EXCP_ERR:
273 case VMCS_ENTRY_INSTR_LEN:
274 case VMCS_TPR_THRESHOLD:
276 case VMCS_EXIT_REASON:
277 case VMCS_EXIT_INT_INFO:
278 case VMCS_EXIT_INT_ERR:
279 case VMCS_IDT_VECTOR_INFO:
280 case VMCS_IDT_VECTOR_ERR:
281 case VMCS_EXIT_INSTR_LEN:
282 case VMCS_VMX_INSTR_INFO:
283 case VMCS_GUEST_ES_LIMIT:
284 case VMCS_GUEST_CS_LIMIT:
285 case VMCS_GUEST_SS_LIMIT:
286 case VMCS_GUEST_DS_LIMIT:
287 case VMCS_GUEST_FS_LIMIT:
288 case VMCS_GUEST_GS_LIMIT:
289 case VMCS_GUEST_LDTR_LIMIT:
290 case VMCS_GUEST_TR_LIMIT:
291 case VMCS_GUEST_GDTR_LIMIT:
292 case VMCS_GUEST_IDTR_LIMIT:
293 case VMCS_GUEST_ES_ACCESS:
294 case VMCS_GUEST_CS_ACCESS:
295 case VMCS_GUEST_SS_ACCESS:
296 case VMCS_GUEST_DS_ACCESS:
297 case VMCS_GUEST_FS_ACCESS:
298 case VMCS_GUEST_GS_ACCESS:
299 case VMCS_GUEST_LDTR_ACCESS:
300 case VMCS_GUEST_TR_ACCESS:
301 case VMCS_GUEST_INT_STATE:
302 case VMCS_GUEST_ACTIVITY_STATE:
303 case VMCS_GUEST_SMBASE:
304 case VMCS_GUEST_SYSENTER_CS:
305 case VMCS_HOST_SYSENTER_CS:
309 /* high bits of variable width fields
310 * We can probably just delete most of these....
312 case VMCS_IO_BITMAP_A_ADDR_HIGH:
313 case VMCS_IO_BITMAP_B_ADDR_HIGH:
314 case VMCS_MSR_BITMAP_HIGH:
315 case VMCS_EXIT_MSR_STORE_ADDR_HIGH:
316 case VMCS_EXIT_MSR_LOAD_ADDR_HIGH:
317 case VMCS_ENTRY_MSR_LOAD_ADDR_HIGH:
318 case VMCS_EXEC_PTR_HIGH:
319 case VMCS_TSC_OFFSET_HIGH:
320 case VMCS_VAPIC_ADDR_HIGH:
321 case VMCS_LINK_PTR_HIGH:
322 case VMCS_GUEST_DBG_CTL_HIGH:
323 case VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH:
326 /* Natural Width Control Fields */
327 case VMCS_IO_BITMAP_A_ADDR:
328 case VMCS_IO_BITMAP_B_ADDR:
329 case VMCS_MSR_BITMAP:
330 case VMCS_EXIT_MSR_STORE_ADDR:
331 case VMCS_EXIT_MSR_LOAD_ADDR:
332 case VMCS_ENTRY_MSR_LOAD_ADDR:
334 case VMCS_TSC_OFFSET:
335 case VMCS_VAPIC_ADDR:
337 case VMCS_GUEST_DBG_CTL:
338 case VMCS_GUEST_PERF_GLOBAL_CTRL:
341 case VMCS_CR0_READ_SHDW:
342 case VMCS_CR4_READ_SHDW:
343 case VMCS_CR3_TGT_VAL_0:
344 case VMCS_CR3_TGT_VAL_1:
345 case VMCS_CR3_TGT_VAL_2:
346 case VMCS_CR3_TGT_VAL_3:
352 case VMCS_GUEST_LINEAR_ADDR:
356 case VMCS_GUEST_ES_BASE:
357 case VMCS_GUEST_CS_BASE:
358 case VMCS_GUEST_SS_BASE:
359 case VMCS_GUEST_DS_BASE:
360 case VMCS_GUEST_FS_BASE:
361 case VMCS_GUEST_GS_BASE:
362 case VMCS_GUEST_LDTR_BASE:
363 case VMCS_GUEST_TR_BASE:
364 case VMCS_GUEST_GDTR_BASE:
365 case VMCS_GUEST_IDTR_BASE:
369 case VMCS_GUEST_RFLAGS:
370 case VMCS_GUEST_PENDING_DBG_EXCP:
371 case VMCS_GUEST_SYSENTER_ESP:
372 case VMCS_GUEST_SYSENTER_EIP:
376 case VMCS_HOST_FS_BASE:
377 case VMCS_HOST_GS_BASE:
378 case VMCS_HOST_TR_BASE:
379 case VMCS_HOST_GDTR_BASE:
380 case VMCS_HOST_IDTR_BASE:
381 case VMCS_HOST_SYSENTER_ESP:
382 case VMCS_HOST_SYSENTER_EIP:
385 return sizeof(addr_t);
388 PrintError("Invalid VMCS field\n");
404 static const char VMCS_GUEST_ES_SELECTOR_STR[] = "GUEST_ES_SELECTOR";
405 static const char VMCS_GUEST_CS_SELECTOR_STR[] = "GUEST_CS_SELECTOR";
406 static const char VMCS_GUEST_SS_SELECTOR_STR[] = "GUEST_SS_SELECTOR";
407 static const char VMCS_GUEST_DS_SELECTOR_STR[] = "GUEST_DS_SELECTOR";
408 static const char VMCS_GUEST_FS_SELECTOR_STR[] = "GUEST_FS_SELECTOR";
409 static const char VMCS_GUEST_GS_SELECTOR_STR[] = "GUEST_GS_SELECTOR";
410 static const char VMCS_GUEST_LDTR_SELECTOR_STR[] = "GUEST_LDTR_SELECTOR";
411 static const char VMCS_GUEST_TR_SELECTOR_STR[] = "GUEST_TR_SELECTOR";
412 static const char VMCS_HOST_ES_SELECTOR_STR[] = "HOST_ES_SELECTOR";
413 static const char VMCS_HOST_CS_SELECTOR_STR[] = "HOST_CS_SELECTOR";
414 static const char VMCS_HOST_SS_SELECTOR_STR[] = "HOST_SS_SELECTOR";
415 static const char VMCS_HOST_DS_SELECTOR_STR[] = "HOST_DS_SELECTOR";
416 static const char VMCS_HOST_FS_SELECTOR_STR[] = "HOST_FS_SELECTOR";
417 static const char VMCS_HOST_GS_SELECTOR_STR[] = "HOST_GS_SELECTOR";
418 static const char VMCS_HOST_TR_SELECTOR_STR[] = "HOST_TR_SELECTOR";
419 static const char VMCS_IO_BITMAP_A_ADDR_STR[] = "IO_BITMAP_A_ADDR";
420 static const char VMCS_IO_BITMAP_A_ADDR_HIGH_STR[] = "IO_BITMAP_A_ADDR_HIGH";
421 static const char VMCS_IO_BITMAP_B_ADDR_STR[] = "IO_BITMAP_B_ADDR";
422 static const char VMCS_IO_BITMAP_B_ADDR_HIGH_STR[] = "IO_BITMAP_B_ADDR_HIGH";
423 static const char VMCS_MSR_BITMAP_STR[] = "MSR_BITMAPS";
424 static const char VMCS_MSR_BITMAP_HIGH_STR[] = "MSR_BITMAPS_HIGH";
425 static const char VMCS_EXIT_MSR_STORE_ADDR_STR[] = "EXIT_MSR_STORE_ADDR";
426 static const char VMCS_EXIT_MSR_STORE_ADDR_HIGH_STR[] = "EXIT_MSR_STORE_ADDR_HIGH";
427 static const char VMCS_EXIT_MSR_LOAD_ADDR_STR[] = "EXIT_MSR_LOAD_ADDR";
428 static const char VMCS_EXIT_MSR_LOAD_ADDR_HIGH_STR[] = "EXIT_MSR_LOAD_ADDR_HIGH";
429 static const char VMCS_ENTRY_MSR_LOAD_ADDR_STR[] = "ENTRY_MSR_LOAD_ADDR";
430 static const char VMCS_ENTRY_MSR_LOAD_ADDR_HIGH_STR[] = "ENTRY_MSR_LOAD_ADDR_HIGH";
431 static const char VMCS_EXEC_PTR_STR[] = "VMCS_EXEC_PTR";
432 static const char VMCS_EXEC_PTR_HIGH_STR[] = "VMCS_EXEC_PTR_HIGH";
433 static const char VMCS_TSC_OFFSET_STR[] = "TSC_OFFSET";
434 static const char VMCS_TSC_OFFSET_HIGH_STR[] = "TSC_OFFSET_HIGH";
435 static const char VMCS_VAPIC_ADDR_STR[] = "VAPIC_PAGE_ADDR";
436 static const char VMCS_VAPIC_ADDR_HIGH_STR[] = "VAPIC_PAGE_ADDR_HIGH";
437 static const char VMCS_LINK_PTR_STR[] = "VMCS_LINK_PTR";
438 static const char VMCS_LINK_PTR_HIGH_STR[] = "VMCS_LINK_PTR_HIGH";
439 static const char VMCS_GUEST_DBG_CTL_STR[] = "GUEST_DEBUG_CTL";
440 static const char VMCS_GUEST_DBG_CTL_HIGH_STR[] = "GUEST_DEBUG_CTL_HIGH";
441 static const char VMCS_GUEST_PERF_GLOBAL_CTRL_STR[] = "GUEST_PERF_GLOBAL_CTRL";
442 static const char VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH_STR[] = "GUEST_PERF_GLOBAL_CTRL_HIGH";
443 static const char VMCS_PIN_CTRLS_STR[] = "PIN_VM_EXEC_CTRLS";
444 static const char VMCS_PROC_CTRLS_STR[] = "PROC_VM_EXEC_CTRLS";
445 static const char VMCS_EXCP_BITMAP_STR[] = "EXCEPTION_BITMAP";
446 static const char VMCS_PG_FAULT_ERR_MASK_STR[] = "PAGE_FAULT_ERROR_MASK";
447 static const char VMCS_PG_FAULT_ERR_MATCH_STR[] = "PAGE_FAULT_ERROR_MATCH";
448 static const char VMCS_CR3_TGT_CNT_STR[] = "CR3_TARGET_COUNT";
449 static const char VMCS_EXIT_CTRLS_STR[] = "VM_EXIT_CTRLS";
450 static const char VMCS_EXIT_MSR_STORE_CNT_STR[] = "VM_EXIT_MSR_STORE_COUNT";
451 static const char VMCS_EXIT_MSR_LOAD_CNT_STR[] = "VM_EXIT_MSR_LOAD_COUNT";
452 static const char VMCS_ENTRY_CTRLS_STR[] = "VM_ENTRY_CTRLS";
453 static const char VMCS_ENTRY_MSR_LOAD_CNT_STR[] = "VM_ENTRY_MSR_LOAD_COUNT";
454 static const char VMCS_ENTRY_INT_INFO_STR[] = "VM_ENTRY_INT_INFO_FIELD";
455 static const char VMCS_ENTRY_EXCP_ERR_STR[] = "VM_ENTRY_EXCEPTION_ERROR";
456 static const char VMCS_ENTRY_INSTR_LEN_STR[] = "VM_ENTRY_INSTR_LENGTH";
457 static const char VMCS_TPR_THRESHOLD_STR[] = "TPR_THRESHOLD";
458 static const char VMCS_INSTR_ERR_STR[] = "VM_INSTR_ERROR";
459 static const char VMCS_EXIT_REASON_STR[] = "EXIT_REASON";
460 static const char VMCS_EXIT_INT_INFO_STR[] = "VM_EXIT_INT_INFO";
461 static const char VMCS_EXIT_INT_ERR_STR[] = "VM_EXIT_INT_ERROR";
462 static const char VMCS_IDT_VECTOR_INFO_STR[] = "IDT_VECTOR_INFO";
463 static const char VMCS_IDT_VECTOR_ERR_STR[] = "IDT_VECTOR_ERROR";
464 static const char VMCS_EXIT_INSTR_LEN_STR[] = "VM_EXIT_INSTR_LENGTH";
465 static const char VMCS_VMX_INSTR_INFO_STR[] = "VMX_INSTR_INFO";
466 static const char VMCS_GUEST_ES_LIMIT_STR[] = "GUEST_ES_LIMIT";
467 static const char VMCS_GUEST_CS_LIMIT_STR[] = "GUEST_CS_LIMIT";
468 static const char VMCS_GUEST_SS_LIMIT_STR[] = "GUEST_SS_LIMIT";
469 static const char VMCS_GUEST_DS_LIMIT_STR[] = "GUEST_DS_LIMIT";
470 static const char VMCS_GUEST_FS_LIMIT_STR[] = "GUEST_FS_LIMIT";
471 static const char VMCS_GUEST_GS_LIMIT_STR[] = "GUEST_GS_LIMIT";
472 static const char VMCS_GUEST_LDTR_LIMIT_STR[] = "GUEST_LDTR_LIMIT";
473 static const char VMCS_GUEST_TR_LIMIT_STR[] = "GUEST_TR_LIMIT";
474 static const char VMCS_GUEST_GDTR_LIMIT_STR[] = "GUEST_GDTR_LIMIT";
475 static const char VMCS_GUEST_IDTR_LIMIT_STR[] = "GUEST_IDTR_LIMIT";
476 static const char VMCS_GUEST_ES_ACCESS_STR[] = "GUEST_ES_ACCESS";
477 static const char VMCS_GUEST_CS_ACCESS_STR[] = "GUEST_CS_ACCESS";
478 static const char VMCS_GUEST_SS_ACCESS_STR[] = "GUEST_SS_ACCESS";
479 static const char VMCS_GUEST_DS_ACCESS_STR[] = "GUEST_DS_ACCESS";
480 static const char VMCS_GUEST_FS_ACCESS_STR[] = "GUEST_FS_ACCESS";
481 static const char VMCS_GUEST_GS_ACCESS_STR[] = "GUEST_GS_ACCESS";
482 static const char VMCS_GUEST_LDTR_ACCESS_STR[] = "GUEST_LDTR_ACCESS";
483 static const char VMCS_GUEST_TR_ACCESS_STR[] = "GUEST_TR_ACCESS";
484 static const char VMCS_GUEST_INT_STATE_STR[] = "GUEST_INT_STATE";
485 static const char VMCS_GUEST_ACTIVITY_STATE_STR[] = "GUEST_ACTIVITY_STATE";
486 static const char VMCS_GUEST_SMBASE_STR[] = "GUEST_SMBASE";
487 static const char VMCS_GUEST_SYSENTER_CS_STR[] = "GUEST_SYSENTER_CS";
488 static const char VMCS_HOST_SYSENTER_CS_STR[] = "HOST_SYSENTER_CS";
489 static const char VMCS_CR0_MASK_STR[] = "CR0_GUEST_HOST_MASK";
490 static const char VMCS_CR4_MASK_STR[] = "CR4_GUEST_HOST_MASK";
491 static const char VMCS_CR0_READ_SHDW_STR[] = "CR0_READ_SHADOW";
492 static const char VMCS_CR4_READ_SHDW_STR[] = "CR4_READ_SHADOW";
493 static const char VMCS_CR3_TGT_VAL_0_STR[] = "CR3_TARGET_VALUE_0";
494 static const char VMCS_CR3_TGT_VAL_1_STR[] = "CR3_TARGET_VALUE_1";
495 static const char VMCS_CR3_TGT_VAL_2_STR[] = "CR3_TARGET_VALUE_2";
496 static const char VMCS_CR3_TGT_VAL_3_STR[] = "CR3_TARGET_VALUE_3";
497 static const char VMCS_EXIT_QUAL_STR[] = "EXIT_QUALIFICATION";
498 static const char VMCS_IO_RCX_STR[] = "IO_RCX";
499 static const char VMCS_IO_RSI_STR[] = "IO_RSI";
500 static const char VMCS_IO_RDI_STR[] = "IO_RDI";
501 static const char VMCS_IO_RIP_STR[] = "IO_RIP";
502 static const char VMCS_GUEST_LINEAR_ADDR_STR[] = "GUEST_LINEAR_ADDR";
503 static const char VMCS_GUEST_CR0_STR[] = "GUEST_CR0";
504 static const char VMCS_GUEST_CR3_STR[] = "GUEST_CR3";
505 static const char VMCS_GUEST_CR4_STR[] = "GUEST_CR4";
506 static const char VMCS_GUEST_ES_BASE_STR[] = "GUEST_ES_BASE";
507 static const char VMCS_GUEST_CS_BASE_STR[] = "GUEST_CS_BASE";
508 static const char VMCS_GUEST_SS_BASE_STR[] = "GUEST_SS_BASE";
509 static const char VMCS_GUEST_DS_BASE_STR[] = "GUEST_DS_BASE";
510 static const char VMCS_GUEST_FS_BASE_STR[] = "GUEST_FS_BASE";
511 static const char VMCS_GUEST_GS_BASE_STR[] = "GUEST_GS_BASE";
512 static const char VMCS_GUEST_LDTR_BASE_STR[] = "GUEST_LDTR_BASE";
513 static const char VMCS_GUEST_TR_BASE_STR[] = "GUEST_TR_BASE";
514 static const char VMCS_GUEST_GDTR_BASE_STR[] = "GUEST_GDTR_BASE";
515 static const char VMCS_GUEST_IDTR_BASE_STR[] = "GUEST_IDTR_BASE";
516 static const char VMCS_GUEST_DR7_STR[] = "GUEST_DR7";
517 static const char VMCS_GUEST_RSP_STR[] = "GUEST_RSP";
518 static const char VMCS_GUEST_RIP_STR[] = "GUEST_RIP";
519 static const char VMCS_GUEST_RFLAGS_STR[] = "GUEST_RFLAGS";
520 static const char VMCS_GUEST_PENDING_DBG_EXCP_STR[] = "GUEST_PENDING_DEBUG_EXCS";
521 static const char VMCS_GUEST_SYSENTER_ESP_STR[] = "GUEST_SYSENTER_ESP";
522 static const char VMCS_GUEST_SYSENTER_EIP_STR[] = "GUEST_SYSENTER_EIP";
523 static const char VMCS_HOST_CR0_STR[] = "HOST_CR0";
524 static const char VMCS_HOST_CR3_STR[] = "HOST_CR3";
525 static const char VMCS_HOST_CR4_STR[] = "HOST_CR4";
526 static const char VMCS_HOST_FS_BASE_STR[] = "HOST_FS_BASE";
527 static const char VMCS_HOST_GS_BASE_STR[] = "HOST_GS_BASE";
528 static const char VMCS_HOST_TR_BASE_STR[] = "HOST_TR_BASE";
529 static const char VMCS_HOST_GDTR_BASE_STR[] = "HOST_GDTR_BASE";
530 static const char VMCS_HOST_IDTR_BASE_STR[] = "HOST_IDTR_BASE";
531 static const char VMCS_HOST_SYSENTER_ESP_STR[] = "HOST_SYSENTER_ESP";
532 static const char VMCS_HOST_SYSENTER_EIP_STR[] = "HOST_SYSENTER_EIP";
533 static const char VMCS_HOST_RSP_STR[] = "HOST_RSP";
534 static const char VMCS_HOST_RIP_STR[] = "HOST_RIP";
538 const char * v3_vmcs_field_to_str(vmcs_field_t field) {
540 case VMCS_GUEST_ES_SELECTOR:
541 return VMCS_GUEST_ES_SELECTOR_STR;
542 case VMCS_GUEST_CS_SELECTOR:
543 return VMCS_GUEST_CS_SELECTOR_STR;
544 case VMCS_GUEST_SS_SELECTOR:
545 return VMCS_GUEST_SS_SELECTOR_STR;
546 case VMCS_GUEST_DS_SELECTOR:
547 return VMCS_GUEST_DS_SELECTOR_STR;
548 case VMCS_GUEST_FS_SELECTOR:
549 return VMCS_GUEST_FS_SELECTOR_STR;
550 case VMCS_GUEST_GS_SELECTOR:
551 return VMCS_GUEST_GS_SELECTOR_STR;
552 case VMCS_GUEST_LDTR_SELECTOR:
553 return VMCS_GUEST_LDTR_SELECTOR_STR;
554 case VMCS_GUEST_TR_SELECTOR:
555 return VMCS_GUEST_TR_SELECTOR_STR;
556 case VMCS_HOST_ES_SELECTOR:
557 return VMCS_HOST_ES_SELECTOR_STR;
558 case VMCS_HOST_CS_SELECTOR:
559 return VMCS_HOST_CS_SELECTOR_STR;
560 case VMCS_HOST_SS_SELECTOR:
561 return VMCS_HOST_SS_SELECTOR_STR;
562 case VMCS_HOST_DS_SELECTOR:
563 return VMCS_HOST_DS_SELECTOR_STR;
564 case VMCS_HOST_FS_SELECTOR:
565 return VMCS_HOST_FS_SELECTOR_STR;
566 case VMCS_HOST_GS_SELECTOR:
567 return VMCS_HOST_GS_SELECTOR_STR;
568 case VMCS_HOST_TR_SELECTOR:
569 return VMCS_HOST_TR_SELECTOR_STR;
570 case VMCS_IO_BITMAP_A_ADDR:
571 return VMCS_IO_BITMAP_A_ADDR_STR;
572 case VMCS_IO_BITMAP_A_ADDR_HIGH:
573 return VMCS_IO_BITMAP_A_ADDR_HIGH_STR;
574 case VMCS_IO_BITMAP_B_ADDR:
575 return VMCS_IO_BITMAP_B_ADDR_STR;
576 case VMCS_IO_BITMAP_B_ADDR_HIGH:
577 return VMCS_IO_BITMAP_B_ADDR_HIGH_STR;
578 case VMCS_MSR_BITMAP:
579 return VMCS_MSR_BITMAP_STR;
580 case VMCS_MSR_BITMAP_HIGH:
581 return VMCS_MSR_BITMAP_HIGH_STR;
582 case VMCS_EXIT_MSR_STORE_ADDR:
583 return VMCS_EXIT_MSR_STORE_ADDR_STR;
584 case VMCS_EXIT_MSR_STORE_ADDR_HIGH:
585 return VMCS_EXIT_MSR_STORE_ADDR_HIGH_STR;
586 case VMCS_EXIT_MSR_LOAD_ADDR:
587 return VMCS_EXIT_MSR_LOAD_ADDR_STR;
588 case VMCS_EXIT_MSR_LOAD_ADDR_HIGH:
589 return VMCS_EXIT_MSR_LOAD_ADDR_HIGH_STR;
590 case VMCS_ENTRY_MSR_LOAD_ADDR:
591 return VMCS_ENTRY_MSR_LOAD_ADDR_STR;
592 case VMCS_ENTRY_MSR_LOAD_ADDR_HIGH:
593 return VMCS_ENTRY_MSR_LOAD_ADDR_HIGH_STR;
595 return VMCS_EXEC_PTR_STR;
596 case VMCS_EXEC_PTR_HIGH:
597 return VMCS_EXEC_PTR_HIGH_STR;
598 case VMCS_TSC_OFFSET:
599 return VMCS_TSC_OFFSET_STR;
600 case VMCS_TSC_OFFSET_HIGH:
601 return VMCS_TSC_OFFSET_HIGH_STR;
602 case VMCS_VAPIC_ADDR:
603 return VMCS_VAPIC_ADDR_STR;
604 case VMCS_VAPIC_ADDR_HIGH:
605 return VMCS_VAPIC_ADDR_HIGH_STR;
607 return VMCS_LINK_PTR_STR;
608 case VMCS_LINK_PTR_HIGH:
609 return VMCS_LINK_PTR_HIGH_STR;
610 case VMCS_GUEST_DBG_CTL:
611 return VMCS_GUEST_DBG_CTL_STR;
612 case VMCS_GUEST_DBG_CTL_HIGH:
613 return VMCS_GUEST_DBG_CTL_HIGH_STR;
614 case VMCS_GUEST_PERF_GLOBAL_CTRL:
615 return VMCS_GUEST_PERF_GLOBAL_CTRL_STR;
616 case VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH:
617 return VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH_STR;
619 return VMCS_PIN_CTRLS_STR;
620 case VMCS_PROC_CTRLS:
621 return VMCS_PROC_CTRLS_STR;
622 case VMCS_EXCP_BITMAP:
623 return VMCS_EXCP_BITMAP_STR;
624 case VMCS_PG_FAULT_ERR_MASK:
625 return VMCS_PG_FAULT_ERR_MASK_STR;
626 case VMCS_PG_FAULT_ERR_MATCH:
627 return VMCS_PG_FAULT_ERR_MATCH_STR;
628 case VMCS_CR3_TGT_CNT:
629 return VMCS_CR3_TGT_CNT_STR;
630 case VMCS_EXIT_CTRLS:
631 return VMCS_EXIT_CTRLS_STR;
632 case VMCS_EXIT_MSR_STORE_CNT:
633 return VMCS_EXIT_MSR_STORE_CNT_STR;
634 case VMCS_EXIT_MSR_LOAD_CNT:
635 return VMCS_EXIT_MSR_LOAD_CNT_STR;
636 case VMCS_ENTRY_CTRLS:
637 return VMCS_ENTRY_CTRLS_STR;
638 case VMCS_ENTRY_MSR_LOAD_CNT:
639 return VMCS_ENTRY_MSR_LOAD_CNT_STR;
640 case VMCS_ENTRY_INT_INFO:
641 return VMCS_ENTRY_INT_INFO_STR;
642 case VMCS_ENTRY_EXCP_ERR:
643 return VMCS_ENTRY_EXCP_ERR_STR;
644 case VMCS_ENTRY_INSTR_LEN:
645 return VMCS_ENTRY_INSTR_LEN_STR;
646 case VMCS_TPR_THRESHOLD:
647 return VMCS_TPR_THRESHOLD_STR;
649 return VMCS_INSTR_ERR_STR;
650 case VMCS_EXIT_REASON:
651 return VMCS_EXIT_REASON_STR;
652 case VMCS_EXIT_INT_INFO:
653 return VMCS_EXIT_INT_INFO_STR;
654 case VMCS_EXIT_INT_ERR:
655 return VMCS_EXIT_INT_ERR_STR;
656 case VMCS_IDT_VECTOR_INFO:
657 return VMCS_IDT_VECTOR_INFO_STR;
658 case VMCS_IDT_VECTOR_ERR:
659 return VMCS_IDT_VECTOR_ERR_STR;
660 case VMCS_EXIT_INSTR_LEN:
661 return VMCS_EXIT_INSTR_LEN_STR;
662 case VMCS_VMX_INSTR_INFO:
663 return VMCS_VMX_INSTR_INFO_STR;
664 case VMCS_GUEST_ES_LIMIT:
665 return VMCS_GUEST_ES_LIMIT_STR;
666 case VMCS_GUEST_CS_LIMIT:
667 return VMCS_GUEST_CS_LIMIT_STR;
668 case VMCS_GUEST_SS_LIMIT:
669 return VMCS_GUEST_SS_LIMIT_STR;
670 case VMCS_GUEST_DS_LIMIT:
671 return VMCS_GUEST_DS_LIMIT_STR;
672 case VMCS_GUEST_FS_LIMIT:
673 return VMCS_GUEST_FS_LIMIT_STR;
674 case VMCS_GUEST_GS_LIMIT:
675 return VMCS_GUEST_GS_LIMIT_STR;
676 case VMCS_GUEST_LDTR_LIMIT:
677 return VMCS_GUEST_LDTR_LIMIT_STR;
678 case VMCS_GUEST_TR_LIMIT:
679 return VMCS_GUEST_TR_LIMIT_STR;
680 case VMCS_GUEST_GDTR_LIMIT:
681 return VMCS_GUEST_GDTR_LIMIT_STR;
682 case VMCS_GUEST_IDTR_LIMIT:
683 return VMCS_GUEST_IDTR_LIMIT_STR;
684 case VMCS_GUEST_ES_ACCESS:
685 return VMCS_GUEST_ES_ACCESS_STR;
686 case VMCS_GUEST_CS_ACCESS:
687 return VMCS_GUEST_CS_ACCESS_STR;
688 case VMCS_GUEST_SS_ACCESS:
689 return VMCS_GUEST_SS_ACCESS_STR;
690 case VMCS_GUEST_DS_ACCESS:
691 return VMCS_GUEST_DS_ACCESS_STR;
692 case VMCS_GUEST_FS_ACCESS:
693 return VMCS_GUEST_FS_ACCESS_STR;
694 case VMCS_GUEST_GS_ACCESS:
695 return VMCS_GUEST_GS_ACCESS_STR;
696 case VMCS_GUEST_LDTR_ACCESS:
697 return VMCS_GUEST_LDTR_ACCESS_STR;
698 case VMCS_GUEST_TR_ACCESS:
699 return VMCS_GUEST_TR_ACCESS_STR;
700 case VMCS_GUEST_INT_STATE:
701 return VMCS_GUEST_INT_STATE_STR;
702 case VMCS_GUEST_ACTIVITY_STATE:
703 return VMCS_GUEST_ACTIVITY_STATE_STR;
704 case VMCS_GUEST_SMBASE:
705 return VMCS_GUEST_SMBASE_STR;
706 case VMCS_GUEST_SYSENTER_CS:
707 return VMCS_GUEST_SYSENTER_CS_STR;
708 case VMCS_HOST_SYSENTER_CS:
709 return VMCS_HOST_SYSENTER_CS_STR;
711 return VMCS_CR0_MASK_STR;
713 return VMCS_CR4_MASK_STR;
714 case VMCS_CR0_READ_SHDW:
715 return VMCS_CR0_READ_SHDW_STR;
716 case VMCS_CR4_READ_SHDW:
717 return VMCS_CR4_READ_SHDW_STR;
718 case VMCS_CR3_TGT_VAL_0:
719 return VMCS_CR3_TGT_VAL_0_STR;
720 case VMCS_CR3_TGT_VAL_1:
721 return VMCS_CR3_TGT_VAL_1_STR;
722 case VMCS_CR3_TGT_VAL_2:
723 return VMCS_CR3_TGT_VAL_2_STR;
724 case VMCS_CR3_TGT_VAL_3:
725 return VMCS_CR3_TGT_VAL_3_STR;
727 return VMCS_EXIT_QUAL_STR;
729 return VMCS_IO_RCX_STR;
731 return VMCS_IO_RSI_STR;
733 return VMCS_IO_RDI_STR;
735 return VMCS_IO_RIP_STR;
736 case VMCS_GUEST_LINEAR_ADDR:
737 return VMCS_GUEST_LINEAR_ADDR_STR;
739 return VMCS_GUEST_CR0_STR;
741 return VMCS_GUEST_CR3_STR;
743 return VMCS_GUEST_CR4_STR;
744 case VMCS_GUEST_ES_BASE:
745 return VMCS_GUEST_ES_BASE_STR;
746 case VMCS_GUEST_CS_BASE:
747 return VMCS_GUEST_CS_BASE_STR;
748 case VMCS_GUEST_SS_BASE:
749 return VMCS_GUEST_SS_BASE_STR;
750 case VMCS_GUEST_DS_BASE:
751 return VMCS_GUEST_DS_BASE_STR;
752 case VMCS_GUEST_FS_BASE:
753 return VMCS_GUEST_FS_BASE_STR;
754 case VMCS_GUEST_GS_BASE:
755 return VMCS_GUEST_GS_BASE_STR;
756 case VMCS_GUEST_LDTR_BASE:
757 return VMCS_GUEST_LDTR_BASE_STR;
758 case VMCS_GUEST_TR_BASE:
759 return VMCS_GUEST_TR_BASE_STR;
760 case VMCS_GUEST_GDTR_BASE:
761 return VMCS_GUEST_GDTR_BASE_STR;
762 case VMCS_GUEST_IDTR_BASE:
763 return VMCS_GUEST_IDTR_BASE_STR;
765 return VMCS_GUEST_DR7_STR;
767 return VMCS_GUEST_RSP_STR;
769 return VMCS_GUEST_RIP_STR;
770 case VMCS_GUEST_RFLAGS:
771 return VMCS_GUEST_RFLAGS_STR;
772 case VMCS_GUEST_PENDING_DBG_EXCP:
773 return VMCS_GUEST_PENDING_DBG_EXCP_STR;
774 case VMCS_GUEST_SYSENTER_ESP:
775 return VMCS_GUEST_SYSENTER_ESP_STR;
776 case VMCS_GUEST_SYSENTER_EIP:
777 return VMCS_GUEST_SYSENTER_EIP_STR;
779 return VMCS_HOST_CR0_STR;
781 return VMCS_HOST_CR3_STR;
783 return VMCS_HOST_CR4_STR;
784 case VMCS_HOST_FS_BASE:
785 return VMCS_HOST_FS_BASE_STR;
786 case VMCS_HOST_GS_BASE:
787 return VMCS_HOST_GS_BASE_STR;
788 case VMCS_HOST_TR_BASE:
789 return VMCS_HOST_TR_BASE_STR;
790 case VMCS_HOST_GDTR_BASE:
791 return VMCS_HOST_GDTR_BASE_STR;
792 case VMCS_HOST_IDTR_BASE:
793 return VMCS_HOST_IDTR_BASE_STR;
794 case VMCS_HOST_SYSENTER_ESP:
795 return VMCS_HOST_SYSENTER_ESP_STR;
796 case VMCS_HOST_SYSENTER_EIP:
797 return VMCS_HOST_SYSENTER_EIP_STR;
799 return VMCS_HOST_RSP_STR;
801 return VMCS_HOST_RIP_STR;