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.


af8bc2e47c736bcefab577c689f82561fa5f0613
[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 /*
136 void print_debug_vmcs_load_guest() {
137     const int wordsize = sizeof(addr_t);
138     uint64_t temp;
139     struct vmcs_segment_access tmp_seg;
140
141     PrintDebug("\n====== Loading Guest State ======\n");
142     PRINT_VMREAD("Guest CR0: %x\n", GUEST_CR0, wordsize);
143     PRINT_VMREAD("Guest CR3: %x\n", GUEST_CR3, wordsize);
144     PRINT_VMREAD("Guest CR4: %x\n", GUEST_CR4, wordsize);
145     PRINT_VMREAD("Guest DR7: %x\n", GUEST_DR7, wordsize);
146
147     READ_VMCS_SEG(&tmp_seg,CS,wordsize);
148     print_vmcs_segment("CS", &tmp_seg);
149     
150     READ_VMCS_SEG(&tmp_seg,SS,wordsize);
151     print_vmcs_segment("SS", &tmp_seg);
152
153     READ_VMCS_SEG(&tmp,DS,wordsize);
154     print_vmcs_segment("DS", &tmp_seg);
155
156     READ_VMCS_SEG(&tmp_seg,ES,wordsize);
157     print_vmcs_segment("ES", &tmp_seg);
158
159     READ_VMCS_SEG(&tmp_seg,FS,wordsize);
160     print_vmcs_segment("FS", &tmp_seg);
161
162     READ_VMCS_SEG(&tmp_seg,GS,wordsize);
163     print_vmcs_segment("GS", &tmp_seg);
164
165     READ_VMCS_SEG(&tmp_seg,TR,wordsize);
166     print_vmcs_segment("TR", &tmp_seg);
167
168     READ_VMCS_SEG(&tmp_seg,LDTR,wordsize);
169     print_vmcs_segment("LDTR", &tmp_seg);
170     
171     PrintDebug("\n==GDTR==\n");
172     PRINT_VMREAD("GDTR Base: %x\n", GUEST_GDTR_BASE, wordsize);
173     PRINT_VMREAD("GDTR Limit: %x\n", GUEST_GDTR_LIMIT, 32);
174     PrintDebug("====\n");
175
176     PrintDebug("\n==LDTR==\n");
177     PRINT_VMREAD("LDTR Base: %x\n", GUEST_LDTR_BASE, wordsize);
178     PRINT_VMREAD("LDTR Limit: %x\n", GUEST_LDTR_LIMIT, 32);
179     PrintDebug("=====\n");
180
181     PRINT_VMREAD("Guest RSP: %x\n", GUEST_RSP, wordsize);
182     PRINT_VMREAD("Guest RIP: %x\n", GUEST_RIP, wordsize);
183     PRINT_VMREAD("Guest RFLAGS: %x\n", GUEST_RFLAGS, wordsize);
184     PRINT_VMREAD("Guest Activity state: %x\n", GUEST_ACTIVITY_STATE, 32);
185     PRINT_VMREAD("Guest Interruptibility state: %x\n", GUEST_INT_STATE, 32);
186     PRINT_VMREAD("Guest pending debug: %x\n", GUEST_PENDING_DEBUG_EXCS, wordsize);
187
188     PRINT_VMREAD("IA32_DEBUGCTL: %x\n", GUEST_IA32_DEBUGCTL, 64);
189     PRINT_VMREAD("IA32_SYSENTER_CS: %x\n", GUEST_IA32_SYSENTER_CS, 32);
190     PRINT_VMREAD("IA32_SYSTENTER_ESP: %x\n", GUEST_IA32_SYSENTER_ESP, wordsize);
191     PRINT_VMREAD("IA32_SYSTENTER_EIP: %x\n", GUEST_IA32_SYSENTER_EIP, wordsize);
192     PRINT_VMREAD("IA32_PERF_GLOBAL_CTRL: %x\n", GUEST_IA32_PERF_GLOBAL_CTRL, wordsize);
193     PRINT_VMREAD("VMCS Link Ptr: %x\n", VMCS_LINK_PTR, 64);
194     // TODO: Maybe add VMX preemption timer and PDTE (Intel 20-8 Vol. 3b)
195 }
196
197 void print_debug_load_host() {
198     const int wordsize = sizeof(addr_t);
199     uint64_t temp;
200     vmcs_segment tmp_seg;
201
202     PrintDebug("\n====== Host State ========\n");
203     PRINT_VMREAD("Host CR0: %x\n", HOST_CR0, wordsize);
204     PRINT_VMREAD("Host CR3: %x\n", HOST_CR3, wordsize);
205     PRINT_VMREAD("Host CR4: %x\n", HOST_CR4, wordsize);
206     PRINT_VMREAD("Host RSP: %x\n", HOST_RSP, wordsize);
207     PRINT_VMREAD("Host RIP: %x\n", HOST_RIP, wordsize);
208     PRINT_VMREAD("IA32_SYSENTER_CS: %x\n", HOST_IA32_SYSENTER_CS, 32);
209     PRINT_VMREAD("IA32_SYSENTER_ESP: %x\n", HOST_IA32_SYSENTER_ESP, wordsize);
210     PRINT_VMREAD("IA32_SYSENTER_EIP: %x\n", HOST_IA32_SYSENTER_EIP, wordsize);
211         
212     PRINT_VMREAD("Host CS Selector: %x\n", HOST_CS_SELECTOR, 16);
213     PRINT_VMREAD("Host SS Selector: %x\n", HOST_SS_SELECTOR, 16);
214     PRINT_VMREAD("Host DS Selector: %x\n", HOST_DS_SELECTOR, 16);
215     PRINT_VMREAD("Host ES Selector: %x\n", HOST_ES_SELECTOR, 16);
216     PRINT_VMREAD("Host FS Selector: %x\n", HOST_FS_SELECTOR, 16);
217     PRINT_VMREAD("Host GS Selector: %x\n", HOST_GS_SELECTOR, 16);
218     PRINT_VMREAD("Host TR Selector: %x\n", HOST_TR_SELECTOR, 16);
219
220     PRINT_VMREAD("Host FS Base: %x\n", HOST_FS_BASE, wordsize);
221     PRINT_VMREAD("Host GS Base: %x\n", HOST_GS_BASE, wordsize);
222     PRINT_VMREAD("Host TR Base: %x\n", HOST_TR_BASE, wordsize);
223     PRINT_VMREAD("Host GDTR Base: %x\n", HOST_GDTR_BASE, wordsize);
224     PRINT_VMREAD("Host IDTR Base: %x\n", HOSE_IDTR_BASE, wordsize);
225 }
226
227 void print_vmcs_segment(char * name, vmcs_segment* seg)
228 {
229     PrintDebug("\n==VMCS %s Segment==\n",name);
230     PrintDebug("\tSelector: %x\n", seg->selector);
231     PrintDebug("\tBase Address: %x\n", seg->baseAddr);
232     PrintDebug("\tLimit: %x\n", seg->limit);
233     PrintDebug("\tAccess: %x\n", seg->access);
234 }*/
235
236 /*
237  * Returns the field length in bytes
238  */
239 int v3_vmcs_get_field_len(vmcs_field_t field) {
240     switch(field)  {
241         /* 16 bit Control Fields */
242         case VMCS_GUEST_ES_SELECTOR:
243         case VMCS_GUEST_CS_SELECTOR:
244         case VMCS_GUEST_SS_SELECTOR:
245         case VMCS_GUEST_DS_SELECTOR:
246         case VMCS_GUEST_FS_SELECTOR:
247         case VMCS_GUEST_GS_SELECTOR:
248         case VMCS_GUEST_LDTR_SELECTOR:
249         case VMCS_GUEST_TR_SELECTOR:
250         case VMCS_HOST_ES_SELECTOR:
251         case VMCS_HOST_CS_SELECTOR:
252         case VMCS_HOST_SS_SELECTOR:
253         case VMCS_HOST_DS_SELECTOR:
254         case VMCS_HOST_FS_SELECTOR:
255         case VMCS_HOST_GS_SELECTOR:
256         case VMCS_HOST_TR_SELECTOR:
257             return 2;
258
259         /* 32 bit Control Fields */
260         case VMCS_PIN_CTRLS:
261         case VMCS_PROC_CTRLS:
262         case VMCS_EXCP_BITMAP:
263         case VMCS_PG_FAULT_ERR_MASK:
264         case VMCS_PG_FAULT_ERR_MATCH:
265         case VMCS_CR3_TGT_CNT:
266         case VMCS_EXIT_CTRLS:
267         case VMCS_EXIT_MSR_STORE_CNT:
268         case VMCS_EXIT_MSR_LOAD_CNT:
269         case VMCS_ENTRY_CTRLS:
270         case VMCS_ENTRY_MSR_LOAD_CNT:
271         case VMCS_ENTRY_INT_INFO:
272         case VMCS_ENTRY_EXCP_ERR:
273         case VMCS_ENTRY_INSTR_LEN:
274         case VMCS_TPR_THRESHOLD:
275         case VMCS_INSTR_ERR:
276         case VMCS_EXIT_REASON:
277         case VMCS_EXIT_INT_INFO:
278         case VMCS_EXIT_INT_ERR:
279         case VMCS_IDT_VECTOR_INFO:
280         case VMCS_IDT_VECTOR_ERR:
281         case VMCS_EXIT_INSTR_LEN:
282         case VMCS_VMX_INSTR_INFO:
283         case VMCS_GUEST_ES_LIMIT:
284         case VMCS_GUEST_CS_LIMIT:
285         case VMCS_GUEST_SS_LIMIT:
286         case VMCS_GUEST_DS_LIMIT:
287         case VMCS_GUEST_FS_LIMIT:
288         case VMCS_GUEST_GS_LIMIT:
289         case VMCS_GUEST_LDTR_LIMIT:
290         case VMCS_GUEST_TR_LIMIT:
291         case VMCS_GUEST_GDTR_LIMIT:
292         case VMCS_GUEST_IDTR_LIMIT:
293         case VMCS_GUEST_ES_ACCESS:
294         case VMCS_GUEST_CS_ACCESS:
295         case VMCS_GUEST_SS_ACCESS:
296         case VMCS_GUEST_DS_ACCESS:
297         case VMCS_GUEST_FS_ACCESS:
298         case VMCS_GUEST_GS_ACCESS:
299         case VMCS_GUEST_LDTR_ACCESS:
300         case VMCS_GUEST_TR_ACCESS:
301         case VMCS_GUEST_INT_STATE:
302         case VMCS_GUEST_ACTIVITY_STATE:
303         case VMCS_GUEST_SMBASE:
304         case VMCS_GUEST_SYSENTER_CS:
305         case VMCS_HOST_SYSENTER_CS:
306             return 4;
307
308
309         /* high bits of variable width fields
310          * We can probably just delete most of these....
311          */
312         case VMCS_IO_BITMAP_A_ADDR_HIGH:
313         case VMCS_IO_BITMAP_B_ADDR_HIGH:
314         case VMCS_MSR_BITMAP_HIGH:
315         case VMCS_EXIT_MSR_STORE_ADDR_HIGH:
316         case VMCS_EXIT_MSR_LOAD_ADDR_HIGH:
317         case VMCS_ENTRY_MSR_LOAD_ADDR_HIGH:
318         case VMCS_EXEC_PTR_HIGH:
319         case VMCS_TSC_OFFSET_HIGH:
320         case VMCS_VAPIC_ADDR_HIGH:
321         case VMCS_LINK_PTR_HIGH:
322         case VMCS_GUEST_DBG_CTL_HIGH:
323         case VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH:
324             return 4;
325
326             /* Natural Width Control Fields */
327         case VMCS_IO_BITMAP_A_ADDR:
328         case VMCS_IO_BITMAP_B_ADDR:
329         case VMCS_MSR_BITMAP:
330         case VMCS_EXIT_MSR_STORE_ADDR:
331         case VMCS_EXIT_MSR_LOAD_ADDR:
332         case VMCS_ENTRY_MSR_LOAD_ADDR:
333         case VMCS_EXEC_PTR:
334         case VMCS_TSC_OFFSET:
335         case VMCS_VAPIC_ADDR:
336         case VMCS_LINK_PTR:
337         case VMCS_GUEST_DBG_CTL:
338         case VMCS_GUEST_PERF_GLOBAL_CTRL:
339         case VMCS_CR0_MASK:
340         case VMCS_CR4_MASK:
341         case VMCS_CR0_READ_SHDW:
342         case VMCS_CR4_READ_SHDW:
343         case VMCS_CR3_TGT_VAL_0:
344         case VMCS_CR3_TGT_VAL_1:
345         case VMCS_CR3_TGT_VAL_2:
346         case VMCS_CR3_TGT_VAL_3:
347         case VMCS_EXIT_QUAL:
348         case VMCS_IO_RCX:
349         case VMCS_IO_RSI:
350         case VMCS_IO_RDI:
351         case VMCS_IO_RIP:
352         case VMCS_GUEST_LINEAR_ADDR:
353         case VMCS_GUEST_CR0:
354         case VMCS_GUEST_CR3:
355         case VMCS_GUEST_CR4:
356         case VMCS_GUEST_ES_BASE:
357         case VMCS_GUEST_CS_BASE:
358         case VMCS_GUEST_SS_BASE:
359         case VMCS_GUEST_DS_BASE:
360         case VMCS_GUEST_FS_BASE:
361         case VMCS_GUEST_GS_BASE:
362         case VMCS_GUEST_LDTR_BASE:
363         case VMCS_GUEST_TR_BASE:
364         case VMCS_GUEST_GDTR_BASE:
365         case VMCS_GUEST_IDTR_BASE:
366         case VMCS_GUEST_DR7:
367         case VMCS_GUEST_RSP:
368         case VMCS_GUEST_RIP:
369         case VMCS_GUEST_RFLAGS:
370         case VMCS_GUEST_PENDING_DBG_EXCP:
371         case VMCS_GUEST_SYSENTER_ESP:
372         case VMCS_GUEST_SYSENTER_EIP:
373         case VMCS_HOST_CR0:
374         case VMCS_HOST_CR3:
375         case VMCS_HOST_CR4:
376         case VMCS_HOST_FS_BASE:
377         case VMCS_HOST_GS_BASE:
378         case VMCS_HOST_TR_BASE:
379         case VMCS_HOST_GDTR_BASE:
380         case VMCS_HOST_IDTR_BASE:
381         case VMCS_HOST_SYSENTER_ESP:
382         case VMCS_HOST_SYSENTER_EIP:
383         case VMCS_HOST_RSP:
384         case VMCS_HOST_RIP:
385             return sizeof(addr_t);
386
387         default:
388             PrintError("Invalid VMCS field\n");
389             return -1;
390     }
391 }
392
393
394
395
396
397
398
399
400
401
402
403
404 static const char VMCS_GUEST_ES_SELECTOR_STR[] = "GUEST_ES_SELECTOR";
405 static const char VMCS_GUEST_CS_SELECTOR_STR[] = "GUEST_CS_SELECTOR";
406 static const char VMCS_GUEST_SS_SELECTOR_STR[] = "GUEST_SS_SELECTOR";
407 static const char VMCS_GUEST_DS_SELECTOR_STR[] = "GUEST_DS_SELECTOR";
408 static const char VMCS_GUEST_FS_SELECTOR_STR[] = "GUEST_FS_SELECTOR";
409 static const char VMCS_GUEST_GS_SELECTOR_STR[] = "GUEST_GS_SELECTOR";
410 static const char VMCS_GUEST_LDTR_SELECTOR_STR[] = "GUEST_LDTR_SELECTOR";
411 static const char VMCS_GUEST_TR_SELECTOR_STR[] = "GUEST_TR_SELECTOR";
412 static const char VMCS_HOST_ES_SELECTOR_STR[] = "HOST_ES_SELECTOR";
413 static const char VMCS_HOST_CS_SELECTOR_STR[] = "HOST_CS_SELECTOR";
414 static const char VMCS_HOST_SS_SELECTOR_STR[] = "HOST_SS_SELECTOR";
415 static const char VMCS_HOST_DS_SELECTOR_STR[] = "HOST_DS_SELECTOR";
416 static const char VMCS_HOST_FS_SELECTOR_STR[] = "HOST_FS_SELECTOR";
417 static const char VMCS_HOST_GS_SELECTOR_STR[] = "HOST_GS_SELECTOR";
418 static const char VMCS_HOST_TR_SELECTOR_STR[] = "HOST_TR_SELECTOR";
419 static const char VMCS_IO_BITMAP_A_ADDR_STR[] = "IO_BITMAP_A_ADDR";
420 static const char VMCS_IO_BITMAP_A_ADDR_HIGH_STR[] = "IO_BITMAP_A_ADDR_HIGH";
421 static const char VMCS_IO_BITMAP_B_ADDR_STR[] = "IO_BITMAP_B_ADDR";
422 static const char VMCS_IO_BITMAP_B_ADDR_HIGH_STR[] = "IO_BITMAP_B_ADDR_HIGH";
423 static const char VMCS_MSR_BITMAP_STR[] = "MSR_BITMAPS";
424 static const char VMCS_MSR_BITMAP_HIGH_STR[] = "MSR_BITMAPS_HIGH";
425 static const char VMCS_EXIT_MSR_STORE_ADDR_STR[] = "EXIT_MSR_STORE_ADDR";
426 static const char VMCS_EXIT_MSR_STORE_ADDR_HIGH_STR[] = "EXIT_MSR_STORE_ADDR_HIGH";
427 static const char VMCS_EXIT_MSR_LOAD_ADDR_STR[] = "EXIT_MSR_LOAD_ADDR";
428 static const char VMCS_EXIT_MSR_LOAD_ADDR_HIGH_STR[] = "EXIT_MSR_LOAD_ADDR_HIGH";
429 static const char VMCS_ENTRY_MSR_LOAD_ADDR_STR[] = "ENTRY_MSR_LOAD_ADDR";
430 static const char VMCS_ENTRY_MSR_LOAD_ADDR_HIGH_STR[] = "ENTRY_MSR_LOAD_ADDR_HIGH";
431 static const char VMCS_EXEC_PTR_STR[] = "VMCS_EXEC_PTR";
432 static const char VMCS_EXEC_PTR_HIGH_STR[] = "VMCS_EXEC_PTR_HIGH";
433 static const char VMCS_TSC_OFFSET_STR[] = "TSC_OFFSET";
434 static const char VMCS_TSC_OFFSET_HIGH_STR[] = "TSC_OFFSET_HIGH";
435 static const char VMCS_VAPIC_ADDR_STR[] = "VAPIC_PAGE_ADDR";
436 static const char VMCS_VAPIC_ADDR_HIGH_STR[] = "VAPIC_PAGE_ADDR_HIGH";
437 static const char VMCS_LINK_PTR_STR[] = "VMCS_LINK_PTR";
438 static const char VMCS_LINK_PTR_HIGH_STR[] = "VMCS_LINK_PTR_HIGH";
439 static const char VMCS_GUEST_DBG_CTL_STR[] = "GUEST_DEBUG_CTL";
440 static const char VMCS_GUEST_DBG_CTL_HIGH_STR[] = "GUEST_DEBUG_CTL_HIGH";
441 static const char VMCS_GUEST_PERF_GLOBAL_CTRL_STR[] = "GUEST_PERF_GLOBAL_CTRL";
442 static const char VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH_STR[] = "GUEST_PERF_GLOBAL_CTRL_HIGH";
443 static const char VMCS_PIN_CTRLS_STR[] = "PIN_VM_EXEC_CTRLS";
444 static const char VMCS_PROC_CTRLS_STR[] = "PROC_VM_EXEC_CTRLS";
445 static const char VMCS_EXCP_BITMAP_STR[] = "EXCEPTION_BITMAP";
446 static const char VMCS_PG_FAULT_ERR_MASK_STR[] = "PAGE_FAULT_ERROR_MASK";
447 static const char VMCS_PG_FAULT_ERR_MATCH_STR[] = "PAGE_FAULT_ERROR_MATCH";
448 static const char VMCS_CR3_TGT_CNT_STR[] = "CR3_TARGET_COUNT";
449 static const char VMCS_EXIT_CTRLS_STR[] = "VM_EXIT_CTRLS";
450 static const char VMCS_EXIT_MSR_STORE_CNT_STR[] = "VM_EXIT_MSR_STORE_COUNT";
451 static const char VMCS_EXIT_MSR_LOAD_CNT_STR[] = "VM_EXIT_MSR_LOAD_COUNT";
452 static const char VMCS_ENTRY_CTRLS_STR[] = "VM_ENTRY_CTRLS";
453 static const char VMCS_ENTRY_MSR_LOAD_CNT_STR[] = "VM_ENTRY_MSR_LOAD_COUNT";
454 static const char VMCS_ENTRY_INT_INFO_STR[] = "VM_ENTRY_INT_INFO_FIELD";
455 static const char VMCS_ENTRY_EXCP_ERR_STR[] = "VM_ENTRY_EXCEPTION_ERROR";
456 static const char VMCS_ENTRY_INSTR_LEN_STR[] = "VM_ENTRY_INSTR_LENGTH";
457 static const char VMCS_TPR_THRESHOLD_STR[] = "TPR_THRESHOLD";
458 static const char VMCS_INSTR_ERR_STR[] = "VM_INSTR_ERROR";
459 static const char VMCS_EXIT_REASON_STR[] = "EXIT_REASON";
460 static const char VMCS_EXIT_INT_INFO_STR[] = "VM_EXIT_INT_INFO";
461 static const char VMCS_EXIT_INT_ERR_STR[] = "VM_EXIT_INT_ERROR";
462 static const char VMCS_IDT_VECTOR_INFO_STR[] = "IDT_VECTOR_INFO";
463 static const char VMCS_IDT_VECTOR_ERR_STR[] = "IDT_VECTOR_ERROR";
464 static const char VMCS_EXIT_INSTR_LEN_STR[] = "VM_EXIT_INSTR_LENGTH";
465 static const char VMCS_VMX_INSTR_INFO_STR[] = "VMX_INSTR_INFO";
466 static const char VMCS_GUEST_ES_LIMIT_STR[] = "GUEST_ES_LIMIT";
467 static const char VMCS_GUEST_CS_LIMIT_STR[] = "GUEST_CS_LIMIT";
468 static const char VMCS_GUEST_SS_LIMIT_STR[] = "GUEST_SS_LIMIT";
469 static const char VMCS_GUEST_DS_LIMIT_STR[] = "GUEST_DS_LIMIT";
470 static const char VMCS_GUEST_FS_LIMIT_STR[] = "GUEST_FS_LIMIT";
471 static const char VMCS_GUEST_GS_LIMIT_STR[] = "GUEST_GS_LIMIT";
472 static const char VMCS_GUEST_LDTR_LIMIT_STR[] = "GUEST_LDTR_LIMIT";
473 static const char VMCS_GUEST_TR_LIMIT_STR[] = "GUEST_TR_LIMIT";
474 static const char VMCS_GUEST_GDTR_LIMIT_STR[] = "GUEST_GDTR_LIMIT";
475 static const char VMCS_GUEST_IDTR_LIMIT_STR[] = "GUEST_IDTR_LIMIT";
476 static const char VMCS_GUEST_ES_ACCESS_STR[] = "GUEST_ES_ACCESS";
477 static const char VMCS_GUEST_CS_ACCESS_STR[] = "GUEST_CS_ACCESS";
478 static const char VMCS_GUEST_SS_ACCESS_STR[] = "GUEST_SS_ACCESS";
479 static const char VMCS_GUEST_DS_ACCESS_STR[] = "GUEST_DS_ACCESS";
480 static const char VMCS_GUEST_FS_ACCESS_STR[] = "GUEST_FS_ACCESS";
481 static const char VMCS_GUEST_GS_ACCESS_STR[] = "GUEST_GS_ACCESS";
482 static const char VMCS_GUEST_LDTR_ACCESS_STR[] = "GUEST_LDTR_ACCESS";
483 static const char VMCS_GUEST_TR_ACCESS_STR[] = "GUEST_TR_ACCESS";
484 static const char VMCS_GUEST_INT_STATE_STR[] = "GUEST_INT_STATE";
485 static const char VMCS_GUEST_ACTIVITY_STATE_STR[] = "GUEST_ACTIVITY_STATE";
486 static const char VMCS_GUEST_SMBASE_STR[] = "GUEST_SMBASE";
487 static const char VMCS_GUEST_SYSENTER_CS_STR[] = "GUEST_SYSENTER_CS";
488 static const char VMCS_HOST_SYSENTER_CS_STR[] = "HOST_SYSENTER_CS";
489 static const char VMCS_CR0_MASK_STR[] = "CR0_GUEST_HOST_MASK";
490 static const char VMCS_CR4_MASK_STR[] = "CR4_GUEST_HOST_MASK";
491 static const char VMCS_CR0_READ_SHDW_STR[] = "CR0_READ_SHADOW";
492 static const char VMCS_CR4_READ_SHDW_STR[] = "CR4_READ_SHADOW";
493 static const char VMCS_CR3_TGT_VAL_0_STR[] = "CR3_TARGET_VALUE_0";
494 static const char VMCS_CR3_TGT_VAL_1_STR[] = "CR3_TARGET_VALUE_1";
495 static const char VMCS_CR3_TGT_VAL_2_STR[] = "CR3_TARGET_VALUE_2";
496 static const char VMCS_CR3_TGT_VAL_3_STR[] = "CR3_TARGET_VALUE_3";
497 static const char VMCS_EXIT_QUAL_STR[] = "EXIT_QUALIFICATION";
498 static const char VMCS_IO_RCX_STR[] = "IO_RCX";
499 static const char VMCS_IO_RSI_STR[] = "IO_RSI";
500 static const char VMCS_IO_RDI_STR[] = "IO_RDI";
501 static const char VMCS_IO_RIP_STR[] = "IO_RIP";
502 static const char VMCS_GUEST_LINEAR_ADDR_STR[] = "GUEST_LINEAR_ADDR";
503 static const char VMCS_GUEST_CR0_STR[] = "GUEST_CR0";
504 static const char VMCS_GUEST_CR3_STR[] = "GUEST_CR3";
505 static const char VMCS_GUEST_CR4_STR[] = "GUEST_CR4";
506 static const char VMCS_GUEST_ES_BASE_STR[] = "GUEST_ES_BASE";
507 static const char VMCS_GUEST_CS_BASE_STR[] = "GUEST_CS_BASE";
508 static const char VMCS_GUEST_SS_BASE_STR[] = "GUEST_SS_BASE";
509 static const char VMCS_GUEST_DS_BASE_STR[] = "GUEST_DS_BASE";
510 static const char VMCS_GUEST_FS_BASE_STR[] = "GUEST_FS_BASE";
511 static const char VMCS_GUEST_GS_BASE_STR[] = "GUEST_GS_BASE";
512 static const char VMCS_GUEST_LDTR_BASE_STR[] = "GUEST_LDTR_BASE";
513 static const char VMCS_GUEST_TR_BASE_STR[] = "GUEST_TR_BASE";
514 static const char VMCS_GUEST_GDTR_BASE_STR[] = "GUEST_GDTR_BASE";
515 static const char VMCS_GUEST_IDTR_BASE_STR[] = "GUEST_IDTR_BASE";
516 static const char VMCS_GUEST_DR7_STR[] = "GUEST_DR7";
517 static const char VMCS_GUEST_RSP_STR[] = "GUEST_RSP";
518 static const char VMCS_GUEST_RIP_STR[] = "GUEST_RIP";
519 static const char VMCS_GUEST_RFLAGS_STR[] = "GUEST_RFLAGS";
520 static const char VMCS_GUEST_PENDING_DBG_EXCP_STR[] = "GUEST_PENDING_DEBUG_EXCS";
521 static const char VMCS_GUEST_SYSENTER_ESP_STR[] = "GUEST_SYSENTER_ESP";
522 static const char VMCS_GUEST_SYSENTER_EIP_STR[] = "GUEST_SYSENTER_EIP";
523 static const char VMCS_HOST_CR0_STR[] = "HOST_CR0";
524 static const char VMCS_HOST_CR3_STR[] = "HOST_CR3";
525 static const char VMCS_HOST_CR4_STR[] = "HOST_CR4";
526 static const char VMCS_HOST_FS_BASE_STR[] = "HOST_FS_BASE";
527 static const char VMCS_HOST_GS_BASE_STR[] = "HOST_GS_BASE";
528 static const char VMCS_HOST_TR_BASE_STR[] = "HOST_TR_BASE";
529 static const char VMCS_HOST_GDTR_BASE_STR[] = "HOST_GDTR_BASE";
530 static const char VMCS_HOST_IDTR_BASE_STR[] = "HOST_IDTR_BASE";
531 static const char VMCS_HOST_SYSENTER_ESP_STR[] = "HOST_SYSENTER_ESP";
532 static const char VMCS_HOST_SYSENTER_EIP_STR[] = "HOST_SYSENTER_EIP";
533 static const char VMCS_HOST_RSP_STR[] = "HOST_RSP";
534 static const char VMCS_HOST_RIP_STR[] = "HOST_RIP";
535
536
537
538 const char * v3_vmcs_field_to_str(vmcs_field_t field) {   
539     switch (field) {
540         case VMCS_GUEST_ES_SELECTOR:
541             return VMCS_GUEST_ES_SELECTOR_STR;
542         case VMCS_GUEST_CS_SELECTOR:
543             return VMCS_GUEST_CS_SELECTOR_STR;
544         case VMCS_GUEST_SS_SELECTOR:
545             return VMCS_GUEST_SS_SELECTOR_STR;
546         case VMCS_GUEST_DS_SELECTOR:
547             return VMCS_GUEST_DS_SELECTOR_STR;
548         case VMCS_GUEST_FS_SELECTOR:
549             return VMCS_GUEST_FS_SELECTOR_STR;
550         case VMCS_GUEST_GS_SELECTOR:
551             return VMCS_GUEST_GS_SELECTOR_STR;
552         case VMCS_GUEST_LDTR_SELECTOR:
553             return VMCS_GUEST_LDTR_SELECTOR_STR;
554         case VMCS_GUEST_TR_SELECTOR:
555             return VMCS_GUEST_TR_SELECTOR_STR;
556         case VMCS_HOST_ES_SELECTOR:
557             return VMCS_HOST_ES_SELECTOR_STR;
558         case VMCS_HOST_CS_SELECTOR:
559             return VMCS_HOST_CS_SELECTOR_STR;
560         case VMCS_HOST_SS_SELECTOR:
561             return VMCS_HOST_SS_SELECTOR_STR;
562         case VMCS_HOST_DS_SELECTOR:
563             return VMCS_HOST_DS_SELECTOR_STR;
564         case VMCS_HOST_FS_SELECTOR:
565             return VMCS_HOST_FS_SELECTOR_STR;
566         case VMCS_HOST_GS_SELECTOR:
567             return VMCS_HOST_GS_SELECTOR_STR;
568         case VMCS_HOST_TR_SELECTOR:
569             return VMCS_HOST_TR_SELECTOR_STR;
570         case VMCS_IO_BITMAP_A_ADDR:
571             return VMCS_IO_BITMAP_A_ADDR_STR;
572         case VMCS_IO_BITMAP_A_ADDR_HIGH:
573             return VMCS_IO_BITMAP_A_ADDR_HIGH_STR;
574         case VMCS_IO_BITMAP_B_ADDR:
575             return VMCS_IO_BITMAP_B_ADDR_STR;
576         case VMCS_IO_BITMAP_B_ADDR_HIGH:
577             return VMCS_IO_BITMAP_B_ADDR_HIGH_STR;
578         case VMCS_MSR_BITMAP:
579             return VMCS_MSR_BITMAP_STR;
580         case VMCS_MSR_BITMAP_HIGH:
581             return VMCS_MSR_BITMAP_HIGH_STR;
582         case VMCS_EXIT_MSR_STORE_ADDR:
583             return VMCS_EXIT_MSR_STORE_ADDR_STR;
584         case VMCS_EXIT_MSR_STORE_ADDR_HIGH:
585             return VMCS_EXIT_MSR_STORE_ADDR_HIGH_STR;
586         case VMCS_EXIT_MSR_LOAD_ADDR:
587             return VMCS_EXIT_MSR_LOAD_ADDR_STR;
588         case VMCS_EXIT_MSR_LOAD_ADDR_HIGH:
589             return VMCS_EXIT_MSR_LOAD_ADDR_HIGH_STR;
590         case VMCS_ENTRY_MSR_LOAD_ADDR:
591             return VMCS_ENTRY_MSR_LOAD_ADDR_STR;
592         case VMCS_ENTRY_MSR_LOAD_ADDR_HIGH:
593             return VMCS_ENTRY_MSR_LOAD_ADDR_HIGH_STR;
594         case VMCS_EXEC_PTR:
595             return VMCS_EXEC_PTR_STR;
596         case VMCS_EXEC_PTR_HIGH:
597             return VMCS_EXEC_PTR_HIGH_STR;
598         case VMCS_TSC_OFFSET:
599             return VMCS_TSC_OFFSET_STR;
600         case VMCS_TSC_OFFSET_HIGH:
601             return VMCS_TSC_OFFSET_HIGH_STR;
602         case VMCS_VAPIC_ADDR:
603             return VMCS_VAPIC_ADDR_STR;
604         case VMCS_VAPIC_ADDR_HIGH:
605             return VMCS_VAPIC_ADDR_HIGH_STR;
606         case VMCS_LINK_PTR:
607             return VMCS_LINK_PTR_STR;
608         case VMCS_LINK_PTR_HIGH:
609             return VMCS_LINK_PTR_HIGH_STR;
610         case VMCS_GUEST_DBG_CTL:
611             return VMCS_GUEST_DBG_CTL_STR;
612         case VMCS_GUEST_DBG_CTL_HIGH:
613             return VMCS_GUEST_DBG_CTL_HIGH_STR;
614         case VMCS_GUEST_PERF_GLOBAL_CTRL:
615             return VMCS_GUEST_PERF_GLOBAL_CTRL_STR;
616         case VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH:
617             return VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH_STR;
618         case VMCS_PIN_CTRLS:
619             return VMCS_PIN_CTRLS_STR;
620         case VMCS_PROC_CTRLS:
621             return VMCS_PROC_CTRLS_STR;
622         case VMCS_EXCP_BITMAP:
623             return VMCS_EXCP_BITMAP_STR;
624         case VMCS_PG_FAULT_ERR_MASK:
625             return VMCS_PG_FAULT_ERR_MASK_STR;
626         case VMCS_PG_FAULT_ERR_MATCH:
627             return VMCS_PG_FAULT_ERR_MATCH_STR;
628         case VMCS_CR3_TGT_CNT:
629             return VMCS_CR3_TGT_CNT_STR;
630         case VMCS_EXIT_CTRLS:
631             return VMCS_EXIT_CTRLS_STR;
632         case VMCS_EXIT_MSR_STORE_CNT:
633             return VMCS_EXIT_MSR_STORE_CNT_STR;
634         case VMCS_EXIT_MSR_LOAD_CNT:
635             return VMCS_EXIT_MSR_LOAD_CNT_STR;
636         case VMCS_ENTRY_CTRLS:
637             return VMCS_ENTRY_CTRLS_STR;
638         case VMCS_ENTRY_MSR_LOAD_CNT:
639             return VMCS_ENTRY_MSR_LOAD_CNT_STR;
640         case VMCS_ENTRY_INT_INFO:
641             return VMCS_ENTRY_INT_INFO_STR;
642         case VMCS_ENTRY_EXCP_ERR:
643             return VMCS_ENTRY_EXCP_ERR_STR;
644         case VMCS_ENTRY_INSTR_LEN:
645             return VMCS_ENTRY_INSTR_LEN_STR;
646         case VMCS_TPR_THRESHOLD:
647             return VMCS_TPR_THRESHOLD_STR;
648         case VMCS_INSTR_ERR:
649             return VMCS_INSTR_ERR_STR;
650         case VMCS_EXIT_REASON:
651             return VMCS_EXIT_REASON_STR;
652         case VMCS_EXIT_INT_INFO:
653             return VMCS_EXIT_INT_INFO_STR;
654         case VMCS_EXIT_INT_ERR:
655             return VMCS_EXIT_INT_ERR_STR;
656         case VMCS_IDT_VECTOR_INFO:
657             return VMCS_IDT_VECTOR_INFO_STR;
658         case VMCS_IDT_VECTOR_ERR:
659             return VMCS_IDT_VECTOR_ERR_STR;
660         case VMCS_EXIT_INSTR_LEN:
661             return VMCS_EXIT_INSTR_LEN_STR;
662         case VMCS_VMX_INSTR_INFO:
663             return VMCS_VMX_INSTR_INFO_STR;
664         case VMCS_GUEST_ES_LIMIT:
665             return VMCS_GUEST_ES_LIMIT_STR;
666         case VMCS_GUEST_CS_LIMIT:
667             return VMCS_GUEST_CS_LIMIT_STR;
668         case VMCS_GUEST_SS_LIMIT:
669             return VMCS_GUEST_SS_LIMIT_STR;
670         case VMCS_GUEST_DS_LIMIT:
671             return VMCS_GUEST_DS_LIMIT_STR;
672         case VMCS_GUEST_FS_LIMIT:
673             return VMCS_GUEST_FS_LIMIT_STR;
674         case VMCS_GUEST_GS_LIMIT:
675             return VMCS_GUEST_GS_LIMIT_STR;
676         case VMCS_GUEST_LDTR_LIMIT:
677             return VMCS_GUEST_LDTR_LIMIT_STR;
678         case VMCS_GUEST_TR_LIMIT:
679             return VMCS_GUEST_TR_LIMIT_STR;
680         case VMCS_GUEST_GDTR_LIMIT:
681             return VMCS_GUEST_GDTR_LIMIT_STR;
682         case VMCS_GUEST_IDTR_LIMIT:
683             return VMCS_GUEST_IDTR_LIMIT_STR;
684         case VMCS_GUEST_ES_ACCESS:
685             return VMCS_GUEST_ES_ACCESS_STR;
686         case VMCS_GUEST_CS_ACCESS:
687             return VMCS_GUEST_CS_ACCESS_STR;
688         case VMCS_GUEST_SS_ACCESS:
689             return VMCS_GUEST_SS_ACCESS_STR;
690         case VMCS_GUEST_DS_ACCESS:
691             return VMCS_GUEST_DS_ACCESS_STR;
692         case VMCS_GUEST_FS_ACCESS:
693             return VMCS_GUEST_FS_ACCESS_STR;
694         case VMCS_GUEST_GS_ACCESS:
695             return VMCS_GUEST_GS_ACCESS_STR;
696         case VMCS_GUEST_LDTR_ACCESS:
697             return VMCS_GUEST_LDTR_ACCESS_STR;
698         case VMCS_GUEST_TR_ACCESS:
699             return VMCS_GUEST_TR_ACCESS_STR;
700         case VMCS_GUEST_INT_STATE:
701             return VMCS_GUEST_INT_STATE_STR;
702         case VMCS_GUEST_ACTIVITY_STATE:
703             return VMCS_GUEST_ACTIVITY_STATE_STR;
704         case VMCS_GUEST_SMBASE:
705             return VMCS_GUEST_SMBASE_STR;
706         case VMCS_GUEST_SYSENTER_CS:
707             return VMCS_GUEST_SYSENTER_CS_STR;
708         case VMCS_HOST_SYSENTER_CS:
709             return VMCS_HOST_SYSENTER_CS_STR;
710         case VMCS_CR0_MASK:
711             return VMCS_CR0_MASK_STR;
712         case VMCS_CR4_MASK:
713             return VMCS_CR4_MASK_STR;
714         case VMCS_CR0_READ_SHDW:
715             return VMCS_CR0_READ_SHDW_STR;
716         case VMCS_CR4_READ_SHDW:
717             return VMCS_CR4_READ_SHDW_STR;
718         case VMCS_CR3_TGT_VAL_0:
719             return VMCS_CR3_TGT_VAL_0_STR;
720         case VMCS_CR3_TGT_VAL_1:
721             return VMCS_CR3_TGT_VAL_1_STR;
722         case VMCS_CR3_TGT_VAL_2:
723             return VMCS_CR3_TGT_VAL_2_STR;
724         case VMCS_CR3_TGT_VAL_3:
725             return VMCS_CR3_TGT_VAL_3_STR;
726         case VMCS_EXIT_QUAL:
727             return VMCS_EXIT_QUAL_STR;
728         case VMCS_IO_RCX:
729             return VMCS_IO_RCX_STR;
730         case VMCS_IO_RSI:
731             return VMCS_IO_RSI_STR;
732         case VMCS_IO_RDI:
733             return VMCS_IO_RDI_STR;
734         case VMCS_IO_RIP:
735             return VMCS_IO_RIP_STR;
736         case VMCS_GUEST_LINEAR_ADDR:
737             return VMCS_GUEST_LINEAR_ADDR_STR;
738         case VMCS_GUEST_CR0:
739             return VMCS_GUEST_CR0_STR;
740         case VMCS_GUEST_CR3:
741             return VMCS_GUEST_CR3_STR;
742         case VMCS_GUEST_CR4:
743             return VMCS_GUEST_CR4_STR;
744         case VMCS_GUEST_ES_BASE:
745             return VMCS_GUEST_ES_BASE_STR;
746         case VMCS_GUEST_CS_BASE:
747             return VMCS_GUEST_CS_BASE_STR;
748         case VMCS_GUEST_SS_BASE:
749             return VMCS_GUEST_SS_BASE_STR;
750         case VMCS_GUEST_DS_BASE:
751             return VMCS_GUEST_DS_BASE_STR;
752         case VMCS_GUEST_FS_BASE:
753             return VMCS_GUEST_FS_BASE_STR;
754         case VMCS_GUEST_GS_BASE:
755             return VMCS_GUEST_GS_BASE_STR;
756         case VMCS_GUEST_LDTR_BASE:
757             return VMCS_GUEST_LDTR_BASE_STR;
758         case VMCS_GUEST_TR_BASE:
759             return VMCS_GUEST_TR_BASE_STR;
760         case VMCS_GUEST_GDTR_BASE:
761             return VMCS_GUEST_GDTR_BASE_STR;
762         case VMCS_GUEST_IDTR_BASE:
763             return VMCS_GUEST_IDTR_BASE_STR;
764         case VMCS_GUEST_DR7:
765             return VMCS_GUEST_DR7_STR;
766         case VMCS_GUEST_RSP:
767             return VMCS_GUEST_RSP_STR;
768         case VMCS_GUEST_RIP:
769             return VMCS_GUEST_RIP_STR;
770         case VMCS_GUEST_RFLAGS:
771             return VMCS_GUEST_RFLAGS_STR;
772         case VMCS_GUEST_PENDING_DBG_EXCP:
773             return VMCS_GUEST_PENDING_DBG_EXCP_STR;
774         case VMCS_GUEST_SYSENTER_ESP:
775             return VMCS_GUEST_SYSENTER_ESP_STR;
776         case VMCS_GUEST_SYSENTER_EIP:
777             return VMCS_GUEST_SYSENTER_EIP_STR;
778         case VMCS_HOST_CR0:
779             return VMCS_HOST_CR0_STR;
780         case VMCS_HOST_CR3:
781             return VMCS_HOST_CR3_STR;
782         case VMCS_HOST_CR4:
783             return VMCS_HOST_CR4_STR;
784         case VMCS_HOST_FS_BASE:
785             return VMCS_HOST_FS_BASE_STR;
786         case VMCS_HOST_GS_BASE:
787             return VMCS_HOST_GS_BASE_STR;
788         case VMCS_HOST_TR_BASE:
789             return VMCS_HOST_TR_BASE_STR;
790         case VMCS_HOST_GDTR_BASE:
791             return VMCS_HOST_GDTR_BASE_STR;
792         case VMCS_HOST_IDTR_BASE:
793             return VMCS_HOST_IDTR_BASE_STR;
794         case VMCS_HOST_SYSENTER_ESP:
795             return VMCS_HOST_SYSENTER_ESP_STR;
796         case VMCS_HOST_SYSENTER_EIP:
797             return VMCS_HOST_SYSENTER_EIP_STR;
798         case VMCS_HOST_RSP:
799             return VMCS_HOST_RSP_STR;
800         case VMCS_HOST_RIP:
801             return VMCS_HOST_RIP_STR;
802         default:
803             return NULL;
804     }
805 }
806
807
808