Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


updates to vmcs utility functions
[palacios.git] / palacios / src / palacios / vmcs.c
1 /* 
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.  
5  *
6  * The V3VEE Project is a joint project between Northwestern University
7  * and the University of New Mexico.  You can find out more at 
8  * http://www.v3vee.org
9  *
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.
13  *
14  * Author: Jack Lange <jarusl@cs.northwestern.edu>
15  *
16  * This is free software.  You are permitted to use,
17  * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
18  */
19
20 #include <palacios/vmcs.h>
21 #include <palacios/vmx_lowlevel.h>
22 #include <palacios/vmm.h>
23
24
25 static const char * vmcs_field_to_str(vmcs_field_t field);
26
27 //extern char * exception_names;
28 //
29 // Ignores "HIGH" addresses - 32 bit only for now
30 //
31
32
33 static inline void print_vmcs_field(vmcs_field_t vmcs_index) {
34     int len = v3_vmcs_get_field_len(vmcs_index);
35     addr_t val;
36     
37     if (vmcs_read(vmcs_index, &val, len) != VMX_SUCCESS) {
38         PrintError("VMCS_READ error for index %x\n", vmcs_index);
39         return;
40     };
41     
42     if (len == 2) {
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);
48     }
49 }
50
51
52 static inline void print_vmcs_segments() {
53     // see vm_guest.c
54 }
55
56
57
58
59 /*
60 void print_debug_vmcs_load_guest() {
61     const int wordsize = sizeof(addr_t);
62     uint64_t temp;
63     struct vmcs_segment_access tmp_seg;
64
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);
70
71     READ_VMCS_SEG(&tmp_seg,CS,wordsize);
72     print_vmcs_segment("CS", &tmp_seg);
73     
74     READ_VMCS_SEG(&tmp_seg,SS,wordsize);
75     print_vmcs_segment("SS", &tmp_seg);
76
77     READ_VMCS_SEG(&tmp,DS,wordsize);
78     print_vmcs_segment("DS", &tmp_seg);
79
80     READ_VMCS_SEG(&tmp_seg,ES,wordsize);
81     print_vmcs_segment("ES", &tmp_seg);
82
83     READ_VMCS_SEG(&tmp_seg,FS,wordsize);
84     print_vmcs_segment("FS", &tmp_seg);
85
86     READ_VMCS_SEG(&tmp_seg,GS,wordsize);
87     print_vmcs_segment("GS", &tmp_seg);
88
89     READ_VMCS_SEG(&tmp_seg,TR,wordsize);
90     print_vmcs_segment("TR", &tmp_seg);
91
92     READ_VMCS_SEG(&tmp_seg,LDTR,wordsize);
93     print_vmcs_segment("LDTR", &tmp_seg);
94     
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);
98     PrintDebug("====\n");
99
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");
104
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);
111
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)
119 }
120
121 void print_debug_load_host() {
122     const int wordsize = sizeof(addr_t);
123     uint64_t temp;
124     vmcs_segment tmp_seg;
125
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);
135         
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);
143
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);
149 }
150
151 void print_vmcs_segment(char * name, vmcs_segment* seg)
152 {
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);
158 }*/
159
160 /*
161  * Returns the field length in bytes
162  */
163 int v3_vmcs_get_field_len(vmcs_field_t field) {
164     switch(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:
181             return 2;
182
183         /* 32 bit Control Fields */
184         case VMCS_PIN_CTRLS:
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:
199         case VMCS_INSTR_ERR:
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:
230             return 4;
231
232
233         /* high bits of variable width fields
234          * We can probably just delete most of these....
235          */
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:
248             return 4;
249
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:
257         case VMCS_EXEC_PTR:
258         case VMCS_TSC_OFFSET:
259         case VMCS_VAPIC_ADDR:
260         case VMCS_LINK_PTR:
261         case VMCS_GUEST_DBG_CTL:
262         case VMCS_GUEST_PERF_GLOBAL_CTRL:
263         case VMCS_CR0_MASK:
264         case VMCS_CR4_MASK:
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:
271         case VMCS_EXIT_QUAL:
272         case VMCS_IO_RCX:
273         case VMCS_IO_RSI:
274         case VMCS_IO_RDI:
275         case VMCS_IO_RIP:
276         case VMCS_GUEST_LINEAR_ADDR:
277         case VMCS_GUEST_CR0:
278         case VMCS_GUEST_CR3:
279         case VMCS_GUEST_CR4:
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:
290         case VMCS_GUEST_DR7:
291         case VMCS_GUEST_RSP:
292         case VMCS_GUEST_RIP:
293         case VMCS_GUEST_RFLAGS:
294         case VMCS_GUEST_PENDING_DBG_EXCP:
295         case VMCS_GUEST_SYSENTER_ESP:
296         case VMCS_GUEST_SYSENTER_EIP:
297         case VMCS_HOST_CR0:
298         case VMCS_HOST_CR3:
299         case VMCS_HOST_CR4:
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:
307         case VMCS_HOST_RSP:
308         case VMCS_HOST_RIP:
309             return sizeof(addr_t);
310
311         default:
312             PrintError("Invalid VMCS field\n");
313             return -1;
314     }
315 }
316
317
318
319
320
321
322
323
324
325
326
327
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";
459
460
461
462 static const char * vmcs_field_to_str(vmcs_field_t field) {   
463     switch (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;
518         case VMCS_EXEC_PTR:
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;
530         case VMCS_LINK_PTR:
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;
542         case VMCS_PIN_CTRLS:
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;
572         case VMCS_INSTR_ERR:
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;
634         case VMCS_CR0_MASK:
635             return VMCS_CR0_MASK_STR;
636         case VMCS_CR4_MASK:
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;
650         case VMCS_EXIT_QUAL:
651             return VMCS_EXIT_QUAL_STR;
652         case VMCS_IO_RCX:
653             return VMCS_IO_RCX_STR;
654         case VMCS_IO_RSI:
655             return VMCS_IO_RSI_STR;
656         case VMCS_IO_RDI:
657             return VMCS_IO_RDI_STR;
658         case VMCS_IO_RIP:
659             return VMCS_IO_RIP_STR;
660         case VMCS_GUEST_LINEAR_ADDR:
661             return VMCS_GUEST_LINEAR_ADDR_STR;
662         case VMCS_GUEST_CR0:
663             return VMCS_GUEST_CR0_STR;
664         case VMCS_GUEST_CR3:
665             return VMCS_GUEST_CR3_STR;
666         case VMCS_GUEST_CR4:
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;
688         case VMCS_GUEST_DR7:
689             return VMCS_GUEST_DR7_STR;
690         case VMCS_GUEST_RSP:
691             return VMCS_GUEST_RSP_STR;
692         case VMCS_GUEST_RIP:
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;
702         case VMCS_HOST_CR0:
703             return VMCS_HOST_CR0_STR;
704         case VMCS_HOST_CR3:
705             return VMCS_HOST_CR3_STR;
706         case VMCS_HOST_CR4:
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;
722         case VMCS_HOST_RSP:
723             return VMCS_HOST_RSP_STR;
724         case VMCS_HOST_RIP:
725             return VMCS_HOST_RIP_STR;
726         default:
727             return NULL;
728     }
729 }
730
731
732