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);
135 void v3_print_vmcs_host_state()
137 PrintDebug("=== Control Fields===\n");
138 print_vmcs_field(VMCS_PIN_CTRLS);
139 print_vmcs_field(VMCS_PROC_CTRLS);
140 print_vmcs_field(VMCS_EXIT_CTRLS);
141 print_vmcs_field(VMCS_ENTRY_CTRLS);
142 print_vmcs_field(VMCS_EXCP_BITMAP);
145 print_vmcs_field(VMCS_HOST_CR0);
146 print_vmcs_field(VMCS_HOST_CR3);
147 print_vmcs_field(VMCS_HOST_CR4);
148 print_vmcs_field(VMCS_HOST_RSP);
149 print_vmcs_field(VMCS_HOST_RIP);
150 print_vmcs_field(VMCS_HOST_SYSENTER_CS);
151 print_vmcs_field(VMCS_HOST_SYSENTER_ESP);
152 print_vmcs_field(VMCS_HOST_SYSENTER_EIP);
154 PrintDebug("\n=== Segment Registers===\n");
155 PrintDebug("Selector:\n");
156 print_vmcs_field(VMCS_HOST_CS_SELECTOR);
157 print_vmcs_field(VMCS_HOST_SS_SELECTOR);
158 print_vmcs_field(VMCS_HOST_DS_SELECTOR);
159 print_vmcs_field(VMCS_HOST_ES_SELECTOR);
160 print_vmcs_field(VMCS_HOST_FS_SELECTOR);
161 print_vmcs_field(VMCS_HOST_GS_SELECTOR);
162 print_vmcs_field(VMCS_HOST_TR_SELECTOR);
164 PrintDebug("\nBase:\n");
165 print_vmcs_field(VMCS_HOST_FS_BASE);
166 print_vmcs_field(VMCS_HOST_GS_BASE);
167 print_vmcs_field(VMCS_HOST_TR_BASE);
168 print_vmcs_field(VMCS_HOST_GDTR_BASE);
169 print_vmcs_field(VMCS_HOST_IDTR_BASE);
175 * Returns the field length in bytes
177 int v3_vmcs_get_field_len(vmcs_field_t field) {
179 /* 16 bit Control Fields */
180 case VMCS_GUEST_ES_SELECTOR:
181 case VMCS_GUEST_CS_SELECTOR:
182 case VMCS_GUEST_SS_SELECTOR:
183 case VMCS_GUEST_DS_SELECTOR:
184 case VMCS_GUEST_FS_SELECTOR:
185 case VMCS_GUEST_GS_SELECTOR:
186 case VMCS_GUEST_LDTR_SELECTOR:
187 case VMCS_GUEST_TR_SELECTOR:
188 case VMCS_HOST_ES_SELECTOR:
189 case VMCS_HOST_CS_SELECTOR:
190 case VMCS_HOST_SS_SELECTOR:
191 case VMCS_HOST_DS_SELECTOR:
192 case VMCS_HOST_FS_SELECTOR:
193 case VMCS_HOST_GS_SELECTOR:
194 case VMCS_HOST_TR_SELECTOR:
197 /* 32 bit Control Fields */
199 case VMCS_PROC_CTRLS:
200 case VMCS_EXCP_BITMAP:
201 case VMCS_PG_FAULT_ERR_MASK:
202 case VMCS_PG_FAULT_ERR_MATCH:
203 case VMCS_CR3_TGT_CNT:
204 case VMCS_EXIT_CTRLS:
205 case VMCS_EXIT_MSR_STORE_CNT:
206 case VMCS_EXIT_MSR_LOAD_CNT:
207 case VMCS_ENTRY_CTRLS:
208 case VMCS_ENTRY_MSR_LOAD_CNT:
209 case VMCS_ENTRY_INT_INFO:
210 case VMCS_ENTRY_EXCP_ERR:
211 case VMCS_ENTRY_INSTR_LEN:
212 case VMCS_TPR_THRESHOLD:
214 case VMCS_EXIT_REASON:
215 case VMCS_EXIT_INT_INFO:
216 case VMCS_EXIT_INT_ERR:
217 case VMCS_IDT_VECTOR_INFO:
218 case VMCS_IDT_VECTOR_ERR:
219 case VMCS_EXIT_INSTR_LEN:
220 case VMCS_VMX_INSTR_INFO:
221 case VMCS_GUEST_ES_LIMIT:
222 case VMCS_GUEST_CS_LIMIT:
223 case VMCS_GUEST_SS_LIMIT:
224 case VMCS_GUEST_DS_LIMIT:
225 case VMCS_GUEST_FS_LIMIT:
226 case VMCS_GUEST_GS_LIMIT:
227 case VMCS_GUEST_LDTR_LIMIT:
228 case VMCS_GUEST_TR_LIMIT:
229 case VMCS_GUEST_GDTR_LIMIT:
230 case VMCS_GUEST_IDTR_LIMIT:
231 case VMCS_GUEST_ES_ACCESS:
232 case VMCS_GUEST_CS_ACCESS:
233 case VMCS_GUEST_SS_ACCESS:
234 case VMCS_GUEST_DS_ACCESS:
235 case VMCS_GUEST_FS_ACCESS:
236 case VMCS_GUEST_GS_ACCESS:
237 case VMCS_GUEST_LDTR_ACCESS:
238 case VMCS_GUEST_TR_ACCESS:
239 case VMCS_GUEST_INT_STATE:
240 case VMCS_GUEST_ACTIVITY_STATE:
241 case VMCS_GUEST_SMBASE:
242 case VMCS_GUEST_SYSENTER_CS:
243 case VMCS_HOST_SYSENTER_CS:
247 /* high bits of variable width fields
248 * We can probably just delete most of these....
250 case VMCS_IO_BITMAP_A_ADDR_HIGH:
251 case VMCS_IO_BITMAP_B_ADDR_HIGH:
252 case VMCS_MSR_BITMAP_HIGH:
253 case VMCS_EXIT_MSR_STORE_ADDR_HIGH:
254 case VMCS_EXIT_MSR_LOAD_ADDR_HIGH:
255 case VMCS_ENTRY_MSR_LOAD_ADDR_HIGH:
256 case VMCS_EXEC_PTR_HIGH:
257 case VMCS_TSC_OFFSET_HIGH:
258 case VMCS_VAPIC_ADDR_HIGH:
259 case VMCS_LINK_PTR_HIGH:
260 case VMCS_GUEST_DBG_CTL_HIGH:
261 case VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH:
264 /* Natural Width Control Fields */
265 case VMCS_IO_BITMAP_A_ADDR:
266 case VMCS_IO_BITMAP_B_ADDR:
267 case VMCS_MSR_BITMAP:
268 case VMCS_EXIT_MSR_STORE_ADDR:
269 case VMCS_EXIT_MSR_LOAD_ADDR:
270 case VMCS_ENTRY_MSR_LOAD_ADDR:
272 case VMCS_TSC_OFFSET:
273 case VMCS_VAPIC_ADDR:
275 case VMCS_GUEST_DBG_CTL:
276 case VMCS_GUEST_PERF_GLOBAL_CTRL:
279 case VMCS_CR0_READ_SHDW:
280 case VMCS_CR4_READ_SHDW:
281 case VMCS_CR3_TGT_VAL_0:
282 case VMCS_CR3_TGT_VAL_1:
283 case VMCS_CR3_TGT_VAL_2:
284 case VMCS_CR3_TGT_VAL_3:
290 case VMCS_GUEST_LINEAR_ADDR:
294 case VMCS_GUEST_ES_BASE:
295 case VMCS_GUEST_CS_BASE:
296 case VMCS_GUEST_SS_BASE:
297 case VMCS_GUEST_DS_BASE:
298 case VMCS_GUEST_FS_BASE:
299 case VMCS_GUEST_GS_BASE:
300 case VMCS_GUEST_LDTR_BASE:
301 case VMCS_GUEST_TR_BASE:
302 case VMCS_GUEST_GDTR_BASE:
303 case VMCS_GUEST_IDTR_BASE:
307 case VMCS_GUEST_RFLAGS:
308 case VMCS_GUEST_PENDING_DBG_EXCP:
309 case VMCS_GUEST_SYSENTER_ESP:
310 case VMCS_GUEST_SYSENTER_EIP:
314 case VMCS_HOST_FS_BASE:
315 case VMCS_HOST_GS_BASE:
316 case VMCS_HOST_TR_BASE:
317 case VMCS_HOST_GDTR_BASE:
318 case VMCS_HOST_IDTR_BASE:
319 case VMCS_HOST_SYSENTER_ESP:
320 case VMCS_HOST_SYSENTER_EIP:
323 return sizeof(addr_t);
326 PrintError("Invalid VMCS field\n");
342 static const char VMCS_GUEST_ES_SELECTOR_STR[] = "GUEST_ES_SELECTOR";
343 static const char VMCS_GUEST_CS_SELECTOR_STR[] = "GUEST_CS_SELECTOR";
344 static const char VMCS_GUEST_SS_SELECTOR_STR[] = "GUEST_SS_SELECTOR";
345 static const char VMCS_GUEST_DS_SELECTOR_STR[] = "GUEST_DS_SELECTOR";
346 static const char VMCS_GUEST_FS_SELECTOR_STR[] = "GUEST_FS_SELECTOR";
347 static const char VMCS_GUEST_GS_SELECTOR_STR[] = "GUEST_GS_SELECTOR";
348 static const char VMCS_GUEST_LDTR_SELECTOR_STR[] = "GUEST_LDTR_SELECTOR";
349 static const char VMCS_GUEST_TR_SELECTOR_STR[] = "GUEST_TR_SELECTOR";
350 static const char VMCS_HOST_ES_SELECTOR_STR[] = "HOST_ES_SELECTOR";
351 static const char VMCS_HOST_CS_SELECTOR_STR[] = "HOST_CS_SELECTOR";
352 static const char VMCS_HOST_SS_SELECTOR_STR[] = "HOST_SS_SELECTOR";
353 static const char VMCS_HOST_DS_SELECTOR_STR[] = "HOST_DS_SELECTOR";
354 static const char VMCS_HOST_FS_SELECTOR_STR[] = "HOST_FS_SELECTOR";
355 static const char VMCS_HOST_GS_SELECTOR_STR[] = "HOST_GS_SELECTOR";
356 static const char VMCS_HOST_TR_SELECTOR_STR[] = "HOST_TR_SELECTOR";
357 static const char VMCS_IO_BITMAP_A_ADDR_STR[] = "IO_BITMAP_A_ADDR";
358 static const char VMCS_IO_BITMAP_A_ADDR_HIGH_STR[] = "IO_BITMAP_A_ADDR_HIGH";
359 static const char VMCS_IO_BITMAP_B_ADDR_STR[] = "IO_BITMAP_B_ADDR";
360 static const char VMCS_IO_BITMAP_B_ADDR_HIGH_STR[] = "IO_BITMAP_B_ADDR_HIGH";
361 static const char VMCS_MSR_BITMAP_STR[] = "MSR_BITMAPS";
362 static const char VMCS_MSR_BITMAP_HIGH_STR[] = "MSR_BITMAPS_HIGH";
363 static const char VMCS_EXIT_MSR_STORE_ADDR_STR[] = "EXIT_MSR_STORE_ADDR";
364 static const char VMCS_EXIT_MSR_STORE_ADDR_HIGH_STR[] = "EXIT_MSR_STORE_ADDR_HIGH";
365 static const char VMCS_EXIT_MSR_LOAD_ADDR_STR[] = "EXIT_MSR_LOAD_ADDR";
366 static const char VMCS_EXIT_MSR_LOAD_ADDR_HIGH_STR[] = "EXIT_MSR_LOAD_ADDR_HIGH";
367 static const char VMCS_ENTRY_MSR_LOAD_ADDR_STR[] = "ENTRY_MSR_LOAD_ADDR";
368 static const char VMCS_ENTRY_MSR_LOAD_ADDR_HIGH_STR[] = "ENTRY_MSR_LOAD_ADDR_HIGH";
369 static const char VMCS_EXEC_PTR_STR[] = "VMCS_EXEC_PTR";
370 static const char VMCS_EXEC_PTR_HIGH_STR[] = "VMCS_EXEC_PTR_HIGH";
371 static const char VMCS_TSC_OFFSET_STR[] = "TSC_OFFSET";
372 static const char VMCS_TSC_OFFSET_HIGH_STR[] = "TSC_OFFSET_HIGH";
373 static const char VMCS_VAPIC_ADDR_STR[] = "VAPIC_PAGE_ADDR";
374 static const char VMCS_VAPIC_ADDR_HIGH_STR[] = "VAPIC_PAGE_ADDR_HIGH";
375 static const char VMCS_LINK_PTR_STR[] = "VMCS_LINK_PTR";
376 static const char VMCS_LINK_PTR_HIGH_STR[] = "VMCS_LINK_PTR_HIGH";
377 static const char VMCS_GUEST_DBG_CTL_STR[] = "GUEST_DEBUG_CTL";
378 static const char VMCS_GUEST_DBG_CTL_HIGH_STR[] = "GUEST_DEBUG_CTL_HIGH";
379 static const char VMCS_GUEST_PERF_GLOBAL_CTRL_STR[] = "GUEST_PERF_GLOBAL_CTRL";
380 static const char VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH_STR[] = "GUEST_PERF_GLOBAL_CTRL_HIGH";
381 static const char VMCS_PIN_CTRLS_STR[] = "PIN_VM_EXEC_CTRLS";
382 static const char VMCS_PROC_CTRLS_STR[] = "PROC_VM_EXEC_CTRLS";
383 static const char VMCS_EXCP_BITMAP_STR[] = "EXCEPTION_BITMAP";
384 static const char VMCS_PG_FAULT_ERR_MASK_STR[] = "PAGE_FAULT_ERROR_MASK";
385 static const char VMCS_PG_FAULT_ERR_MATCH_STR[] = "PAGE_FAULT_ERROR_MATCH";
386 static const char VMCS_CR3_TGT_CNT_STR[] = "CR3_TARGET_COUNT";
387 static const char VMCS_EXIT_CTRLS_STR[] = "VM_EXIT_CTRLS";
388 static const char VMCS_EXIT_MSR_STORE_CNT_STR[] = "VM_EXIT_MSR_STORE_COUNT";
389 static const char VMCS_EXIT_MSR_LOAD_CNT_STR[] = "VM_EXIT_MSR_LOAD_COUNT";
390 static const char VMCS_ENTRY_CTRLS_STR[] = "VM_ENTRY_CTRLS";
391 static const char VMCS_ENTRY_MSR_LOAD_CNT_STR[] = "VM_ENTRY_MSR_LOAD_COUNT";
392 static const char VMCS_ENTRY_INT_INFO_STR[] = "VM_ENTRY_INT_INFO_FIELD";
393 static const char VMCS_ENTRY_EXCP_ERR_STR[] = "VM_ENTRY_EXCEPTION_ERROR";
394 static const char VMCS_ENTRY_INSTR_LEN_STR[] = "VM_ENTRY_INSTR_LENGTH";
395 static const char VMCS_TPR_THRESHOLD_STR[] = "TPR_THRESHOLD";
396 static const char VMCS_INSTR_ERR_STR[] = "VM_INSTR_ERROR";
397 static const char VMCS_EXIT_REASON_STR[] = "EXIT_REASON";
398 static const char VMCS_EXIT_INT_INFO_STR[] = "VM_EXIT_INT_INFO";
399 static const char VMCS_EXIT_INT_ERR_STR[] = "VM_EXIT_INT_ERROR";
400 static const char VMCS_IDT_VECTOR_INFO_STR[] = "IDT_VECTOR_INFO";
401 static const char VMCS_IDT_VECTOR_ERR_STR[] = "IDT_VECTOR_ERROR";
402 static const char VMCS_EXIT_INSTR_LEN_STR[] = "VM_EXIT_INSTR_LENGTH";
403 static const char VMCS_VMX_INSTR_INFO_STR[] = "VMX_INSTR_INFO";
404 static const char VMCS_GUEST_ES_LIMIT_STR[] = "GUEST_ES_LIMIT";
405 static const char VMCS_GUEST_CS_LIMIT_STR[] = "GUEST_CS_LIMIT";
406 static const char VMCS_GUEST_SS_LIMIT_STR[] = "GUEST_SS_LIMIT";
407 static const char VMCS_GUEST_DS_LIMIT_STR[] = "GUEST_DS_LIMIT";
408 static const char VMCS_GUEST_FS_LIMIT_STR[] = "GUEST_FS_LIMIT";
409 static const char VMCS_GUEST_GS_LIMIT_STR[] = "GUEST_GS_LIMIT";
410 static const char VMCS_GUEST_LDTR_LIMIT_STR[] = "GUEST_LDTR_LIMIT";
411 static const char VMCS_GUEST_TR_LIMIT_STR[] = "GUEST_TR_LIMIT";
412 static const char VMCS_GUEST_GDTR_LIMIT_STR[] = "GUEST_GDTR_LIMIT";
413 static const char VMCS_GUEST_IDTR_LIMIT_STR[] = "GUEST_IDTR_LIMIT";
414 static const char VMCS_GUEST_ES_ACCESS_STR[] = "GUEST_ES_ACCESS";
415 static const char VMCS_GUEST_CS_ACCESS_STR[] = "GUEST_CS_ACCESS";
416 static const char VMCS_GUEST_SS_ACCESS_STR[] = "GUEST_SS_ACCESS";
417 static const char VMCS_GUEST_DS_ACCESS_STR[] = "GUEST_DS_ACCESS";
418 static const char VMCS_GUEST_FS_ACCESS_STR[] = "GUEST_FS_ACCESS";
419 static const char VMCS_GUEST_GS_ACCESS_STR[] = "GUEST_GS_ACCESS";
420 static const char VMCS_GUEST_LDTR_ACCESS_STR[] = "GUEST_LDTR_ACCESS";
421 static const char VMCS_GUEST_TR_ACCESS_STR[] = "GUEST_TR_ACCESS";
422 static const char VMCS_GUEST_INT_STATE_STR[] = "GUEST_INT_STATE";
423 static const char VMCS_GUEST_ACTIVITY_STATE_STR[] = "GUEST_ACTIVITY_STATE";
424 static const char VMCS_GUEST_SMBASE_STR[] = "GUEST_SMBASE";
425 static const char VMCS_GUEST_SYSENTER_CS_STR[] = "GUEST_SYSENTER_CS";
426 static const char VMCS_HOST_SYSENTER_CS_STR[] = "HOST_SYSENTER_CS";
427 static const char VMCS_CR0_MASK_STR[] = "CR0_GUEST_HOST_MASK";
428 static const char VMCS_CR4_MASK_STR[] = "CR4_GUEST_HOST_MASK";
429 static const char VMCS_CR0_READ_SHDW_STR[] = "CR0_READ_SHADOW";
430 static const char VMCS_CR4_READ_SHDW_STR[] = "CR4_READ_SHADOW";
431 static const char VMCS_CR3_TGT_VAL_0_STR[] = "CR3_TARGET_VALUE_0";
432 static const char VMCS_CR3_TGT_VAL_1_STR[] = "CR3_TARGET_VALUE_1";
433 static const char VMCS_CR3_TGT_VAL_2_STR[] = "CR3_TARGET_VALUE_2";
434 static const char VMCS_CR3_TGT_VAL_3_STR[] = "CR3_TARGET_VALUE_3";
435 static const char VMCS_EXIT_QUAL_STR[] = "EXIT_QUALIFICATION";
436 static const char VMCS_IO_RCX_STR[] = "IO_RCX";
437 static const char VMCS_IO_RSI_STR[] = "IO_RSI";
438 static const char VMCS_IO_RDI_STR[] = "IO_RDI";
439 static const char VMCS_IO_RIP_STR[] = "IO_RIP";
440 static const char VMCS_GUEST_LINEAR_ADDR_STR[] = "GUEST_LINEAR_ADDR";
441 static const char VMCS_GUEST_CR0_STR[] = "GUEST_CR0";
442 static const char VMCS_GUEST_CR3_STR[] = "GUEST_CR3";
443 static const char VMCS_GUEST_CR4_STR[] = "GUEST_CR4";
444 static const char VMCS_GUEST_ES_BASE_STR[] = "GUEST_ES_BASE";
445 static const char VMCS_GUEST_CS_BASE_STR[] = "GUEST_CS_BASE";
446 static const char VMCS_GUEST_SS_BASE_STR[] = "GUEST_SS_BASE";
447 static const char VMCS_GUEST_DS_BASE_STR[] = "GUEST_DS_BASE";
448 static const char VMCS_GUEST_FS_BASE_STR[] = "GUEST_FS_BASE";
449 static const char VMCS_GUEST_GS_BASE_STR[] = "GUEST_GS_BASE";
450 static const char VMCS_GUEST_LDTR_BASE_STR[] = "GUEST_LDTR_BASE";
451 static const char VMCS_GUEST_TR_BASE_STR[] = "GUEST_TR_BASE";
452 static const char VMCS_GUEST_GDTR_BASE_STR[] = "GUEST_GDTR_BASE";
453 static const char VMCS_GUEST_IDTR_BASE_STR[] = "GUEST_IDTR_BASE";
454 static const char VMCS_GUEST_DR7_STR[] = "GUEST_DR7";
455 static const char VMCS_GUEST_RSP_STR[] = "GUEST_RSP";
456 static const char VMCS_GUEST_RIP_STR[] = "GUEST_RIP";
457 static const char VMCS_GUEST_RFLAGS_STR[] = "GUEST_RFLAGS";
458 static const char VMCS_GUEST_PENDING_DBG_EXCP_STR[] = "GUEST_PENDING_DEBUG_EXCS";
459 static const char VMCS_GUEST_SYSENTER_ESP_STR[] = "GUEST_SYSENTER_ESP";
460 static const char VMCS_GUEST_SYSENTER_EIP_STR[] = "GUEST_SYSENTER_EIP";
461 static const char VMCS_HOST_CR0_STR[] = "HOST_CR0";
462 static const char VMCS_HOST_CR3_STR[] = "HOST_CR3";
463 static const char VMCS_HOST_CR4_STR[] = "HOST_CR4";
464 static const char VMCS_HOST_FS_BASE_STR[] = "HOST_FS_BASE";
465 static const char VMCS_HOST_GS_BASE_STR[] = "HOST_GS_BASE";
466 static const char VMCS_HOST_TR_BASE_STR[] = "HOST_TR_BASE";
467 static const char VMCS_HOST_GDTR_BASE_STR[] = "HOST_GDTR_BASE";
468 static const char VMCS_HOST_IDTR_BASE_STR[] = "HOST_IDTR_BASE";
469 static const char VMCS_HOST_SYSENTER_ESP_STR[] = "HOST_SYSENTER_ESP";
470 static const char VMCS_HOST_SYSENTER_EIP_STR[] = "HOST_SYSENTER_EIP";
471 static const char VMCS_HOST_RSP_STR[] = "HOST_RSP";
472 static const char VMCS_HOST_RIP_STR[] = "HOST_RIP";
476 const char * v3_vmcs_field_to_str(vmcs_field_t field) {
478 case VMCS_GUEST_ES_SELECTOR:
479 return VMCS_GUEST_ES_SELECTOR_STR;
480 case VMCS_GUEST_CS_SELECTOR:
481 return VMCS_GUEST_CS_SELECTOR_STR;
482 case VMCS_GUEST_SS_SELECTOR:
483 return VMCS_GUEST_SS_SELECTOR_STR;
484 case VMCS_GUEST_DS_SELECTOR:
485 return VMCS_GUEST_DS_SELECTOR_STR;
486 case VMCS_GUEST_FS_SELECTOR:
487 return VMCS_GUEST_FS_SELECTOR_STR;
488 case VMCS_GUEST_GS_SELECTOR:
489 return VMCS_GUEST_GS_SELECTOR_STR;
490 case VMCS_GUEST_LDTR_SELECTOR:
491 return VMCS_GUEST_LDTR_SELECTOR_STR;
492 case VMCS_GUEST_TR_SELECTOR:
493 return VMCS_GUEST_TR_SELECTOR_STR;
494 case VMCS_HOST_ES_SELECTOR:
495 return VMCS_HOST_ES_SELECTOR_STR;
496 case VMCS_HOST_CS_SELECTOR:
497 return VMCS_HOST_CS_SELECTOR_STR;
498 case VMCS_HOST_SS_SELECTOR:
499 return VMCS_HOST_SS_SELECTOR_STR;
500 case VMCS_HOST_DS_SELECTOR:
501 return VMCS_HOST_DS_SELECTOR_STR;
502 case VMCS_HOST_FS_SELECTOR:
503 return VMCS_HOST_FS_SELECTOR_STR;
504 case VMCS_HOST_GS_SELECTOR:
505 return VMCS_HOST_GS_SELECTOR_STR;
506 case VMCS_HOST_TR_SELECTOR:
507 return VMCS_HOST_TR_SELECTOR_STR;
508 case VMCS_IO_BITMAP_A_ADDR:
509 return VMCS_IO_BITMAP_A_ADDR_STR;
510 case VMCS_IO_BITMAP_A_ADDR_HIGH:
511 return VMCS_IO_BITMAP_A_ADDR_HIGH_STR;
512 case VMCS_IO_BITMAP_B_ADDR:
513 return VMCS_IO_BITMAP_B_ADDR_STR;
514 case VMCS_IO_BITMAP_B_ADDR_HIGH:
515 return VMCS_IO_BITMAP_B_ADDR_HIGH_STR;
516 case VMCS_MSR_BITMAP:
517 return VMCS_MSR_BITMAP_STR;
518 case VMCS_MSR_BITMAP_HIGH:
519 return VMCS_MSR_BITMAP_HIGH_STR;
520 case VMCS_EXIT_MSR_STORE_ADDR:
521 return VMCS_EXIT_MSR_STORE_ADDR_STR;
522 case VMCS_EXIT_MSR_STORE_ADDR_HIGH:
523 return VMCS_EXIT_MSR_STORE_ADDR_HIGH_STR;
524 case VMCS_EXIT_MSR_LOAD_ADDR:
525 return VMCS_EXIT_MSR_LOAD_ADDR_STR;
526 case VMCS_EXIT_MSR_LOAD_ADDR_HIGH:
527 return VMCS_EXIT_MSR_LOAD_ADDR_HIGH_STR;
528 case VMCS_ENTRY_MSR_LOAD_ADDR:
529 return VMCS_ENTRY_MSR_LOAD_ADDR_STR;
530 case VMCS_ENTRY_MSR_LOAD_ADDR_HIGH:
531 return VMCS_ENTRY_MSR_LOAD_ADDR_HIGH_STR;
533 return VMCS_EXEC_PTR_STR;
534 case VMCS_EXEC_PTR_HIGH:
535 return VMCS_EXEC_PTR_HIGH_STR;
536 case VMCS_TSC_OFFSET:
537 return VMCS_TSC_OFFSET_STR;
538 case VMCS_TSC_OFFSET_HIGH:
539 return VMCS_TSC_OFFSET_HIGH_STR;
540 case VMCS_VAPIC_ADDR:
541 return VMCS_VAPIC_ADDR_STR;
542 case VMCS_VAPIC_ADDR_HIGH:
543 return VMCS_VAPIC_ADDR_HIGH_STR;
545 return VMCS_LINK_PTR_STR;
546 case VMCS_LINK_PTR_HIGH:
547 return VMCS_LINK_PTR_HIGH_STR;
548 case VMCS_GUEST_DBG_CTL:
549 return VMCS_GUEST_DBG_CTL_STR;
550 case VMCS_GUEST_DBG_CTL_HIGH:
551 return VMCS_GUEST_DBG_CTL_HIGH_STR;
552 case VMCS_GUEST_PERF_GLOBAL_CTRL:
553 return VMCS_GUEST_PERF_GLOBAL_CTRL_STR;
554 case VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH:
555 return VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH_STR;
557 return VMCS_PIN_CTRLS_STR;
558 case VMCS_PROC_CTRLS:
559 return VMCS_PROC_CTRLS_STR;
560 case VMCS_EXCP_BITMAP:
561 return VMCS_EXCP_BITMAP_STR;
562 case VMCS_PG_FAULT_ERR_MASK:
563 return VMCS_PG_FAULT_ERR_MASK_STR;
564 case VMCS_PG_FAULT_ERR_MATCH:
565 return VMCS_PG_FAULT_ERR_MATCH_STR;
566 case VMCS_CR3_TGT_CNT:
567 return VMCS_CR3_TGT_CNT_STR;
568 case VMCS_EXIT_CTRLS:
569 return VMCS_EXIT_CTRLS_STR;
570 case VMCS_EXIT_MSR_STORE_CNT:
571 return VMCS_EXIT_MSR_STORE_CNT_STR;
572 case VMCS_EXIT_MSR_LOAD_CNT:
573 return VMCS_EXIT_MSR_LOAD_CNT_STR;
574 case VMCS_ENTRY_CTRLS:
575 return VMCS_ENTRY_CTRLS_STR;
576 case VMCS_ENTRY_MSR_LOAD_CNT:
577 return VMCS_ENTRY_MSR_LOAD_CNT_STR;
578 case VMCS_ENTRY_INT_INFO:
579 return VMCS_ENTRY_INT_INFO_STR;
580 case VMCS_ENTRY_EXCP_ERR:
581 return VMCS_ENTRY_EXCP_ERR_STR;
582 case VMCS_ENTRY_INSTR_LEN:
583 return VMCS_ENTRY_INSTR_LEN_STR;
584 case VMCS_TPR_THRESHOLD:
585 return VMCS_TPR_THRESHOLD_STR;
587 return VMCS_INSTR_ERR_STR;
588 case VMCS_EXIT_REASON:
589 return VMCS_EXIT_REASON_STR;
590 case VMCS_EXIT_INT_INFO:
591 return VMCS_EXIT_INT_INFO_STR;
592 case VMCS_EXIT_INT_ERR:
593 return VMCS_EXIT_INT_ERR_STR;
594 case VMCS_IDT_VECTOR_INFO:
595 return VMCS_IDT_VECTOR_INFO_STR;
596 case VMCS_IDT_VECTOR_ERR:
597 return VMCS_IDT_VECTOR_ERR_STR;
598 case VMCS_EXIT_INSTR_LEN:
599 return VMCS_EXIT_INSTR_LEN_STR;
600 case VMCS_VMX_INSTR_INFO:
601 return VMCS_VMX_INSTR_INFO_STR;
602 case VMCS_GUEST_ES_LIMIT:
603 return VMCS_GUEST_ES_LIMIT_STR;
604 case VMCS_GUEST_CS_LIMIT:
605 return VMCS_GUEST_CS_LIMIT_STR;
606 case VMCS_GUEST_SS_LIMIT:
607 return VMCS_GUEST_SS_LIMIT_STR;
608 case VMCS_GUEST_DS_LIMIT:
609 return VMCS_GUEST_DS_LIMIT_STR;
610 case VMCS_GUEST_FS_LIMIT:
611 return VMCS_GUEST_FS_LIMIT_STR;
612 case VMCS_GUEST_GS_LIMIT:
613 return VMCS_GUEST_GS_LIMIT_STR;
614 case VMCS_GUEST_LDTR_LIMIT:
615 return VMCS_GUEST_LDTR_LIMIT_STR;
616 case VMCS_GUEST_TR_LIMIT:
617 return VMCS_GUEST_TR_LIMIT_STR;
618 case VMCS_GUEST_GDTR_LIMIT:
619 return VMCS_GUEST_GDTR_LIMIT_STR;
620 case VMCS_GUEST_IDTR_LIMIT:
621 return VMCS_GUEST_IDTR_LIMIT_STR;
622 case VMCS_GUEST_ES_ACCESS:
623 return VMCS_GUEST_ES_ACCESS_STR;
624 case VMCS_GUEST_CS_ACCESS:
625 return VMCS_GUEST_CS_ACCESS_STR;
626 case VMCS_GUEST_SS_ACCESS:
627 return VMCS_GUEST_SS_ACCESS_STR;
628 case VMCS_GUEST_DS_ACCESS:
629 return VMCS_GUEST_DS_ACCESS_STR;
630 case VMCS_GUEST_FS_ACCESS:
631 return VMCS_GUEST_FS_ACCESS_STR;
632 case VMCS_GUEST_GS_ACCESS:
633 return VMCS_GUEST_GS_ACCESS_STR;
634 case VMCS_GUEST_LDTR_ACCESS:
635 return VMCS_GUEST_LDTR_ACCESS_STR;
636 case VMCS_GUEST_TR_ACCESS:
637 return VMCS_GUEST_TR_ACCESS_STR;
638 case VMCS_GUEST_INT_STATE:
639 return VMCS_GUEST_INT_STATE_STR;
640 case VMCS_GUEST_ACTIVITY_STATE:
641 return VMCS_GUEST_ACTIVITY_STATE_STR;
642 case VMCS_GUEST_SMBASE:
643 return VMCS_GUEST_SMBASE_STR;
644 case VMCS_GUEST_SYSENTER_CS:
645 return VMCS_GUEST_SYSENTER_CS_STR;
646 case VMCS_HOST_SYSENTER_CS:
647 return VMCS_HOST_SYSENTER_CS_STR;
649 return VMCS_CR0_MASK_STR;
651 return VMCS_CR4_MASK_STR;
652 case VMCS_CR0_READ_SHDW:
653 return VMCS_CR0_READ_SHDW_STR;
654 case VMCS_CR4_READ_SHDW:
655 return VMCS_CR4_READ_SHDW_STR;
656 case VMCS_CR3_TGT_VAL_0:
657 return VMCS_CR3_TGT_VAL_0_STR;
658 case VMCS_CR3_TGT_VAL_1:
659 return VMCS_CR3_TGT_VAL_1_STR;
660 case VMCS_CR3_TGT_VAL_2:
661 return VMCS_CR3_TGT_VAL_2_STR;
662 case VMCS_CR3_TGT_VAL_3:
663 return VMCS_CR3_TGT_VAL_3_STR;
665 return VMCS_EXIT_QUAL_STR;
667 return VMCS_IO_RCX_STR;
669 return VMCS_IO_RSI_STR;
671 return VMCS_IO_RDI_STR;
673 return VMCS_IO_RIP_STR;
674 case VMCS_GUEST_LINEAR_ADDR:
675 return VMCS_GUEST_LINEAR_ADDR_STR;
677 return VMCS_GUEST_CR0_STR;
679 return VMCS_GUEST_CR3_STR;
681 return VMCS_GUEST_CR4_STR;
682 case VMCS_GUEST_ES_BASE:
683 return VMCS_GUEST_ES_BASE_STR;
684 case VMCS_GUEST_CS_BASE:
685 return VMCS_GUEST_CS_BASE_STR;
686 case VMCS_GUEST_SS_BASE:
687 return VMCS_GUEST_SS_BASE_STR;
688 case VMCS_GUEST_DS_BASE:
689 return VMCS_GUEST_DS_BASE_STR;
690 case VMCS_GUEST_FS_BASE:
691 return VMCS_GUEST_FS_BASE_STR;
692 case VMCS_GUEST_GS_BASE:
693 return VMCS_GUEST_GS_BASE_STR;
694 case VMCS_GUEST_LDTR_BASE:
695 return VMCS_GUEST_LDTR_BASE_STR;
696 case VMCS_GUEST_TR_BASE:
697 return VMCS_GUEST_TR_BASE_STR;
698 case VMCS_GUEST_GDTR_BASE:
699 return VMCS_GUEST_GDTR_BASE_STR;
700 case VMCS_GUEST_IDTR_BASE:
701 return VMCS_GUEST_IDTR_BASE_STR;
703 return VMCS_GUEST_DR7_STR;
705 return VMCS_GUEST_RSP_STR;
707 return VMCS_GUEST_RIP_STR;
708 case VMCS_GUEST_RFLAGS:
709 return VMCS_GUEST_RFLAGS_STR;
710 case VMCS_GUEST_PENDING_DBG_EXCP:
711 return VMCS_GUEST_PENDING_DBG_EXCP_STR;
712 case VMCS_GUEST_SYSENTER_ESP:
713 return VMCS_GUEST_SYSENTER_ESP_STR;
714 case VMCS_GUEST_SYSENTER_EIP:
715 return VMCS_GUEST_SYSENTER_EIP_STR;
717 return VMCS_HOST_CR0_STR;
719 return VMCS_HOST_CR3_STR;
721 return VMCS_HOST_CR4_STR;
722 case VMCS_HOST_FS_BASE:
723 return VMCS_HOST_FS_BASE_STR;
724 case VMCS_HOST_GS_BASE:
725 return VMCS_HOST_GS_BASE_STR;
726 case VMCS_HOST_TR_BASE:
727 return VMCS_HOST_TR_BASE_STR;
728 case VMCS_HOST_GDTR_BASE:
729 return VMCS_HOST_GDTR_BASE_STR;
730 case VMCS_HOST_IDTR_BASE:
731 return VMCS_HOST_IDTR_BASE_STR;
732 case VMCS_HOST_SYSENTER_ESP:
733 return VMCS_HOST_SYSENTER_ESP_STR;
734 case VMCS_HOST_SYSENTER_EIP:
735 return VMCS_HOST_SYSENTER_EIP_STR;
737 return VMCS_HOST_RSP_STR;
739 return VMCS_HOST_RIP_STR;