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 * 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", vmcs_field_to_str(vmcs_index), (uint16_t)val);
44 } else if (len == 4) {
45 PrintDebug("%s: %x\n", vmcs_field_to_str(vmcs_index), (uint32_t)val);
46 } else if (len == 8) {
47 PrintDebug("%s: %p\n", vmcs_field_to_str(vmcs_index), (void *)(addr_t)val);
52 static inline void print_vmcs_segments() {
60 void print_debug_vmcs_load_guest() {
61 const int wordsize = sizeof(addr_t);
63 struct vmcs_segment_access tmp_seg;
65 PrintDebug("\n====== Loading Guest State ======\n");
66 PRINT_VMREAD("Guest CR0: %x\n", GUEST_CR0, wordsize);
67 PRINT_VMREAD("Guest CR3: %x\n", GUEST_CR3, wordsize);
68 PRINT_VMREAD("Guest CR4: %x\n", GUEST_CR4, wordsize);
69 PRINT_VMREAD("Guest DR7: %x\n", GUEST_DR7, wordsize);
71 READ_VMCS_SEG(&tmp_seg,CS,wordsize);
72 print_vmcs_segment("CS", &tmp_seg);
74 READ_VMCS_SEG(&tmp_seg,SS,wordsize);
75 print_vmcs_segment("SS", &tmp_seg);
77 READ_VMCS_SEG(&tmp,DS,wordsize);
78 print_vmcs_segment("DS", &tmp_seg);
80 READ_VMCS_SEG(&tmp_seg,ES,wordsize);
81 print_vmcs_segment("ES", &tmp_seg);
83 READ_VMCS_SEG(&tmp_seg,FS,wordsize);
84 print_vmcs_segment("FS", &tmp_seg);
86 READ_VMCS_SEG(&tmp_seg,GS,wordsize);
87 print_vmcs_segment("GS", &tmp_seg);
89 READ_VMCS_SEG(&tmp_seg,TR,wordsize);
90 print_vmcs_segment("TR", &tmp_seg);
92 READ_VMCS_SEG(&tmp_seg,LDTR,wordsize);
93 print_vmcs_segment("LDTR", &tmp_seg);
95 PrintDebug("\n==GDTR==\n");
96 PRINT_VMREAD("GDTR Base: %x\n", GUEST_GDTR_BASE, wordsize);
97 PRINT_VMREAD("GDTR Limit: %x\n", GUEST_GDTR_LIMIT, 32);
100 PrintDebug("\n==LDTR==\n");
101 PRINT_VMREAD("LDTR Base: %x\n", GUEST_LDTR_BASE, wordsize);
102 PRINT_VMREAD("LDTR Limit: %x\n", GUEST_LDTR_LIMIT, 32);
103 PrintDebug("=====\n");
105 PRINT_VMREAD("Guest RSP: %x\n", GUEST_RSP, wordsize);
106 PRINT_VMREAD("Guest RIP: %x\n", GUEST_RIP, wordsize);
107 PRINT_VMREAD("Guest RFLAGS: %x\n", GUEST_RFLAGS, wordsize);
108 PRINT_VMREAD("Guest Activity state: %x\n", GUEST_ACTIVITY_STATE, 32);
109 PRINT_VMREAD("Guest Interruptibility state: %x\n", GUEST_INT_STATE, 32);
110 PRINT_VMREAD("Guest pending debug: %x\n", GUEST_PENDING_DEBUG_EXCS, wordsize);
112 PRINT_VMREAD("IA32_DEBUGCTL: %x\n", GUEST_IA32_DEBUGCTL, 64);
113 PRINT_VMREAD("IA32_SYSENTER_CS: %x\n", GUEST_IA32_SYSENTER_CS, 32);
114 PRINT_VMREAD("IA32_SYSTENTER_ESP: %x\n", GUEST_IA32_SYSENTER_ESP, wordsize);
115 PRINT_VMREAD("IA32_SYSTENTER_EIP: %x\n", GUEST_IA32_SYSENTER_EIP, wordsize);
116 PRINT_VMREAD("IA32_PERF_GLOBAL_CTRL: %x\n", GUEST_IA32_PERF_GLOBAL_CTRL, wordsize);
117 PRINT_VMREAD("VMCS Link Ptr: %x\n", VMCS_LINK_PTR, 64);
118 // TODO: Maybe add VMX preemption timer and PDTE (Intel 20-8 Vol. 3b)
121 void print_debug_load_host() {
122 const int wordsize = sizeof(addr_t);
124 vmcs_segment tmp_seg;
126 PrintDebug("\n====== Host State ========\n");
127 PRINT_VMREAD("Host CR0: %x\n", HOST_CR0, wordsize);
128 PRINT_VMREAD("Host CR3: %x\n", HOST_CR3, wordsize);
129 PRINT_VMREAD("Host CR4: %x\n", HOST_CR4, wordsize);
130 PRINT_VMREAD("Host RSP: %x\n", HOST_RSP, wordsize);
131 PRINT_VMREAD("Host RIP: %x\n", HOST_RIP, wordsize);
132 PRINT_VMREAD("IA32_SYSENTER_CS: %x\n", HOST_IA32_SYSENTER_CS, 32);
133 PRINT_VMREAD("IA32_SYSENTER_ESP: %x\n", HOST_IA32_SYSENTER_ESP, wordsize);
134 PRINT_VMREAD("IA32_SYSENTER_EIP: %x\n", HOST_IA32_SYSENTER_EIP, wordsize);
136 PRINT_VMREAD("Host CS Selector: %x\n", HOST_CS_SELECTOR, 16);
137 PRINT_VMREAD("Host SS Selector: %x\n", HOST_SS_SELECTOR, 16);
138 PRINT_VMREAD("Host DS Selector: %x\n", HOST_DS_SELECTOR, 16);
139 PRINT_VMREAD("Host ES Selector: %x\n", HOST_ES_SELECTOR, 16);
140 PRINT_VMREAD("Host FS Selector: %x\n", HOST_FS_SELECTOR, 16);
141 PRINT_VMREAD("Host GS Selector: %x\n", HOST_GS_SELECTOR, 16);
142 PRINT_VMREAD("Host TR Selector: %x\n", HOST_TR_SELECTOR, 16);
144 PRINT_VMREAD("Host FS Base: %x\n", HOST_FS_BASE, wordsize);
145 PRINT_VMREAD("Host GS Base: %x\n", HOST_GS_BASE, wordsize);
146 PRINT_VMREAD("Host TR Base: %x\n", HOST_TR_BASE, wordsize);
147 PRINT_VMREAD("Host GDTR Base: %x\n", HOST_GDTR_BASE, wordsize);
148 PRINT_VMREAD("Host IDTR Base: %x\n", HOSE_IDTR_BASE, wordsize);
151 void print_vmcs_segment(char * name, vmcs_segment* seg)
153 PrintDebug("\n==VMCS %s Segment==\n",name);
154 PrintDebug("\tSelector: %x\n", seg->selector);
155 PrintDebug("\tBase Address: %x\n", seg->baseAddr);
156 PrintDebug("\tLimit: %x\n", seg->limit);
157 PrintDebug("\tAccess: %x\n", seg->access);
161 * Returns the field length in bytes
163 int v3_vmcs_get_field_len(vmcs_field_t field) {
165 /* 16 bit Control Fields */
166 case VMCS_GUEST_ES_SELECTOR:
167 case VMCS_GUEST_CS_SELECTOR:
168 case VMCS_GUEST_SS_SELECTOR:
169 case VMCS_GUEST_DS_SELECTOR:
170 case VMCS_GUEST_FS_SELECTOR:
171 case VMCS_GUEST_GS_SELECTOR:
172 case VMCS_GUEST_LDTR_SELECTOR:
173 case VMCS_GUEST_TR_SELECTOR:
174 case VMCS_HOST_ES_SELECTOR:
175 case VMCS_HOST_CS_SELECTOR:
176 case VMCS_HOST_SS_SELECTOR:
177 case VMCS_HOST_DS_SELECTOR:
178 case VMCS_HOST_FS_SELECTOR:
179 case VMCS_HOST_GS_SELECTOR:
180 case VMCS_HOST_TR_SELECTOR:
183 /* 32 bit Control Fields */
185 case VMCS_PROC_CTRLS:
186 case VMCS_EXCP_BITMAP:
187 case VMCS_PG_FAULT_ERR_MASK:
188 case VMCS_PG_FAULT_ERR_MATCH:
189 case VMCS_CR3_TGT_CNT:
190 case VMCS_EXIT_CTRLS:
191 case VMCS_EXIT_MSR_STORE_CNT:
192 case VMCS_EXIT_MSR_LOAD_CNT:
193 case VMCS_ENTRY_CTRLS:
194 case VMCS_ENTRY_MSR_LOAD_CNT:
195 case VMCS_ENTRY_INT_INFO:
196 case VMCS_ENTRY_EXCP_ERR:
197 case VMCS_ENTRY_INSTR_LEN:
198 case VMCS_TPR_THRESHOLD:
200 case VMCS_EXIT_REASON:
201 case VMCS_EXIT_INT_INFO:
202 case VMCS_EXIT_INT_ERR:
203 case VMCS_IDT_VECTOR_INFO:
204 case VMCS_IDT_VECTOR_ERR:
205 case VMCS_EXIT_INSTR_LEN:
206 case VMCS_VMX_INSTR_INFO:
207 case VMCS_GUEST_ES_LIMIT:
208 case VMCS_GUEST_CS_LIMIT:
209 case VMCS_GUEST_SS_LIMIT:
210 case VMCS_GUEST_DS_LIMIT:
211 case VMCS_GUEST_FS_LIMIT:
212 case VMCS_GUEST_GS_LIMIT:
213 case VMCS_GUEST_LDTR_LIMIT:
214 case VMCS_GUEST_TR_LIMIT:
215 case VMCS_GUEST_GDTR_LIMIT:
216 case VMCS_GUEST_IDTR_LIMIT:
217 case VMCS_GUEST_ES_ACCESS:
218 case VMCS_GUEST_CS_ACCESS:
219 case VMCS_GUEST_SS_ACCESS:
220 case VMCS_GUEST_DS_ACCESS:
221 case VMCS_GUEST_FS_ACCESS:
222 case VMCS_GUEST_GS_ACCESS:
223 case VMCS_GUEST_LDTR_ACCESS:
224 case VMCS_GUEST_TR_ACCESS:
225 case VMCS_GUEST_INT_STATE:
226 case VMCS_GUEST_ACTIVITY_STATE:
227 case VMCS_GUEST_SMBASE:
228 case VMCS_GUEST_SYSENTER_CS:
229 case VMCS_HOST_SYSENTER_CS:
233 /* high bits of variable width fields
234 * We can probably just delete most of these....
236 case VMCS_IO_BITMAP_A_ADDR_HIGH:
237 case VMCS_IO_BITMAP_B_ADDR_HIGH:
238 case VMCS_MSR_BITMAP_HIGH:
239 case VMCS_EXIT_MSR_STORE_ADDR_HIGH:
240 case VMCS_EXIT_MSR_LOAD_ADDR_HIGH:
241 case VMCS_ENTRY_MSR_LOAD_ADDR_HIGH:
242 case VMCS_EXEC_PTR_HIGH:
243 case VMCS_TSC_OFFSET_HIGH:
244 case VMCS_VAPIC_ADDR_HIGH:
245 case VMCS_LINK_PTR_HIGH:
246 case VMCS_GUEST_DBG_CTL_HIGH:
247 case VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH:
250 /* Natural Width Control Fields */
251 case VMCS_IO_BITMAP_A_ADDR:
252 case VMCS_IO_BITMAP_B_ADDR:
253 case VMCS_MSR_BITMAP:
254 case VMCS_EXIT_MSR_STORE_ADDR:
255 case VMCS_EXIT_MSR_LOAD_ADDR:
256 case VMCS_ENTRY_MSR_LOAD_ADDR:
258 case VMCS_TSC_OFFSET:
259 case VMCS_VAPIC_ADDR:
261 case VMCS_GUEST_DBG_CTL:
262 case VMCS_GUEST_PERF_GLOBAL_CTRL:
265 case VMCS_CR0_READ_SHDW:
266 case VMCS_CR4_READ_SHDW:
267 case VMCS_CR3_TGT_VAL_0:
268 case VMCS_CR3_TGT_VAL_1:
269 case VMCS_CR3_TGT_VAL_2:
270 case VMCS_CR3_TGT_VAL_3:
276 case VMCS_GUEST_LINEAR_ADDR:
280 case VMCS_GUEST_ES_BASE:
281 case VMCS_GUEST_CS_BASE:
282 case VMCS_GUEST_SS_BASE:
283 case VMCS_GUEST_DS_BASE:
284 case VMCS_GUEST_FS_BASE:
285 case VMCS_GUEST_GS_BASE:
286 case VMCS_GUEST_LDTR_BASE:
287 case VMCS_GUEST_TR_BASE:
288 case VMCS_GUEST_GDTR_BASE:
289 case VMCS_GUEST_IDTR_BASE:
293 case VMCS_GUEST_RFLAGS:
294 case VMCS_GUEST_PENDING_DBG_EXCP:
295 case VMCS_GUEST_SYSENTER_ESP:
296 case VMCS_GUEST_SYSENTER_EIP:
300 case VMCS_HOST_FS_BASE:
301 case VMCS_HOST_GS_BASE:
302 case VMCS_HOST_TR_BASE:
303 case VMCS_HOST_GDTR_BASE:
304 case VMCS_HOST_IDTR_BASE:
305 case VMCS_HOST_SYSENTER_ESP:
306 case VMCS_HOST_SYSENTER_EIP:
309 return sizeof(addr_t);
312 PrintError("Invalid VMCS field\n");
328 static const char VMCS_GUEST_ES_SELECTOR_STR[] = "GUEST_ES_SELECTOR";
329 static const char VMCS_GUEST_CS_SELECTOR_STR[] = "GUEST_CS_SELECTOR";
330 static const char VMCS_GUEST_SS_SELECTOR_STR[] = "GUEST_SS_SELECTOR";
331 static const char VMCS_GUEST_DS_SELECTOR_STR[] = "GUEST_DS_SELECTOR";
332 static const char VMCS_GUEST_FS_SELECTOR_STR[] = "GUEST_FS_SELECTOR";
333 static const char VMCS_GUEST_GS_SELECTOR_STR[] = "GUEST_GS_SELECTOR";
334 static const char VMCS_GUEST_LDTR_SELECTOR_STR[] = "GUEST_LDTR_SELECTOR";
335 static const char VMCS_GUEST_TR_SELECTOR_STR[] = "GUEST_TR_SELECTOR";
336 static const char VMCS_HOST_ES_SELECTOR_STR[] = "HOST_ES_SELECTOR";
337 static const char VMCS_HOST_CS_SELECTOR_STR[] = "HOST_CS_SELECTOR";
338 static const char VMCS_HOST_SS_SELECTOR_STR[] = "HOST_SS_SELECTOR";
339 static const char VMCS_HOST_DS_SELECTOR_STR[] = "HOST_DS_SELECTOR";
340 static const char VMCS_HOST_FS_SELECTOR_STR[] = "HOST_FS_SELECTOR";
341 static const char VMCS_HOST_GS_SELECTOR_STR[] = "HOST_GS_SELECTOR";
342 static const char VMCS_HOST_TR_SELECTOR_STR[] = "HOST_TR_SELECTOR";
343 static const char VMCS_IO_BITMAP_A_ADDR_STR[] = "IO_BITMAP_A_ADDR";
344 static const char VMCS_IO_BITMAP_A_ADDR_HIGH_STR[] = "IO_BITMAP_A_ADDR_HIGH";
345 static const char VMCS_IO_BITMAP_B_ADDR_STR[] = "IO_BITMAP_B_ADDR";
346 static const char VMCS_IO_BITMAP_B_ADDR_HIGH_STR[] = "IO_BITMAP_B_ADDR_HIGH";
347 static const char VMCS_MSR_BITMAP_STR[] = "MSR_BITMAPS";
348 static const char VMCS_MSR_BITMAP_HIGH_STR[] = "MSR_BITMAPS_HIGH";
349 static const char VMCS_EXIT_MSR_STORE_ADDR_STR[] = "EXIT_MSR_STORE_ADDR";
350 static const char VMCS_EXIT_MSR_STORE_ADDR_HIGH_STR[] = "EXIT_MSR_STORE_ADDR_HIGH";
351 static const char VMCS_EXIT_MSR_LOAD_ADDR_STR[] = "EXIT_MSR_LOAD_ADDR";
352 static const char VMCS_EXIT_MSR_LOAD_ADDR_HIGH_STR[] = "EXIT_MSR_LOAD_ADDR_HIGH";
353 static const char VMCS_ENTRY_MSR_LOAD_ADDR_STR[] = "ENTRY_MSR_LOAD_ADDR";
354 static const char VMCS_ENTRY_MSR_LOAD_ADDR_HIGH_STR[] = "ENTRY_MSR_LOAD_ADDR_HIGH";
355 static const char VMCS_EXEC_PTR_STR[] = "VMCS_EXEC_PTR";
356 static const char VMCS_EXEC_PTR_HIGH_STR[] = "VMCS_EXEC_PTR_HIGH";
357 static const char VMCS_TSC_OFFSET_STR[] = "TSC_OFFSET";
358 static const char VMCS_TSC_OFFSET_HIGH_STR[] = "TSC_OFFSET_HIGH";
359 static const char VMCS_VAPIC_ADDR_STR[] = "VAPIC_PAGE_ADDR";
360 static const char VMCS_VAPIC_ADDR_HIGH_STR[] = "VAPIC_PAGE_ADDR_HIGH";
361 static const char VMCS_LINK_PTR_STR[] = "VMCS_LINK_PTR";
362 static const char VMCS_LINK_PTR_HIGH_STR[] = "VMCS_LINK_PTR_HIGH";
363 static const char VMCS_GUEST_DBG_CTL_STR[] = "GUEST_DEBUG_CTL";
364 static const char VMCS_GUEST_DBG_CTL_HIGH_STR[] = "GUEST_DEBUG_CTL_HIGH";
365 static const char VMCS_GUEST_PERF_GLOBAL_CTRL_STR[] = "GUEST_PERF_GLOBAL_CTRL";
366 static const char VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH_STR[] = "GUEST_PERF_GLOBAL_CTRL_HIGH";
367 static const char VMCS_PIN_CTRLS_STR[] = "PIN_VM_EXEC_CTRLS";
368 static const char VMCS_PROC_CTRLS_STR[] = "PROC_VM_EXEC_CTRLS";
369 static const char VMCS_EXCP_BITMAP_STR[] = "EXCEPTION_BITMAP";
370 static const char VMCS_PG_FAULT_ERR_MASK_STR[] = "PAGE_FAULT_ERROR_MASK";
371 static const char VMCS_PG_FAULT_ERR_MATCH_STR[] = "PAGE_FAULT_ERROR_MATCH";
372 static const char VMCS_CR3_TGT_CNT_STR[] = "CR3_TARGET_COUNT";
373 static const char VMCS_EXIT_CTRLS_STR[] = "VM_EXIT_CTRLS";
374 static const char VMCS_EXIT_MSR_STORE_CNT_STR[] = "VM_EXIT_MSR_STORE_COUNT";
375 static const char VMCS_EXIT_MSR_LOAD_CNT_STR[] = "VM_EXIT_MSR_LOAD_COUNT";
376 static const char VMCS_ENTRY_CTRLS_STR[] = "VM_ENTRY_CTRLS";
377 static const char VMCS_ENTRY_MSR_LOAD_CNT_STR[] = "VM_ENTRY_MSR_LOAD_COUNT";
378 static const char VMCS_ENTRY_INT_INFO_STR[] = "VM_ENTRY_INT_INFO_FIELD";
379 static const char VMCS_ENTRY_EXCP_ERR_STR[] = "VM_ENTRY_EXCEPTION_ERROR";
380 static const char VMCS_ENTRY_INSTR_LEN_STR[] = "VM_ENTRY_INSTR_LENGTH";
381 static const char VMCS_TPR_THRESHOLD_STR[] = "TPR_THRESHOLD";
382 static const char VMCS_INSTR_ERR_STR[] = "VM_INSTR_ERROR";
383 static const char VMCS_EXIT_REASON_STR[] = "EXIT_REASON";
384 static const char VMCS_EXIT_INT_INFO_STR[] = "VM_EXIT_INT_INFO";
385 static const char VMCS_EXIT_INT_ERR_STR[] = "VM_EXIT_INT_ERROR";
386 static const char VMCS_IDT_VECTOR_INFO_STR[] = "IDT_VECTOR_INFO";
387 static const char VMCS_IDT_VECTOR_ERR_STR[] = "IDT_VECTOR_ERROR";
388 static const char VMCS_EXIT_INSTR_LEN_STR[] = "VM_EXIT_INSTR_LENGTH";
389 static const char VMCS_VMX_INSTR_INFO_STR[] = "VMX_INSTR_INFO";
390 static const char VMCS_GUEST_ES_LIMIT_STR[] = "GUEST_ES_LIMIT";
391 static const char VMCS_GUEST_CS_LIMIT_STR[] = "GUEST_CS_LIMIT";
392 static const char VMCS_GUEST_SS_LIMIT_STR[] = "GUEST_SS_LIMIT";
393 static const char VMCS_GUEST_DS_LIMIT_STR[] = "GUEST_DS_LIMIT";
394 static const char VMCS_GUEST_FS_LIMIT_STR[] = "GUEST_FS_LIMIT";
395 static const char VMCS_GUEST_GS_LIMIT_STR[] = "GUEST_GS_LIMIT";
396 static const char VMCS_GUEST_LDTR_LIMIT_STR[] = "GUEST_LDTR_LIMIT";
397 static const char VMCS_GUEST_TR_LIMIT_STR[] = "GUEST_TR_LIMIT";
398 static const char VMCS_GUEST_GDTR_LIMIT_STR[] = "GUEST_GDTR_LIMIT";
399 static const char VMCS_GUEST_IDTR_LIMIT_STR[] = "GUEST_IDTR_LIMIT";
400 static const char VMCS_GUEST_ES_ACCESS_STR[] = "GUEST_ES_ACCESS";
401 static const char VMCS_GUEST_CS_ACCESS_STR[] = "GUEST_CS_ACCESS";
402 static const char VMCS_GUEST_SS_ACCESS_STR[] = "GUEST_SS_ACCESS";
403 static const char VMCS_GUEST_DS_ACCESS_STR[] = "GUEST_DS_ACCESS";
404 static const char VMCS_GUEST_FS_ACCESS_STR[] = "GUEST_FS_ACCESS";
405 static const char VMCS_GUEST_GS_ACCESS_STR[] = "GUEST_GS_ACCESS";
406 static const char VMCS_GUEST_LDTR_ACCESS_STR[] = "GUEST_LDTR_ACCESS";
407 static const char VMCS_GUEST_TR_ACCESS_STR[] = "GUEST_TR_ACCESS";
408 static const char VMCS_GUEST_INT_STATE_STR[] = "GUEST_INT_STATE";
409 static const char VMCS_GUEST_ACTIVITY_STATE_STR[] = "GUEST_ACTIVITY_STATE";
410 static const char VMCS_GUEST_SMBASE_STR[] = "GUEST_SMBASE";
411 static const char VMCS_GUEST_SYSENTER_CS_STR[] = "GUEST_SYSENTER_CS";
412 static const char VMCS_HOST_SYSENTER_CS_STR[] = "HOST_SYSENTER_CS";
413 static const char VMCS_CR0_MASK_STR[] = "CR0_GUEST_HOST_MASK";
414 static const char VMCS_CR4_MASK_STR[] = "CR4_GUEST_HOST_MASK";
415 static const char VMCS_CR0_READ_SHDW_STR[] = "CR0_READ_SHADOW";
416 static const char VMCS_CR4_READ_SHDW_STR[] = "CR4_READ_SHADOW";
417 static const char VMCS_CR3_TGT_VAL_0_STR[] = "CR3_TARGET_VALUE_0";
418 static const char VMCS_CR3_TGT_VAL_1_STR[] = "CR3_TARGET_VALUE_1";
419 static const char VMCS_CR3_TGT_VAL_2_STR[] = "CR3_TARGET_VALUE_2";
420 static const char VMCS_CR3_TGT_VAL_3_STR[] = "CR3_TARGET_VALUE_3";
421 static const char VMCS_EXIT_QUAL_STR[] = "EXIT_QUALIFICATION";
422 static const char VMCS_IO_RCX_STR[] = "IO_RCX";
423 static const char VMCS_IO_RSI_STR[] = "IO_RSI";
424 static const char VMCS_IO_RDI_STR[] = "IO_RDI";
425 static const char VMCS_IO_RIP_STR[] = "IO_RIP";
426 static const char VMCS_GUEST_LINEAR_ADDR_STR[] = "GUEST_LINEAR_ADDR";
427 static const char VMCS_GUEST_CR0_STR[] = "GUEST_CR0";
428 static const char VMCS_GUEST_CR3_STR[] = "GUEST_CR3";
429 static const char VMCS_GUEST_CR4_STR[] = "GUEST_CR4";
430 static const char VMCS_GUEST_ES_BASE_STR[] = "GUEST_ES_BASE";
431 static const char VMCS_GUEST_CS_BASE_STR[] = "GUEST_CS_BASE";
432 static const char VMCS_GUEST_SS_BASE_STR[] = "GUEST_SS_BASE";
433 static const char VMCS_GUEST_DS_BASE_STR[] = "GUEST_DS_BASE";
434 static const char VMCS_GUEST_FS_BASE_STR[] = "GUEST_FS_BASE";
435 static const char VMCS_GUEST_GS_BASE_STR[] = "GUEST_GS_BASE";
436 static const char VMCS_GUEST_LDTR_BASE_STR[] = "GUEST_LDTR_BASE";
437 static const char VMCS_GUEST_TR_BASE_STR[] = "GUEST_TR_BASE";
438 static const char VMCS_GUEST_GDTR_BASE_STR[] = "GUEST_GDTR_BASE";
439 static const char VMCS_GUEST_IDTR_BASE_STR[] = "GUEST_IDTR_BASE";
440 static const char VMCS_GUEST_DR7_STR[] = "GUEST_DR7";
441 static const char VMCS_GUEST_RSP_STR[] = "GUEST_RSP";
442 static const char VMCS_GUEST_RIP_STR[] = "GUEST_RIP";
443 static const char VMCS_GUEST_RFLAGS_STR[] = "GUEST_RFLAGS";
444 static const char VMCS_GUEST_PENDING_DBG_EXCP_STR[] = "GUEST_PENDING_DEBUG_EXCS";
445 static const char VMCS_GUEST_SYSENTER_ESP_STR[] = "GUEST_SYSENTER_ESP";
446 static const char VMCS_GUEST_SYSENTER_EIP_STR[] = "GUEST_SYSENTER_EIP";
447 static const char VMCS_HOST_CR0_STR[] = "HOST_CR0";
448 static const char VMCS_HOST_CR3_STR[] = "HOST_CR3";
449 static const char VMCS_HOST_CR4_STR[] = "HOST_CR4";
450 static const char VMCS_HOST_FS_BASE_STR[] = "HOST_FS_BASE";
451 static const char VMCS_HOST_GS_BASE_STR[] = "HOST_GS_BASE";
452 static const char VMCS_HOST_TR_BASE_STR[] = "HOST_TR_BASE";
453 static const char VMCS_HOST_GDTR_BASE_STR[] = "HOST_GDTR_BASE";
454 static const char VMCS_HOST_IDTR_BASE_STR[] = "HOST_IDTR_BASE";
455 static const char VMCS_HOST_SYSENTER_ESP_STR[] = "HOST_SYSENTER_ESP";
456 static const char VMCS_HOST_SYSENTER_EIP_STR[] = "HOST_SYSENTER_EIP";
457 static const char VMCS_HOST_RSP_STR[] = "HOST_RSP";
458 static const char VMCS_HOST_RIP_STR[] = "HOST_RIP";
462 static const char * vmcs_field_to_str(vmcs_field_t field) {
464 case VMCS_GUEST_ES_SELECTOR:
465 return VMCS_GUEST_ES_SELECTOR_STR;
466 case VMCS_GUEST_CS_SELECTOR:
467 return VMCS_GUEST_CS_SELECTOR_STR;
468 case VMCS_GUEST_SS_SELECTOR:
469 return VMCS_GUEST_SS_SELECTOR_STR;
470 case VMCS_GUEST_DS_SELECTOR:
471 return VMCS_GUEST_DS_SELECTOR_STR;
472 case VMCS_GUEST_FS_SELECTOR:
473 return VMCS_GUEST_FS_SELECTOR_STR;
474 case VMCS_GUEST_GS_SELECTOR:
475 return VMCS_GUEST_GS_SELECTOR_STR;
476 case VMCS_GUEST_LDTR_SELECTOR:
477 return VMCS_GUEST_LDTR_SELECTOR_STR;
478 case VMCS_GUEST_TR_SELECTOR:
479 return VMCS_GUEST_TR_SELECTOR_STR;
480 case VMCS_HOST_ES_SELECTOR:
481 return VMCS_HOST_ES_SELECTOR_STR;
482 case VMCS_HOST_CS_SELECTOR:
483 return VMCS_HOST_CS_SELECTOR_STR;
484 case VMCS_HOST_SS_SELECTOR:
485 return VMCS_HOST_SS_SELECTOR_STR;
486 case VMCS_HOST_DS_SELECTOR:
487 return VMCS_HOST_DS_SELECTOR_STR;
488 case VMCS_HOST_FS_SELECTOR:
489 return VMCS_HOST_FS_SELECTOR_STR;
490 case VMCS_HOST_GS_SELECTOR:
491 return VMCS_HOST_GS_SELECTOR_STR;
492 case VMCS_HOST_TR_SELECTOR:
493 return VMCS_HOST_TR_SELECTOR_STR;
494 case VMCS_IO_BITMAP_A_ADDR:
495 return VMCS_IO_BITMAP_A_ADDR_STR;
496 case VMCS_IO_BITMAP_A_ADDR_HIGH:
497 return VMCS_IO_BITMAP_A_ADDR_HIGH_STR;
498 case VMCS_IO_BITMAP_B_ADDR:
499 return VMCS_IO_BITMAP_B_ADDR_STR;
500 case VMCS_IO_BITMAP_B_ADDR_HIGH:
501 return VMCS_IO_BITMAP_B_ADDR_HIGH_STR;
502 case VMCS_MSR_BITMAP:
503 return VMCS_MSR_BITMAP_STR;
504 case VMCS_MSR_BITMAP_HIGH:
505 return VMCS_MSR_BITMAP_HIGH_STR;
506 case VMCS_EXIT_MSR_STORE_ADDR:
507 return VMCS_EXIT_MSR_STORE_ADDR_STR;
508 case VMCS_EXIT_MSR_STORE_ADDR_HIGH:
509 return VMCS_EXIT_MSR_STORE_ADDR_HIGH_STR;
510 case VMCS_EXIT_MSR_LOAD_ADDR:
511 return VMCS_EXIT_MSR_LOAD_ADDR_STR;
512 case VMCS_EXIT_MSR_LOAD_ADDR_HIGH:
513 return VMCS_EXIT_MSR_LOAD_ADDR_HIGH_STR;
514 case VMCS_ENTRY_MSR_LOAD_ADDR:
515 return VMCS_ENTRY_MSR_LOAD_ADDR_STR;
516 case VMCS_ENTRY_MSR_LOAD_ADDR_HIGH:
517 return VMCS_ENTRY_MSR_LOAD_ADDR_HIGH_STR;
519 return VMCS_EXEC_PTR_STR;
520 case VMCS_EXEC_PTR_HIGH:
521 return VMCS_EXEC_PTR_HIGH_STR;
522 case VMCS_TSC_OFFSET:
523 return VMCS_TSC_OFFSET_STR;
524 case VMCS_TSC_OFFSET_HIGH:
525 return VMCS_TSC_OFFSET_HIGH_STR;
526 case VMCS_VAPIC_ADDR:
527 return VMCS_VAPIC_ADDR_STR;
528 case VMCS_VAPIC_ADDR_HIGH:
529 return VMCS_VAPIC_ADDR_HIGH_STR;
531 return VMCS_LINK_PTR_STR;
532 case VMCS_LINK_PTR_HIGH:
533 return VMCS_LINK_PTR_HIGH_STR;
534 case VMCS_GUEST_DBG_CTL:
535 return VMCS_GUEST_DBG_CTL_STR;
536 case VMCS_GUEST_DBG_CTL_HIGH:
537 return VMCS_GUEST_DBG_CTL_HIGH_STR;
538 case VMCS_GUEST_PERF_GLOBAL_CTRL:
539 return VMCS_GUEST_PERF_GLOBAL_CTRL_STR;
540 case VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH:
541 return VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH_STR;
543 return VMCS_PIN_CTRLS_STR;
544 case VMCS_PROC_CTRLS:
545 return VMCS_PROC_CTRLS_STR;
546 case VMCS_EXCP_BITMAP:
547 return VMCS_EXCP_BITMAP_STR;
548 case VMCS_PG_FAULT_ERR_MASK:
549 return VMCS_PG_FAULT_ERR_MASK_STR;
550 case VMCS_PG_FAULT_ERR_MATCH:
551 return VMCS_PG_FAULT_ERR_MATCH_STR;
552 case VMCS_CR3_TGT_CNT:
553 return VMCS_CR3_TGT_CNT_STR;
554 case VMCS_EXIT_CTRLS:
555 return VMCS_EXIT_CTRLS_STR;
556 case VMCS_EXIT_MSR_STORE_CNT:
557 return VMCS_EXIT_MSR_STORE_CNT_STR;
558 case VMCS_EXIT_MSR_LOAD_CNT:
559 return VMCS_EXIT_MSR_LOAD_CNT_STR;
560 case VMCS_ENTRY_CTRLS:
561 return VMCS_ENTRY_CTRLS_STR;
562 case VMCS_ENTRY_MSR_LOAD_CNT:
563 return VMCS_ENTRY_MSR_LOAD_CNT_STR;
564 case VMCS_ENTRY_INT_INFO:
565 return VMCS_ENTRY_INT_INFO_STR;
566 case VMCS_ENTRY_EXCP_ERR:
567 return VMCS_ENTRY_EXCP_ERR_STR;
568 case VMCS_ENTRY_INSTR_LEN:
569 return VMCS_ENTRY_INSTR_LEN_STR;
570 case VMCS_TPR_THRESHOLD:
571 return VMCS_TPR_THRESHOLD_STR;
573 return VMCS_INSTR_ERR_STR;
574 case VMCS_EXIT_REASON:
575 return VMCS_EXIT_REASON_STR;
576 case VMCS_EXIT_INT_INFO:
577 return VMCS_EXIT_INT_INFO_STR;
578 case VMCS_EXIT_INT_ERR:
579 return VMCS_EXIT_INT_ERR_STR;
580 case VMCS_IDT_VECTOR_INFO:
581 return VMCS_IDT_VECTOR_INFO_STR;
582 case VMCS_IDT_VECTOR_ERR:
583 return VMCS_IDT_VECTOR_ERR_STR;
584 case VMCS_EXIT_INSTR_LEN:
585 return VMCS_EXIT_INSTR_LEN_STR;
586 case VMCS_VMX_INSTR_INFO:
587 return VMCS_VMX_INSTR_INFO_STR;
588 case VMCS_GUEST_ES_LIMIT:
589 return VMCS_GUEST_ES_LIMIT_STR;
590 case VMCS_GUEST_CS_LIMIT:
591 return VMCS_GUEST_CS_LIMIT_STR;
592 case VMCS_GUEST_SS_LIMIT:
593 return VMCS_GUEST_SS_LIMIT_STR;
594 case VMCS_GUEST_DS_LIMIT:
595 return VMCS_GUEST_DS_LIMIT_STR;
596 case VMCS_GUEST_FS_LIMIT:
597 return VMCS_GUEST_FS_LIMIT_STR;
598 case VMCS_GUEST_GS_LIMIT:
599 return VMCS_GUEST_GS_LIMIT_STR;
600 case VMCS_GUEST_LDTR_LIMIT:
601 return VMCS_GUEST_LDTR_LIMIT_STR;
602 case VMCS_GUEST_TR_LIMIT:
603 return VMCS_GUEST_TR_LIMIT_STR;
604 case VMCS_GUEST_GDTR_LIMIT:
605 return VMCS_GUEST_GDTR_LIMIT_STR;
606 case VMCS_GUEST_IDTR_LIMIT:
607 return VMCS_GUEST_IDTR_LIMIT_STR;
608 case VMCS_GUEST_ES_ACCESS:
609 return VMCS_GUEST_ES_ACCESS_STR;
610 case VMCS_GUEST_CS_ACCESS:
611 return VMCS_GUEST_CS_ACCESS_STR;
612 case VMCS_GUEST_SS_ACCESS:
613 return VMCS_GUEST_SS_ACCESS_STR;
614 case VMCS_GUEST_DS_ACCESS:
615 return VMCS_GUEST_DS_ACCESS_STR;
616 case VMCS_GUEST_FS_ACCESS:
617 return VMCS_GUEST_FS_ACCESS_STR;
618 case VMCS_GUEST_GS_ACCESS:
619 return VMCS_GUEST_GS_ACCESS_STR;
620 case VMCS_GUEST_LDTR_ACCESS:
621 return VMCS_GUEST_LDTR_ACCESS_STR;
622 case VMCS_GUEST_TR_ACCESS:
623 return VMCS_GUEST_TR_ACCESS_STR;
624 case VMCS_GUEST_INT_STATE:
625 return VMCS_GUEST_INT_STATE_STR;
626 case VMCS_GUEST_ACTIVITY_STATE:
627 return VMCS_GUEST_ACTIVITY_STATE_STR;
628 case VMCS_GUEST_SMBASE:
629 return VMCS_GUEST_SMBASE_STR;
630 case VMCS_GUEST_SYSENTER_CS:
631 return VMCS_GUEST_SYSENTER_CS_STR;
632 case VMCS_HOST_SYSENTER_CS:
633 return VMCS_HOST_SYSENTER_CS_STR;
635 return VMCS_CR0_MASK_STR;
637 return VMCS_CR4_MASK_STR;
638 case VMCS_CR0_READ_SHDW:
639 return VMCS_CR0_READ_SHDW_STR;
640 case VMCS_CR4_READ_SHDW:
641 return VMCS_CR4_READ_SHDW_STR;
642 case VMCS_CR3_TGT_VAL_0:
643 return VMCS_CR3_TGT_VAL_0_STR;
644 case VMCS_CR3_TGT_VAL_1:
645 return VMCS_CR3_TGT_VAL_1_STR;
646 case VMCS_CR3_TGT_VAL_2:
647 return VMCS_CR3_TGT_VAL_2_STR;
648 case VMCS_CR3_TGT_VAL_3:
649 return VMCS_CR3_TGT_VAL_3_STR;
651 return VMCS_EXIT_QUAL_STR;
653 return VMCS_IO_RCX_STR;
655 return VMCS_IO_RSI_STR;
657 return VMCS_IO_RDI_STR;
659 return VMCS_IO_RIP_STR;
660 case VMCS_GUEST_LINEAR_ADDR:
661 return VMCS_GUEST_LINEAR_ADDR_STR;
663 return VMCS_GUEST_CR0_STR;
665 return VMCS_GUEST_CR3_STR;
667 return VMCS_GUEST_CR4_STR;
668 case VMCS_GUEST_ES_BASE:
669 return VMCS_GUEST_ES_BASE_STR;
670 case VMCS_GUEST_CS_BASE:
671 return VMCS_GUEST_CS_BASE_STR;
672 case VMCS_GUEST_SS_BASE:
673 return VMCS_GUEST_SS_BASE_STR;
674 case VMCS_GUEST_DS_BASE:
675 return VMCS_GUEST_DS_BASE_STR;
676 case VMCS_GUEST_FS_BASE:
677 return VMCS_GUEST_FS_BASE_STR;
678 case VMCS_GUEST_GS_BASE:
679 return VMCS_GUEST_GS_BASE_STR;
680 case VMCS_GUEST_LDTR_BASE:
681 return VMCS_GUEST_LDTR_BASE_STR;
682 case VMCS_GUEST_TR_BASE:
683 return VMCS_GUEST_TR_BASE_STR;
684 case VMCS_GUEST_GDTR_BASE:
685 return VMCS_GUEST_GDTR_BASE_STR;
686 case VMCS_GUEST_IDTR_BASE:
687 return VMCS_GUEST_IDTR_BASE_STR;
689 return VMCS_GUEST_DR7_STR;
691 return VMCS_GUEST_RSP_STR;
693 return VMCS_GUEST_RIP_STR;
694 case VMCS_GUEST_RFLAGS:
695 return VMCS_GUEST_RFLAGS_STR;
696 case VMCS_GUEST_PENDING_DBG_EXCP:
697 return VMCS_GUEST_PENDING_DBG_EXCP_STR;
698 case VMCS_GUEST_SYSENTER_ESP:
699 return VMCS_GUEST_SYSENTER_ESP_STR;
700 case VMCS_GUEST_SYSENTER_EIP:
701 return VMCS_GUEST_SYSENTER_EIP_STR;
703 return VMCS_HOST_CR0_STR;
705 return VMCS_HOST_CR3_STR;
707 return VMCS_HOST_CR4_STR;
708 case VMCS_HOST_FS_BASE:
709 return VMCS_HOST_FS_BASE_STR;
710 case VMCS_HOST_GS_BASE:
711 return VMCS_HOST_GS_BASE_STR;
712 case VMCS_HOST_TR_BASE:
713 return VMCS_HOST_TR_BASE_STR;
714 case VMCS_HOST_GDTR_BASE:
715 return VMCS_HOST_GDTR_BASE_STR;
716 case VMCS_HOST_IDTR_BASE:
717 return VMCS_HOST_IDTR_BASE_STR;
718 case VMCS_HOST_SYSENTER_ESP:
719 return VMCS_HOST_SYSENTER_ESP_STR;
720 case VMCS_HOST_SYSENTER_EIP:
721 return VMCS_HOST_SYSENTER_EIP_STR;
723 return VMCS_HOST_RSP_STR;
725 return VMCS_HOST_RIP_STR;