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