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.


Succesfully launches and jumps into the exit handler. Need to write a proper exit...
[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 * v3_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", 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);
48     }
49 }
50
51
52
53 void v3_print_vmcs_guest_state()
54 {
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);
62
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);
68
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);
74
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);
80
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);
86
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);
92
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);
98
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);
104
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);
110
111     PrintDebug("\n=== GDTR ===\n");
112     print_vmcs_field(VMCS_GUEST_GDTR_BASE);
113     print_vmcs_field(VMCS_GUEST_GDTR_LIMIT);
114
115     PrintDebug("\n=== IDTR ===\n");
116     print_vmcs_field(VMCS_GUEST_IDTR_BASE);
117     print_vmcs_field(VMCS_GUEST_IDTR_LIMIT);
118
119     PrintDebug("\n");
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);
124
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);
131
132     PrintDebug("\n");
133 }
134        
135 void v3_print_vmcs_host_state()
136 {
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);
143
144     PrintDebug("\n");
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);
153     
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);
163
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);
170
171     PrintDebug("\n");
172 }
173
174 /*
175  * Returns the field length in bytes
176  */
177 int v3_vmcs_get_field_len(vmcs_field_t field) {
178     switch(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:
195             return 2;
196
197         /* 32 bit Control Fields */
198         case VMCS_PIN_CTRLS:
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:
213         case VMCS_INSTR_ERR:
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:
244             return 4;
245
246
247         /* high bits of variable width fields
248          * We can probably just delete most of these....
249          */
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:
262             return 4;
263
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:
271         case VMCS_EXEC_PTR:
272         case VMCS_TSC_OFFSET:
273         case VMCS_VAPIC_ADDR:
274         case VMCS_LINK_PTR:
275         case VMCS_GUEST_DBG_CTL:
276         case VMCS_GUEST_PERF_GLOBAL_CTRL:
277         case VMCS_CR0_MASK:
278         case VMCS_CR4_MASK:
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:
285         case VMCS_EXIT_QUAL:
286         case VMCS_IO_RCX:
287         case VMCS_IO_RSI:
288         case VMCS_IO_RDI:
289         case VMCS_IO_RIP:
290         case VMCS_GUEST_LINEAR_ADDR:
291         case VMCS_GUEST_CR0:
292         case VMCS_GUEST_CR3:
293         case VMCS_GUEST_CR4:
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:
304         case VMCS_GUEST_DR7:
305         case VMCS_GUEST_RSP:
306         case VMCS_GUEST_RIP:
307         case VMCS_GUEST_RFLAGS:
308         case VMCS_GUEST_PENDING_DBG_EXCP:
309         case VMCS_GUEST_SYSENTER_ESP:
310         case VMCS_GUEST_SYSENTER_EIP:
311         case VMCS_HOST_CR0:
312         case VMCS_HOST_CR3:
313         case VMCS_HOST_CR4:
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:
321         case VMCS_HOST_RSP:
322         case VMCS_HOST_RIP:
323             return sizeof(addr_t);
324
325         default:
326             PrintError("Invalid VMCS field\n");
327             return -1;
328     }
329 }
330
331
332
333
334
335
336
337
338
339
340
341
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";
473
474
475
476 const char * v3_vmcs_field_to_str(vmcs_field_t field) {   
477     switch (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;
532         case VMCS_EXEC_PTR:
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;
544         case VMCS_LINK_PTR:
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;
556         case VMCS_PIN_CTRLS:
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;
586         case VMCS_INSTR_ERR:
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;
648         case VMCS_CR0_MASK:
649             return VMCS_CR0_MASK_STR;
650         case VMCS_CR4_MASK:
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;
664         case VMCS_EXIT_QUAL:
665             return VMCS_EXIT_QUAL_STR;
666         case VMCS_IO_RCX:
667             return VMCS_IO_RCX_STR;
668         case VMCS_IO_RSI:
669             return VMCS_IO_RSI_STR;
670         case VMCS_IO_RDI:
671             return VMCS_IO_RDI_STR;
672         case VMCS_IO_RIP:
673             return VMCS_IO_RIP_STR;
674         case VMCS_GUEST_LINEAR_ADDR:
675             return VMCS_GUEST_LINEAR_ADDR_STR;
676         case VMCS_GUEST_CR0:
677             return VMCS_GUEST_CR0_STR;
678         case VMCS_GUEST_CR3:
679             return VMCS_GUEST_CR3_STR;
680         case VMCS_GUEST_CR4:
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;
702         case VMCS_GUEST_DR7:
703             return VMCS_GUEST_DR7_STR;
704         case VMCS_GUEST_RSP:
705             return VMCS_GUEST_RSP_STR;
706         case VMCS_GUEST_RIP:
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;
716         case VMCS_HOST_CR0:
717             return VMCS_HOST_CR0_STR;
718         case VMCS_HOST_CR3:
719             return VMCS_HOST_CR3_STR;
720         case VMCS_HOST_CR4:
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;
736         case VMCS_HOST_RSP:
737             return VMCS_HOST_RSP_STR;
738         case VMCS_HOST_RIP:
739             return VMCS_HOST_RIP_STR;
740         default:
741             return NULL;
742     }
743 }
744
745
746