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.


e7f957088afea109d44e344f7ea0999521b69712
[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 #include <palacios/vmx.h>
24 #include <palacios/vm_guest_mem.h>
25 #include <palacios/vmm_ctrl_regs.h>
26 #include <palacios/vmm_lowlevel.h>
27
28 static void inline translate_v3_seg_to_access(struct v3_segment * v3_seg,  
29                                               struct vmcs_segment_access * access)
30 {
31     access->type = v3_seg->type;
32     access->desc_type = v3_seg->system;
33     access->dpl = v3_seg->dpl;
34     access->present = v3_seg->present;
35     access->avail = v3_seg->avail;
36     access->long_mode = v3_seg->long_mode;
37     access->db = v3_seg->db;
38     access->granularity = v3_seg->granularity;
39 }
40
41 static void inline translate_access_to_v3_seg(struct vmcs_segment_access * access, 
42                                               struct v3_segment * v3_seg)
43 {
44     v3_seg->type = access->type;
45     v3_seg->system = access->desc_type;
46     v3_seg->dpl = access->dpl;
47     v3_seg->present = access->present;
48     v3_seg->avail = access->avail;
49     v3_seg->long_mode = access->long_mode;
50     v3_seg->db = access->db;
51     v3_seg->granularity = access->granularity;
52 }
53
54
55 static int inline check_vmcs_write(vmcs_field_t field, addr_t val)
56 {
57     int ret = 0;
58     ret = vmcs_write(field, val);
59
60     if (ret != VMX_SUCCESS) {
61         PrintError("VMWRITE error on %s!: %d\n", v3_vmcs_field_to_str(field), ret);
62         return 1;
63     }
64
65     return 0;
66 }
67
68 static int inline check_vmcs_read(vmcs_field_t field, void * val)
69 {
70     int ret = 0;
71     ret = vmcs_read(field, val);
72
73     if (ret != VMX_SUCCESS) {
74         PrintError("VMREAD error on %s!: %d\n", v3_vmcs_field_to_str(field), ret);
75     }
76
77     return ret;
78 }
79
80 // static const char * v3_vmcs_field_to_str(vmcs_field_t field);
81
82 //extern char * exception_names;
83 //
84 // Ignores "HIGH" addresses - 32 bit only for now
85 //
86
87 int v3_update_vmcs_guest_state(struct guest_info * info)
88 {
89     int vmx_ret = 0;
90
91     vmx_ret |= check_vmcs_write(VMCS_GUEST_RIP, info->rip);
92     vmx_ret |= check_vmcs_write(VMCS_GUEST_RSP, info->vm_regs.rsp);
93     
94
95     vmx_ret |= check_vmcs_write(VMCS_GUEST_CR0, info->ctrl_regs.cr0);
96     vmx_ret |= check_vmcs_write(VMCS_CR0_READ_SHDW, info->shdw_pg_state.guest_cr0);
97     vmx_ret |= check_vmcs_write(VMCS_GUEST_CR3, info->ctrl_regs.cr3);
98     vmx_ret |= check_vmcs_write(VMCS_GUEST_CR4, info->ctrl_regs.cr4);
99     vmx_ret |= check_vmcs_write(VMCS_GUEST_DR7, info->dbg_regs.dr7);
100
101     vmx_ret |= check_vmcs_write(VMCS_GUEST_RFLAGS, info->ctrl_regs.rflags);
102     if (((struct vmx_data *)info->vmm_data)->ia32e_avail) {
103         vmx_ret |= check_vmcs_write(VMCS_GUEST_EFER, info->ctrl_regs.efer);
104     }
105
106
107     /*** Write VMCS Segments ***/
108     struct vmcs_segment_access access;
109
110     memset(&access, 0, sizeof(access));
111
112     /* CS Segment */
113     translate_v3_seg_to_access(&(info->segments.cs), &access);
114
115     vmx_ret |= check_vmcs_write(VMCS_GUEST_CS_BASE, info->segments.cs.base);
116     vmx_ret |= check_vmcs_write(VMCS_GUEST_CS_SELECTOR, info->segments.cs.selector);
117     vmx_ret |= check_vmcs_write(VMCS_GUEST_CS_LIMIT, info->segments.cs.limit);
118     vmx_ret |= check_vmcs_write(VMCS_GUEST_CS_ACCESS, access.value);
119
120     /* SS Segment */
121     memset(&access, 0, sizeof(access));
122     translate_v3_seg_to_access(&(info->segments.ss), &access);
123
124     vmx_ret |= check_vmcs_write(VMCS_GUEST_SS_BASE, info->segments.ss.base);
125     vmx_ret |= check_vmcs_write(VMCS_GUEST_SS_SELECTOR, info->segments.ss.selector);
126     vmx_ret |= check_vmcs_write(VMCS_GUEST_SS_LIMIT, info->segments.ss.limit);
127     vmx_ret |= check_vmcs_write(VMCS_GUEST_SS_ACCESS, access.value);
128
129     /* DS Segment */
130     memset(&access, 0, sizeof(access));
131     translate_v3_seg_to_access(&(info->segments.ds), &access);
132
133     vmx_ret |= check_vmcs_write(VMCS_GUEST_DS_BASE, info->segments.ds.base);
134     vmx_ret |= check_vmcs_write(VMCS_GUEST_DS_SELECTOR, info->segments.ds.selector);
135     vmx_ret |= check_vmcs_write(VMCS_GUEST_DS_LIMIT, info->segments.ds.limit);
136     vmx_ret |= check_vmcs_write(VMCS_GUEST_DS_ACCESS, access.value);
137
138
139     /* ES Segment */
140     memset(&access, 0, sizeof(access));
141     translate_v3_seg_to_access(&(info->segments.es), &access);
142
143     vmx_ret |= check_vmcs_write(VMCS_GUEST_ES_BASE, info->segments.es.base);
144     vmx_ret |= check_vmcs_write(VMCS_GUEST_ES_SELECTOR, info->segments.es.selector);
145     vmx_ret |= check_vmcs_write(VMCS_GUEST_ES_LIMIT, info->segments.es.limit);
146     vmx_ret |= check_vmcs_write(VMCS_GUEST_ES_ACCESS, access.value);
147
148     /* FS Segment */
149     memset(&access, 0, sizeof(access));
150     translate_v3_seg_to_access(&(info->segments.fs), &access);
151
152     vmx_ret |= check_vmcs_write(VMCS_GUEST_FS_BASE, info->segments.fs.base);
153     vmx_ret |= check_vmcs_write(VMCS_GUEST_FS_SELECTOR, info->segments.fs.selector);
154     vmx_ret |= check_vmcs_write(VMCS_GUEST_FS_LIMIT, info->segments.fs.limit);
155     vmx_ret |= check_vmcs_write(VMCS_GUEST_FS_ACCESS, access.value);
156
157     /* GS Segment */
158     memset(&access, 0, sizeof(access));
159     translate_v3_seg_to_access(&(info->segments.gs), &access);
160
161     vmx_ret |= check_vmcs_write(VMCS_GUEST_GS_BASE, info->segments.gs.base);
162     vmx_ret |= check_vmcs_write(VMCS_GUEST_GS_SELECTOR, info->segments.gs.selector);
163     vmx_ret |= check_vmcs_write(VMCS_GUEST_GS_LIMIT, info->segments.gs.limit);
164     vmx_ret |= check_vmcs_write(VMCS_GUEST_GS_ACCESS, access.value);
165
166     /* LDTR segment */
167     memset(&access, 0, sizeof(access));
168     translate_v3_seg_to_access(&(info->segments.ldtr), &access);
169
170     vmx_ret |= check_vmcs_write(VMCS_GUEST_LDTR_BASE, info->segments.ldtr.base);
171     vmx_ret |= check_vmcs_write(VMCS_GUEST_LDTR_SELECTOR, info->segments.ldtr.selector);
172     vmx_ret |= check_vmcs_write(VMCS_GUEST_LDTR_LIMIT, info->segments.ldtr.limit);
173     vmx_ret |= check_vmcs_write(VMCS_GUEST_LDTR_ACCESS, access.value);
174
175     /* TR Segment */
176     memset(&access, 0, sizeof(access));
177     translate_v3_seg_to_access(&(info->segments.tr), &access);
178
179     vmx_ret |= check_vmcs_write(VMCS_GUEST_TR_BASE, info->segments.tr.base);
180     vmx_ret |= check_vmcs_write(VMCS_GUEST_TR_SELECTOR, info->segments.tr.selector);
181     vmx_ret |= check_vmcs_write(VMCS_GUEST_TR_LIMIT, info->segments.tr.limit);
182     vmx_ret |= check_vmcs_write(VMCS_GUEST_TR_ACCESS, access.value);
183
184     /* GDTR Segment */
185
186     vmx_ret |= check_vmcs_write(VMCS_GUEST_GDTR_BASE, info->segments.gdtr.base);
187     vmx_ret |= check_vmcs_write(VMCS_GUEST_GDTR_LIMIT, info->segments.gdtr.limit);
188
189     /* IDTR Segment*/
190     vmx_ret |= check_vmcs_write(VMCS_GUEST_IDTR_BASE, info->segments.idtr.base);
191     vmx_ret |= check_vmcs_write(VMCS_GUEST_IDTR_LIMIT, info->segments.idtr.limit);
192
193     return vmx_ret;
194
195 }
196
197 int v3_update_vmcs_ctrl_fields(struct guest_info * info) {
198     int vmx_ret = 0;
199     struct vmx_data * arch_data = (struct vmx_data *)(info->vmm_data);
200
201     vmx_ret |= check_vmcs_write(VMCS_PIN_CTRLS, arch_data->pin_ctrls.value);
202     vmx_ret |= check_vmcs_write(VMCS_PROC_CTRLS, arch_data->pri_proc_ctrls.value);
203
204     if (arch_data->pri_proc_ctrls.sec_ctrls) {
205         vmx_ret |= check_vmcs_write(VMCS_SEC_PROC_CTRLS, arch_data->sec_proc_ctrls.value);
206     }
207
208     vmx_ret |= check_vmcs_write(VMCS_EXIT_CTRLS, arch_data->exit_ctrls.value);
209     vmx_ret |= check_vmcs_write(VMCS_ENTRY_CTRLS, arch_data->entry_ctrls.value);
210
211     return vmx_ret;
212 }
213
214 int v3_update_vmcs_host_state(struct guest_info * info) {
215     int vmx_ret = 0;
216     addr_t tmp;
217     struct vmx_data * arch_data = (struct vmx_data *)(info->vmm_data);
218     struct v3_msr tmp_msr;
219
220     __asm__ __volatile__ ( "movq    %%cr0, %0; "                
221                            : "=q"(tmp)
222                            :
223     );
224     vmx_ret |= check_vmcs_write(VMCS_HOST_CR0, tmp);
225
226
227     __asm__ __volatile__ ( "movq %%cr3, %0; "           
228                            : "=q"(tmp)
229                            :
230     );
231     vmx_ret |= check_vmcs_write(VMCS_HOST_CR3, tmp);
232
233
234     __asm__ __volatile__ ( "movq %%cr4, %0; "           
235                            : "=q"(tmp)
236                            :
237     );
238     vmx_ret |= check_vmcs_write(VMCS_HOST_CR4, tmp);
239
240
241
242     vmx_ret |= check_vmcs_write(VMCS_HOST_GDTR_BASE, arch_data->host_state.gdtr.base);
243     vmx_ret |= check_vmcs_write(VMCS_HOST_IDTR_BASE, arch_data->host_state.idtr.base);
244     vmx_ret |= check_vmcs_write(VMCS_HOST_TR_BASE, arch_data->host_state.tr.base);
245
246 #define FS_BASE_MSR 0xc0000100
247 #define GS_BASE_MSR 0xc0000101
248
249     // FS.BASE MSR
250     v3_get_msr(FS_BASE_MSR, &(tmp_msr.hi), &(tmp_msr.lo));
251     vmx_ret |= check_vmcs_write(VMCS_HOST_FS_BASE, tmp_msr.value);    
252
253     // GS.BASE MSR
254     v3_get_msr(GS_BASE_MSR, &(tmp_msr.hi), &(tmp_msr.lo));
255     vmx_ret |= check_vmcs_write(VMCS_HOST_GS_BASE, tmp_msr.value);    
256
257
258
259     __asm__ __volatile__ ( "movq %%cs, %0; "            
260                            : "=q"(tmp)
261                            :
262     );
263     vmx_ret |= check_vmcs_write(VMCS_HOST_CS_SELECTOR, tmp);
264
265     __asm__ __volatile__ ( "movq %%ss, %0; "            
266                            : "=q"(tmp)
267                            :
268     );
269     vmx_ret |= check_vmcs_write(VMCS_HOST_SS_SELECTOR, tmp);
270
271     __asm__ __volatile__ ( "movq %%ds, %0; "            
272                            : "=q"(tmp)
273                            :
274     );
275     vmx_ret |= check_vmcs_write(VMCS_HOST_DS_SELECTOR, tmp);
276
277     __asm__ __volatile__ ( "movq %%es, %0; "            
278                            : "=q"(tmp)
279                            :
280     );
281     vmx_ret |= check_vmcs_write(VMCS_HOST_ES_SELECTOR, tmp);
282
283     __asm__ __volatile__ ( "movq %%fs, %0; "            
284                            : "=q"(tmp)
285                            :
286     );
287     vmx_ret |= check_vmcs_write(VMCS_HOST_FS_SELECTOR, tmp);
288
289     __asm__ __volatile__ ( "movq %%gs, %0; "            
290                            : "=q"(tmp)
291                            :
292     );
293     vmx_ret |= check_vmcs_write(VMCS_HOST_GS_SELECTOR, tmp);
294
295     vmx_ret |= check_vmcs_write(VMCS_HOST_TR_SELECTOR, arch_data->host_state.tr.selector);
296
297
298 #define SYSENTER_CS_MSR 0x00000174
299 #define SYSENTER_ESP_MSR 0x00000175
300 #define SYSENTER_EIP_MSR 0x00000176
301
302    // SYSENTER CS MSR
303     v3_get_msr(SYSENTER_CS_MSR, &(tmp_msr.hi), &(tmp_msr.lo));
304     vmx_ret |= check_vmcs_write(VMCS_HOST_SYSENTER_CS, tmp_msr.lo);
305
306     // SYSENTER_ESP MSR
307     v3_get_msr(SYSENTER_ESP_MSR, &(tmp_msr.hi), &(tmp_msr.lo));
308     vmx_ret |= check_vmcs_write(VMCS_HOST_SYSENTER_ESP, tmp_msr.value);
309
310     // SYSENTER_EIP MSR
311     v3_get_msr(SYSENTER_EIP_MSR, &(tmp_msr.hi), &(tmp_msr.lo));
312     vmx_ret |= check_vmcs_write(VMCS_HOST_SYSENTER_EIP, tmp_msr.value);
313
314     return vmx_ret;
315 }
316
317
318 int v3_load_vmcs_guest_state(struct guest_info * info)
319 {
320
321     int error = 0;
322
323     check_vmcs_read(VMCS_GUEST_RIP, &(info->rip));
324     check_vmcs_read(VMCS_GUEST_RSP, &(info->vm_regs.rsp));
325
326     check_vmcs_read(VMCS_GUEST_CR0, &(info->ctrl_regs.cr0));
327     check_vmcs_read(VMCS_CR0_READ_SHDW, &(info->shdw_pg_state.guest_cr0));
328     check_vmcs_read(VMCS_GUEST_CR3, &(info->ctrl_regs.cr3));
329     check_vmcs_read(VMCS_GUEST_CR4, &(info->ctrl_regs.cr4));
330     check_vmcs_read(VMCS_GUEST_DR7, &(info->dbg_regs.dr7));
331
332     check_vmcs_read(VMCS_GUEST_RFLAGS, &(info->ctrl_regs.rflags));
333     if (((struct vmx_data *)info->vmm_data)->ia32e_avail) {
334         check_vmcs_read(VMCS_GUEST_EFER, &(info->ctrl_regs.efer));
335     }
336
337     // JRL: Add error checking
338
339     struct vmcs_segment_access access;
340     memset(&access, 0, sizeof(access));
341
342     /* CS Segment */
343     check_vmcs_read(VMCS_GUEST_CS_BASE, &(info->segments.cs.base));
344     check_vmcs_read(VMCS_GUEST_CS_SELECTOR, &(info->segments.cs.selector));
345     check_vmcs_read(VMCS_GUEST_CS_LIMIT, &(info->segments.cs.limit));
346     check_vmcs_read(VMCS_GUEST_CS_ACCESS, &(access.value));
347
348     translate_access_to_v3_seg(&access, &(info->segments.cs));
349
350     /* SS Segment */
351     check_vmcs_read(VMCS_GUEST_SS_BASE, &(info->segments.ss.base));
352     check_vmcs_read(VMCS_GUEST_SS_SELECTOR, &(info->segments.ss.selector));
353     check_vmcs_read(VMCS_GUEST_SS_LIMIT, &(info->segments.ss.limit));
354     check_vmcs_read(VMCS_GUEST_SS_ACCESS, &(access.value));
355
356     translate_access_to_v3_seg(&access, &(info->segments.ss));
357
358     /* DS Segment */
359     check_vmcs_read(VMCS_GUEST_DS_BASE, &(info->segments.ds.base));
360     check_vmcs_read(VMCS_GUEST_DS_SELECTOR, &(info->segments.ds.selector));
361     check_vmcs_read(VMCS_GUEST_DS_LIMIT, &(info->segments.ds.limit));
362     check_vmcs_read(VMCS_GUEST_DS_ACCESS, &(access.value));
363
364     translate_access_to_v3_seg(&access, &(info->segments.ds));
365
366     /* ES Segment */
367     check_vmcs_read(VMCS_GUEST_ES_BASE, &(info->segments.es.base));
368     check_vmcs_read(VMCS_GUEST_ES_SELECTOR, &(info->segments.es.selector));
369     check_vmcs_read(VMCS_GUEST_ES_LIMIT, &(info->segments.es.limit));
370     check_vmcs_read(VMCS_GUEST_ES_ACCESS, &(access.value));
371
372     translate_access_to_v3_seg(&access, &(info->segments.es));
373
374     /* FS Segment */
375     check_vmcs_read(VMCS_GUEST_FS_BASE, &(info->segments.fs.base));
376     check_vmcs_read(VMCS_GUEST_FS_SELECTOR, &(info->segments.fs.selector));
377     check_vmcs_read(VMCS_GUEST_FS_LIMIT, &(info->segments.fs.limit));
378     check_vmcs_read(VMCS_GUEST_FS_ACCESS, &(access.value));
379
380     translate_access_to_v3_seg(&access, &(info->segments.fs));
381
382     /* GS Segment */
383     check_vmcs_read(VMCS_GUEST_GS_BASE, &(info->segments.gs.base));
384     check_vmcs_read(VMCS_GUEST_GS_SELECTOR, &(info->segments.gs.selector));
385     check_vmcs_read(VMCS_GUEST_GS_LIMIT, &(info->segments.gs.limit));
386     check_vmcs_read(VMCS_GUEST_GS_ACCESS, &(access.value));
387
388     translate_access_to_v3_seg(&access, &(info->segments.gs));
389
390     /* LDTR Segment */
391     check_vmcs_read(VMCS_GUEST_LDTR_BASE, &(info->segments.ldtr.base));
392     check_vmcs_read(VMCS_GUEST_LDTR_SELECTOR, &(info->segments.ldtr.selector));
393     check_vmcs_read(VMCS_GUEST_LDTR_LIMIT, &(info->segments.ldtr.limit));
394     check_vmcs_read(VMCS_GUEST_LDTR_ACCESS, &(access.value));
395
396     translate_access_to_v3_seg(&access, &(info->segments.ldtr));
397
398     /* TR Segment */
399     check_vmcs_read(VMCS_GUEST_TR_BASE, &(info->segments.tr.base));
400     check_vmcs_read(VMCS_GUEST_TR_SELECTOR, &(info->segments.tr.selector));
401     check_vmcs_read(VMCS_GUEST_TR_LIMIT, &(info->segments.tr.limit));
402     check_vmcs_read(VMCS_GUEST_TR_ACCESS, &(access.value));
403
404     translate_access_to_v3_seg(&access, &(info->segments.tr));
405
406     /* GDTR Segment */
407     check_vmcs_read(VMCS_GUEST_GDTR_BASE, &(info->segments.gdtr.base));
408     check_vmcs_read(VMCS_GUEST_GDTR_LIMIT, &(info->segments.gdtr.limit));
409     
410     /* IDTR Segment */
411     check_vmcs_read(VMCS_GUEST_IDTR_BASE, &(info->segments.idtr.base));
412     check_vmcs_read(VMCS_GUEST_IDTR_LIMIT, &(info->segments.idtr.limit));
413     
414     return error;
415 }
416
417 static inline void print_vmcs_field(vmcs_field_t vmcs_index) {
418     int len = v3_vmcs_get_field_len(vmcs_index);
419     addr_t val;
420     
421     if (vmcs_read(vmcs_index, &val) != VMX_SUCCESS) {
422         PrintError("VMCS_READ error for %s\n", v3_vmcs_field_to_str(vmcs_index));
423         return;
424     };
425     
426     if (len == 2) {
427         PrintDebug("\t%s: 0x%.4x\n", v3_vmcs_field_to_str(vmcs_index), (uint16_t)val);
428     } else if (len == 4) {
429         PrintDebug("\t%s: 0x%.8x\n", v3_vmcs_field_to_str(vmcs_index), (uint32_t)val);
430     } else if (len == 8) {
431         PrintDebug("\t%s: 0x%p\n", v3_vmcs_field_to_str(vmcs_index), (void *)(addr_t)val);
432     }
433 }
434
435
436
437 static void print_guest_state()
438 {
439     PrintDebug("VMCS_GUEST_STATE\n");
440     print_vmcs_field(VMCS_GUEST_RIP);
441     print_vmcs_field(VMCS_GUEST_RSP);
442     print_vmcs_field(VMCS_GUEST_RFLAGS);
443     print_vmcs_field(VMCS_GUEST_CR0);
444     print_vmcs_field(VMCS_GUEST_CR3);
445     print_vmcs_field(VMCS_GUEST_CR4);
446     print_vmcs_field(VMCS_GUEST_DR7);
447
448
449     PrintDebug("\n");
450
451     PrintDebug("   ==> CS\n");
452     print_vmcs_field(VMCS_GUEST_CS_SELECTOR);
453     print_vmcs_field(VMCS_GUEST_CS_BASE);
454     print_vmcs_field(VMCS_GUEST_CS_LIMIT);
455     print_vmcs_field(VMCS_GUEST_CS_ACCESS);
456
457     PrintDebug("   ==> SS\n");
458     print_vmcs_field(VMCS_GUEST_SS_SELECTOR);
459     print_vmcs_field(VMCS_GUEST_SS_BASE);
460     print_vmcs_field(VMCS_GUEST_SS_LIMIT);
461     print_vmcs_field(VMCS_GUEST_SS_ACCESS);
462
463     PrintDebug("   ==> DS\n");
464     print_vmcs_field(VMCS_GUEST_DS_SELECTOR);
465     print_vmcs_field(VMCS_GUEST_DS_BASE);
466     print_vmcs_field(VMCS_GUEST_DS_LIMIT);
467     print_vmcs_field(VMCS_GUEST_DS_ACCESS);
468
469     PrintDebug("   ==> ES\n");
470     print_vmcs_field(VMCS_GUEST_ES_SELECTOR);
471     print_vmcs_field(VMCS_GUEST_ES_BASE);
472     print_vmcs_field(VMCS_GUEST_ES_LIMIT);
473     print_vmcs_field(VMCS_GUEST_ES_ACCESS);
474
475     PrintDebug("   ==> FS\n");
476     print_vmcs_field(VMCS_GUEST_FS_SELECTOR);
477     print_vmcs_field(VMCS_GUEST_FS_BASE);
478     print_vmcs_field(VMCS_GUEST_FS_LIMIT);
479     print_vmcs_field(VMCS_GUEST_FS_ACCESS);
480
481     PrintDebug("   ==> GS\n");
482     print_vmcs_field(VMCS_GUEST_GS_SELECTOR);
483     print_vmcs_field(VMCS_GUEST_GS_BASE);
484     print_vmcs_field(VMCS_GUEST_GS_LIMIT);
485     print_vmcs_field(VMCS_GUEST_GS_ACCESS);
486
487     PrintDebug("   ==> LDTR\n");
488     print_vmcs_field(VMCS_GUEST_LDTR_SELECTOR);
489     print_vmcs_field(VMCS_GUEST_LDTR_BASE);
490     print_vmcs_field(VMCS_GUEST_LDTR_LIMIT);
491     print_vmcs_field(VMCS_GUEST_LDTR_ACCESS);
492
493     PrintDebug("   ==> TR\n");
494     print_vmcs_field(VMCS_GUEST_TR_SELECTOR);
495     print_vmcs_field(VMCS_GUEST_TR_BASE);
496     print_vmcs_field(VMCS_GUEST_TR_LIMIT);
497     print_vmcs_field(VMCS_GUEST_TR_ACCESS);
498
499     PrintDebug("   ==> GDTR\n");
500     print_vmcs_field(VMCS_GUEST_GDTR_BASE);
501     print_vmcs_field(VMCS_GUEST_GDTR_LIMIT);
502
503     PrintDebug("   ==> IDTR\n");
504     print_vmcs_field(VMCS_GUEST_IDTR_BASE);
505     print_vmcs_field(VMCS_GUEST_IDTR_LIMIT);
506
507     PrintDebug("\n");
508
509     print_vmcs_field(VMCS_GUEST_DBG_CTL);
510 #ifdef __V3_32BIT__
511     print_vmcs_field(VMCS_GUEST_DBG_CTL_HIGH);
512 #endif
513     print_vmcs_field(VMCS_GUEST_SYSENTER_CS);
514     print_vmcs_field(VMCS_GUEST_SYSENTER_ESP);
515     print_vmcs_field(VMCS_GUEST_SYSENTER_EIP);
516
517     print_vmcs_field(VMCS_GUEST_PERF_GLOBAL_CTRL);
518 #ifdef __V3_32BIT__
519     print_vmcs_field(VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH);
520 #endif
521
522     print_vmcs_field(VMCS_GUEST_SMBASE);
523
524
525     PrintDebug("GUEST_NON_REGISTER_STATE\n");
526
527     print_vmcs_field(VMCS_GUEST_ACTIVITY_STATE);
528     print_vmcs_field(VMCS_GUEST_INT_STATE);
529     print_vmcs_field(VMCS_GUEST_PENDING_DBG_EXCP);
530
531 }
532        
533 static void print_host_state()
534 {
535     PrintDebug("VMCS_HOST_STATE\n");
536
537     print_vmcs_field(VMCS_HOST_RIP);
538     print_vmcs_field(VMCS_HOST_RSP);
539     print_vmcs_field(VMCS_HOST_CR0);
540     print_vmcs_field(VMCS_HOST_CR3);
541     print_vmcs_field(VMCS_HOST_CR4);
542     
543     PrintDebug("\n");
544     print_vmcs_field(VMCS_HOST_CS_SELECTOR);
545     print_vmcs_field(VMCS_HOST_SS_SELECTOR);
546     print_vmcs_field(VMCS_HOST_DS_SELECTOR);
547     print_vmcs_field(VMCS_HOST_ES_SELECTOR);
548     print_vmcs_field(VMCS_HOST_FS_SELECTOR);
549     print_vmcs_field(VMCS_HOST_GS_SELECTOR);
550     print_vmcs_field(VMCS_HOST_TR_SELECTOR);
551
552     PrintDebug("\n");
553     print_vmcs_field(VMCS_HOST_FS_BASE);
554     print_vmcs_field(VMCS_HOST_GS_BASE);
555     print_vmcs_field(VMCS_HOST_TR_BASE);
556     print_vmcs_field(VMCS_HOST_GDTR_BASE);
557     print_vmcs_field(VMCS_HOST_IDTR_BASE);
558
559     PrintDebug("\n");
560     print_vmcs_field(VMCS_HOST_SYSENTER_CS);
561     print_vmcs_field(VMCS_HOST_SYSENTER_ESP);
562     print_vmcs_field(VMCS_HOST_SYSENTER_EIP);
563
564     print_vmcs_field(VMCS_HOST_PERF_GLOBAL_CTRL);
565 #ifdef __V3_32BIT__
566     print_vmcs_field(VMCS_HOST_PERF_GLOBAL_CTRL_HIGH);
567 #endif
568 }
569
570
571 static void print_exec_ctrls() {
572     PrintDebug("VMCS_EXEC_CTRL_FIELDS\n");
573     print_vmcs_field(VMCS_PIN_CTRLS);
574     print_vmcs_field(VMCS_PROC_CTRLS);
575     print_vmcs_field(VMCS_SEC_PROC_CTRLS);
576     
577     print_vmcs_field(VMCS_EXCP_BITMAP);
578     print_vmcs_field(VMCS_PG_FAULT_ERR_MASK);
579     print_vmcs_field(VMCS_PG_FAULT_ERR_MATCH);
580
581     print_vmcs_field(VMCS_IO_BITMAP_A_ADDR);
582 #ifdef __V3_32BIT__
583     print_vmcs_field(VMCS_IO_BITMAP_A_ADDR_HIGH);
584 #endif
585     print_vmcs_field(VMCS_IO_BITMAP_B_ADDR);
586 #ifdef __V3_32BIT__
587     print_vmcs_field(VMCS_IO_BITMAP_B_ADDR_HIGH);
588 #endif
589
590     print_vmcs_field(VMCS_TSC_OFFSET);
591 #ifdef __V3_32BIT__
592     print_vmcs_field(VMCS_TSC_OFFSET_HIGH);
593 #endif
594
595     PrintDebug("\n");
596
597     print_vmcs_field(VMCS_CR0_MASK);
598     print_vmcs_field(VMCS_CR0_READ_SHDW);
599     print_vmcs_field(VMCS_CR4_MASK);
600     print_vmcs_field(VMCS_CR4_READ_SHDW);
601
602     print_vmcs_field(VMCS_CR3_TGT_CNT);
603     print_vmcs_field(VMCS_CR3_TGT_VAL_0);
604     print_vmcs_field(VMCS_CR3_TGT_VAL_1);
605     print_vmcs_field(VMCS_CR3_TGT_VAL_2);
606     print_vmcs_field(VMCS_CR3_TGT_VAL_3);
607
608     PrintDebug("\n");
609
610     print_vmcs_field(VMCS_APIC_ACCESS_ADDR);    
611 #ifdef __V3_32BIT__
612     print_vmcs_field(VMCS_APIC_ACCESS_ADDR_HIGH);
613 #endif
614
615     print_vmcs_field(VMCS_VAPIC_ADDR);    
616 #ifdef __V3_32BIT__
617     print_vmcs_field(VMCS_VAPIC_ADDR_HIGH);
618 #endif
619
620     print_vmcs_field(VMCS_TPR_THRESHOLD);
621
622     print_vmcs_field(VMCS_MSR_BITMAP);
623 #ifdef __V3_32BIT__
624     print_vmcs_field(VMCS_MSR_BITMAP_HIGH);
625 #endif
626
627     print_vmcs_field(VMCS_EXEC_PTR);
628 #ifdef __V3_32BIT__
629     print_vmcs_field(VMCS_EXEC_PTR_HIGH);
630 #endif
631 }
632
633
634 static void print_exit_ctrls() {
635     PrintDebug("VMCS_EXIT_CTRLS\n");
636
637     print_vmcs_field(VMCS_EXIT_CTRLS);
638
639
640     print_vmcs_field(VMCS_EXIT_MSR_STORE_CNT);
641     print_vmcs_field(VMCS_EXIT_MSR_STORE_ADDR);
642 #ifdef __V3_32BIT__
643     print_vmcs_field(VMCS_EXIT_MSR_STORE_ADDR_HIGH);
644 #endif
645
646     print_vmcs_field(VMCS_EXIT_MSR_LOAD_CNT);
647     print_vmcs_field(VMCS_EXIT_MSR_LOAD_ADDR);
648 #ifdef __V3_32BIT__
649     print_vmcs_field(VMCS_EXIT_MSR_LOAD_ADDR_HIGH);
650 #endif
651
652 }
653
654
655 static void print_entry_ctrls() {
656     PrintDebug("VMCS_ENTRY_CTRLS\n");
657     
658     print_vmcs_field(VMCS_ENTRY_CTRLS);
659
660     print_vmcs_field(VMCS_ENTRY_MSR_LOAD_CNT);
661     print_vmcs_field(VMCS_ENTRY_MSR_LOAD_ADDR);
662 #ifdef __V3_32BIT__
663     print_vmcs_field(VMCS_ENTRY_MSR_LOAD_ADDR_HIGH);
664 #endif
665
666     print_vmcs_field(VMCS_ENTRY_INT_INFO);
667     print_vmcs_field(VMCS_ENTRY_EXCP_ERR);
668     print_vmcs_field(VMCS_ENTRY_INSTR_LEN);
669
670
671 }
672
673
674 static void print_exit_info() {
675     PrintDebug("VMCS_EXIT_INFO\n");
676
677     print_vmcs_field(VMCS_EXIT_REASON);
678     print_vmcs_field(VMCS_EXIT_QUAL);
679
680     print_vmcs_field(VMCS_EXIT_INT_INFO);
681     print_vmcs_field(VMCS_EXIT_INT_ERR);
682
683     print_vmcs_field(VMCS_IDT_VECTOR_INFO);
684     print_vmcs_field(VMCS_IDT_VECTOR_ERR);
685
686     print_vmcs_field(VMCS_EXIT_INSTR_LEN);
687
688     print_vmcs_field(VMCS_GUEST_LINEAR_ADDR);
689     print_vmcs_field(VMCS_EXIT_INSTR_INFO);
690
691     print_vmcs_field(VMCS_IO_RCX);
692     print_vmcs_field(VMCS_IO_RSI);
693     print_vmcs_field(VMCS_IO_RDI);
694     print_vmcs_field(VMCS_IO_RIP);
695
696
697     print_vmcs_field(VMCS_INSTR_ERR);
698 }
699
700 void v3_print_vmcs() {
701
702     print_vmcs_field(VMCS_LINK_PTR);
703 #ifdef __V3_32BIT__
704     print_vmcs_field(VMCS_LINK_PTR_HIGH);
705 #endif
706
707     print_guest_state();
708     print_host_state();
709
710     print_exec_ctrls();
711     print_exit_ctrls();
712     print_entry_ctrls();
713     print_exit_info();
714
715
716
717
718 }
719
720
721 /*
722  * Returns the field length in bytes
723  */
724 int v3_vmcs_get_field_len(vmcs_field_t field) {
725     switch(field)  {
726         /* 16 bit Control Fields */
727         case VMCS_GUEST_ES_SELECTOR:
728         case VMCS_GUEST_CS_SELECTOR:
729         case VMCS_GUEST_SS_SELECTOR:
730         case VMCS_GUEST_DS_SELECTOR:
731         case VMCS_GUEST_FS_SELECTOR:
732         case VMCS_GUEST_GS_SELECTOR:
733         case VMCS_GUEST_LDTR_SELECTOR:
734         case VMCS_GUEST_TR_SELECTOR:
735         case VMCS_HOST_ES_SELECTOR:
736         case VMCS_HOST_CS_SELECTOR:
737         case VMCS_HOST_SS_SELECTOR:
738         case VMCS_HOST_DS_SELECTOR:
739         case VMCS_HOST_FS_SELECTOR:
740         case VMCS_HOST_GS_SELECTOR:
741         case VMCS_HOST_TR_SELECTOR:
742             return 2;
743
744         /* 32 bit Control Fields */
745         case VMCS_PIN_CTRLS:
746         case VMCS_PROC_CTRLS:
747         case VMCS_SEC_PROC_CTRLS:
748         case VMCS_EXCP_BITMAP:
749         case VMCS_PG_FAULT_ERR_MASK:
750         case VMCS_PG_FAULT_ERR_MATCH:
751         case VMCS_CR3_TGT_CNT:
752         case VMCS_EXIT_CTRLS:
753         case VMCS_EXIT_MSR_STORE_CNT:
754         case VMCS_EXIT_MSR_LOAD_CNT:
755         case VMCS_ENTRY_CTRLS:
756         case VMCS_ENTRY_MSR_LOAD_CNT:
757         case VMCS_ENTRY_INT_INFO:
758         case VMCS_ENTRY_EXCP_ERR:
759         case VMCS_ENTRY_INSTR_LEN:
760         case VMCS_TPR_THRESHOLD:
761         case VMCS_INSTR_ERR:
762         case VMCS_EXIT_REASON:
763         case VMCS_EXIT_INT_INFO:
764         case VMCS_EXIT_INT_ERR:
765         case VMCS_IDT_VECTOR_INFO:
766         case VMCS_IDT_VECTOR_ERR:
767         case VMCS_EXIT_INSTR_LEN:
768         case VMCS_EXIT_INSTR_INFO:
769         case VMCS_GUEST_ES_LIMIT:
770         case VMCS_GUEST_CS_LIMIT:
771         case VMCS_GUEST_SS_LIMIT:
772         case VMCS_GUEST_DS_LIMIT:
773         case VMCS_GUEST_FS_LIMIT:
774         case VMCS_GUEST_GS_LIMIT:
775         case VMCS_GUEST_LDTR_LIMIT:
776         case VMCS_GUEST_TR_LIMIT:
777         case VMCS_GUEST_GDTR_LIMIT:
778         case VMCS_GUEST_IDTR_LIMIT:
779         case VMCS_GUEST_ES_ACCESS:
780         case VMCS_GUEST_CS_ACCESS:
781         case VMCS_GUEST_SS_ACCESS:
782         case VMCS_GUEST_DS_ACCESS:
783         case VMCS_GUEST_FS_ACCESS:
784         case VMCS_GUEST_GS_ACCESS:
785         case VMCS_GUEST_LDTR_ACCESS:
786         case VMCS_GUEST_TR_ACCESS:
787         case VMCS_GUEST_INT_STATE:
788         case VMCS_GUEST_ACTIVITY_STATE:
789         case VMCS_GUEST_SMBASE:
790         case VMCS_GUEST_SYSENTER_CS:
791         case VMCS_HOST_SYSENTER_CS:
792             return 4;
793
794
795         /* high bits of variable width fields
796          * We can probably just delete most of these....
797          */
798         case VMCS_IO_BITMAP_A_ADDR_HIGH:
799         case VMCS_IO_BITMAP_B_ADDR_HIGH:
800         case VMCS_MSR_BITMAP_HIGH:
801         case VMCS_EXIT_MSR_STORE_ADDR_HIGH:
802         case VMCS_EXIT_MSR_LOAD_ADDR_HIGH:
803         case VMCS_ENTRY_MSR_LOAD_ADDR_HIGH:
804         case VMCS_EXEC_PTR_HIGH:
805         case VMCS_TSC_OFFSET_HIGH:
806         case VMCS_VAPIC_ADDR_HIGH:
807         case VMCS_APIC_ACCESS_ADDR_HIGH:
808         case VMCS_LINK_PTR_HIGH:
809         case VMCS_GUEST_DBG_CTL_HIGH:
810         case VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH:
811         case VMCS_HOST_PERF_GLOBAL_CTRL_HIGH:
812             return 4;
813
814             /* Natural Width Control Fields */
815         case VMCS_IO_BITMAP_A_ADDR:
816         case VMCS_IO_BITMAP_B_ADDR:
817         case VMCS_MSR_BITMAP:
818         case VMCS_EXIT_MSR_STORE_ADDR:
819         case VMCS_EXIT_MSR_LOAD_ADDR:
820         case VMCS_ENTRY_MSR_LOAD_ADDR:
821         case VMCS_EXEC_PTR:
822         case VMCS_TSC_OFFSET:
823         case VMCS_VAPIC_ADDR:
824         case VMCS_APIC_ACCESS_ADDR:
825         case VMCS_LINK_PTR:
826         case VMCS_GUEST_DBG_CTL:
827         case VMCS_GUEST_PERF_GLOBAL_CTRL:
828         case VMCS_HOST_PERF_GLOBAL_CTRL:
829         case VMCS_CR0_MASK:
830         case VMCS_CR4_MASK:
831         case VMCS_CR0_READ_SHDW:
832         case VMCS_CR4_READ_SHDW:
833         case VMCS_CR3_TGT_VAL_0:
834         case VMCS_CR3_TGT_VAL_1:
835         case VMCS_CR3_TGT_VAL_2:
836         case VMCS_CR3_TGT_VAL_3:
837         case VMCS_EXIT_QUAL:
838         case VMCS_IO_RCX:
839         case VMCS_IO_RSI:
840         case VMCS_IO_RDI:
841         case VMCS_IO_RIP:
842         case VMCS_GUEST_LINEAR_ADDR:
843         case VMCS_GUEST_CR0:
844         case VMCS_GUEST_CR3:
845         case VMCS_GUEST_CR4:
846         case VMCS_GUEST_ES_BASE:
847         case VMCS_GUEST_CS_BASE:
848         case VMCS_GUEST_SS_BASE:
849         case VMCS_GUEST_DS_BASE:
850         case VMCS_GUEST_FS_BASE:
851         case VMCS_GUEST_GS_BASE:
852         case VMCS_GUEST_LDTR_BASE:
853         case VMCS_GUEST_TR_BASE:
854         case VMCS_GUEST_GDTR_BASE:
855         case VMCS_GUEST_IDTR_BASE:
856         case VMCS_GUEST_DR7:
857         case VMCS_GUEST_RSP:
858         case VMCS_GUEST_RIP:
859         case VMCS_GUEST_RFLAGS:
860         case VMCS_GUEST_PENDING_DBG_EXCP:
861         case VMCS_GUEST_SYSENTER_ESP:
862         case VMCS_GUEST_SYSENTER_EIP:
863         case VMCS_HOST_CR0:
864         case VMCS_HOST_CR3:
865         case VMCS_HOST_CR4:
866         case VMCS_HOST_FS_BASE:
867         case VMCS_HOST_GS_BASE:
868         case VMCS_HOST_TR_BASE:
869         case VMCS_HOST_GDTR_BASE:
870         case VMCS_HOST_IDTR_BASE:
871         case VMCS_HOST_SYSENTER_ESP:
872         case VMCS_HOST_SYSENTER_EIP:
873         case VMCS_HOST_RSP:
874         case VMCS_HOST_RIP:
875             return sizeof(addr_t);
876
877         default:
878             PrintError("Invalid VMCS field\n");
879             return -1;
880     }
881 }
882
883
884
885
886
887
888
889
890
891
892
893
894 static const char VMCS_GUEST_ES_SELECTOR_STR[] = "GUEST_ES_SELECTOR";
895 static const char VMCS_GUEST_CS_SELECTOR_STR[] = "GUEST_CS_SELECTOR";
896 static const char VMCS_GUEST_SS_SELECTOR_STR[] = "GUEST_SS_SELECTOR";
897 static const char VMCS_GUEST_DS_SELECTOR_STR[] = "GUEST_DS_SELECTOR";
898 static const char VMCS_GUEST_FS_SELECTOR_STR[] = "GUEST_FS_SELECTOR";
899 static const char VMCS_GUEST_GS_SELECTOR_STR[] = "GUEST_GS_SELECTOR";
900 static const char VMCS_GUEST_LDTR_SELECTOR_STR[] = "GUEST_LDTR_SELECTOR";
901 static const char VMCS_GUEST_TR_SELECTOR_STR[] = "GUEST_TR_SELECTOR";
902 static const char VMCS_HOST_ES_SELECTOR_STR[] = "HOST_ES_SELECTOR";
903 static const char VMCS_HOST_CS_SELECTOR_STR[] = "HOST_CS_SELECTOR";
904 static const char VMCS_HOST_SS_SELECTOR_STR[] = "HOST_SS_SELECTOR";
905 static const char VMCS_HOST_DS_SELECTOR_STR[] = "HOST_DS_SELECTOR";
906 static const char VMCS_HOST_FS_SELECTOR_STR[] = "HOST_FS_SELECTOR";
907 static const char VMCS_HOST_GS_SELECTOR_STR[] = "HOST_GS_SELECTOR";
908 static const char VMCS_HOST_TR_SELECTOR_STR[] = "HOST_TR_SELECTOR";
909 static const char VMCS_IO_BITMAP_A_ADDR_STR[] = "IO_BITMAP_A_ADDR";
910 static const char VMCS_IO_BITMAP_A_ADDR_HIGH_STR[] = "IO_BITMAP_A_ADDR_HIGH";
911 static const char VMCS_IO_BITMAP_B_ADDR_STR[] = "IO_BITMAP_B_ADDR";
912 static const char VMCS_IO_BITMAP_B_ADDR_HIGH_STR[] = "IO_BITMAP_B_ADDR_HIGH";
913 static const char VMCS_MSR_BITMAP_STR[] = "MSR_BITMAPS";
914 static const char VMCS_MSR_BITMAP_HIGH_STR[] = "MSR_BITMAPS_HIGH";
915 static const char VMCS_EXIT_MSR_STORE_ADDR_STR[] = "EXIT_MSR_STORE_ADDR";
916 static const char VMCS_EXIT_MSR_STORE_ADDR_HIGH_STR[] = "EXIT_MSR_STORE_ADDR_HIGH";
917 static const char VMCS_EXIT_MSR_LOAD_ADDR_STR[] = "EXIT_MSR_LOAD_ADDR";
918 static const char VMCS_EXIT_MSR_LOAD_ADDR_HIGH_STR[] = "EXIT_MSR_LOAD_ADDR_HIGH";
919 static const char VMCS_ENTRY_MSR_LOAD_ADDR_STR[] = "ENTRY_MSR_LOAD_ADDR";
920 static const char VMCS_ENTRY_MSR_LOAD_ADDR_HIGH_STR[] = "ENTRY_MSR_LOAD_ADDR_HIGH";
921 static const char VMCS_EXEC_PTR_STR[] = "VMCS_EXEC_PTR";
922 static const char VMCS_EXEC_PTR_HIGH_STR[] = "VMCS_EXEC_PTR_HIGH";
923 static const char VMCS_TSC_OFFSET_STR[] = "TSC_OFFSET";
924 static const char VMCS_TSC_OFFSET_HIGH_STR[] = "TSC_OFFSET_HIGH";
925 static const char VMCS_VAPIC_ADDR_STR[] = "VAPIC_PAGE_ADDR";
926 static const char VMCS_VAPIC_ADDR_HIGH_STR[] = "VAPIC_PAGE_ADDR_HIGH";
927 static const char VMCS_APIC_ACCESS_ADDR_STR[] = "APIC_ACCESS_ADDR";
928 static const char VMCS_APIC_ACCESS_ADDR_HIGH_STR[] = "APIC_ACCESS_ADDR_HIGH";
929 static const char VMCS_LINK_PTR_STR[] = "VMCS_LINK_PTR";
930 static const char VMCS_LINK_PTR_HIGH_STR[] = "VMCS_LINK_PTR_HIGH";
931 static const char VMCS_GUEST_DBG_CTL_STR[] = "GUEST_DEBUG_CTL";
932 static const char VMCS_GUEST_DBG_CTL_HIGH_STR[] = "GUEST_DEBUG_CTL_HIGH";
933 static const char VMCS_GUEST_PERF_GLOBAL_CTRL_STR[] = "GUEST_PERF_GLOBAL_CTRL";
934 static const char VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH_STR[] = "GUEST_PERF_GLOBAL_CTRL_HIGH";
935 static const char VMCS_HOST_PERF_GLOBAL_CTRL_STR[] = "HOST_PERF_GLOBAL_CTRL";
936 static const char VMCS_HOST_PERF_GLOBAL_CTRL_HIGH_STR[] = "HOST_PERF_GLOBAL_CTRL_HIGH";
937 static const char VMCS_PIN_CTRLS_STR[] = "PIN_VM_EXEC_CTRLS";
938 static const char VMCS_PROC_CTRLS_STR[] = "PROC_VM_EXEC_CTRLS";
939 static const char VMCS_EXCP_BITMAP_STR[] = "EXCEPTION_BITMAP";
940 static const char VMCS_PG_FAULT_ERR_MASK_STR[] = "PAGE_FAULT_ERROR_MASK";
941 static const char VMCS_PG_FAULT_ERR_MATCH_STR[] = "PAGE_FAULT_ERROR_MATCH";
942 static const char VMCS_CR3_TGT_CNT_STR[] = "CR3_TARGET_COUNT";
943 static const char VMCS_EXIT_CTRLS_STR[] = "VM_EXIT_CTRLS";
944 static const char VMCS_EXIT_MSR_STORE_CNT_STR[] = "VM_EXIT_MSR_STORE_COUNT";
945 static const char VMCS_EXIT_MSR_LOAD_CNT_STR[] = "VM_EXIT_MSR_LOAD_COUNT";
946 static const char VMCS_ENTRY_CTRLS_STR[] = "VM_ENTRY_CTRLS";
947 static const char VMCS_ENTRY_MSR_LOAD_CNT_STR[] = "VM_ENTRY_MSR_LOAD_COUNT";
948 static const char VMCS_ENTRY_INT_INFO_STR[] = "VM_ENTRY_INT_INFO_FIELD";
949 static const char VMCS_ENTRY_EXCP_ERR_STR[] = "VM_ENTRY_EXCEPTION_ERROR";
950 static const char VMCS_ENTRY_INSTR_LEN_STR[] = "VM_ENTRY_INSTR_LENGTH";
951 static const char VMCS_TPR_THRESHOLD_STR[] = "TPR_THRESHOLD";
952 static const char VMCS_SEC_PROC_CTRLS_STR[] = "VMCS_SEC_PROC_CTRLS";
953 static const char VMCS_INSTR_ERR_STR[] = "VM_INSTR_ERROR";
954 static const char VMCS_EXIT_REASON_STR[] = "EXIT_REASON";
955 static const char VMCS_EXIT_INT_INFO_STR[] = "VM_EXIT_INT_INFO";
956 static const char VMCS_EXIT_INT_ERR_STR[] = "VM_EXIT_INT_ERROR";
957 static const char VMCS_IDT_VECTOR_INFO_STR[] = "IDT_VECTOR_INFO";
958 static const char VMCS_IDT_VECTOR_ERR_STR[] = "IDT_VECTOR_ERROR";
959 static const char VMCS_EXIT_INSTR_LEN_STR[] = "VM_EXIT_INSTR_LENGTH";
960 static const char VMCS_EXIT_INSTR_INFO_STR[] = "VMX_INSTR_INFO";
961 static const char VMCS_GUEST_ES_LIMIT_STR[] = "GUEST_ES_LIMIT";
962 static const char VMCS_GUEST_CS_LIMIT_STR[] = "GUEST_CS_LIMIT";
963 static const char VMCS_GUEST_SS_LIMIT_STR[] = "GUEST_SS_LIMIT";
964 static const char VMCS_GUEST_DS_LIMIT_STR[] = "GUEST_DS_LIMIT";
965 static const char VMCS_GUEST_FS_LIMIT_STR[] = "GUEST_FS_LIMIT";
966 static const char VMCS_GUEST_GS_LIMIT_STR[] = "GUEST_GS_LIMIT";
967 static const char VMCS_GUEST_LDTR_LIMIT_STR[] = "GUEST_LDTR_LIMIT";
968 static const char VMCS_GUEST_TR_LIMIT_STR[] = "GUEST_TR_LIMIT";
969 static const char VMCS_GUEST_GDTR_LIMIT_STR[] = "GUEST_GDTR_LIMIT";
970 static const char VMCS_GUEST_IDTR_LIMIT_STR[] = "GUEST_IDTR_LIMIT";
971 static const char VMCS_GUEST_ES_ACCESS_STR[] = "GUEST_ES_ACCESS";
972 static const char VMCS_GUEST_CS_ACCESS_STR[] = "GUEST_CS_ACCESS";
973 static const char VMCS_GUEST_SS_ACCESS_STR[] = "GUEST_SS_ACCESS";
974 static const char VMCS_GUEST_DS_ACCESS_STR[] = "GUEST_DS_ACCESS";
975 static const char VMCS_GUEST_FS_ACCESS_STR[] = "GUEST_FS_ACCESS";
976 static const char VMCS_GUEST_GS_ACCESS_STR[] = "GUEST_GS_ACCESS";
977 static const char VMCS_GUEST_LDTR_ACCESS_STR[] = "GUEST_LDTR_ACCESS";
978 static const char VMCS_GUEST_TR_ACCESS_STR[] = "GUEST_TR_ACCESS";
979 static const char VMCS_GUEST_INT_STATE_STR[] = "GUEST_INT_STATE";
980 static const char VMCS_GUEST_ACTIVITY_STATE_STR[] = "GUEST_ACTIVITY_STATE";
981 static const char VMCS_GUEST_SMBASE_STR[] = "GUEST_SMBASE";
982 static const char VMCS_GUEST_SYSENTER_CS_STR[] = "GUEST_SYSENTER_CS";
983 static const char VMCS_HOST_SYSENTER_CS_STR[] = "HOST_SYSENTER_CS";
984 static const char VMCS_CR0_MASK_STR[] = "CR0_GUEST_HOST_MASK";
985 static const char VMCS_CR4_MASK_STR[] = "CR4_GUEST_HOST_MASK";
986 static const char VMCS_CR0_READ_SHDW_STR[] = "CR0_READ_SHADOW";
987 static const char VMCS_CR4_READ_SHDW_STR[] = "CR4_READ_SHADOW";
988 static const char VMCS_CR3_TGT_VAL_0_STR[] = "CR3_TARGET_VALUE_0";
989 static const char VMCS_CR3_TGT_VAL_1_STR[] = "CR3_TARGET_VALUE_1";
990 static const char VMCS_CR3_TGT_VAL_2_STR[] = "CR3_TARGET_VALUE_2";
991 static const char VMCS_CR3_TGT_VAL_3_STR[] = "CR3_TARGET_VALUE_3";
992 static const char VMCS_EXIT_QUAL_STR[] = "EXIT_QUALIFICATION";
993 static const char VMCS_IO_RCX_STR[] = "IO_RCX";
994 static const char VMCS_IO_RSI_STR[] = "IO_RSI";
995 static const char VMCS_IO_RDI_STR[] = "IO_RDI";
996 static const char VMCS_IO_RIP_STR[] = "IO_RIP";
997 static const char VMCS_GUEST_LINEAR_ADDR_STR[] = "GUEST_LINEAR_ADDR";
998 static const char VMCS_GUEST_CR0_STR[] = "GUEST_CR0";
999 static const char VMCS_GUEST_CR3_STR[] = "GUEST_CR3";
1000 static const char VMCS_GUEST_CR4_STR[] = "GUEST_CR4";
1001 static const char VMCS_GUEST_ES_BASE_STR[] = "GUEST_ES_BASE";
1002 static const char VMCS_GUEST_CS_BASE_STR[] = "GUEST_CS_BASE";
1003 static const char VMCS_GUEST_SS_BASE_STR[] = "GUEST_SS_BASE";
1004 static const char VMCS_GUEST_DS_BASE_STR[] = "GUEST_DS_BASE";
1005 static const char VMCS_GUEST_FS_BASE_STR[] = "GUEST_FS_BASE";
1006 static const char VMCS_GUEST_GS_BASE_STR[] = "GUEST_GS_BASE";
1007 static const char VMCS_GUEST_LDTR_BASE_STR[] = "GUEST_LDTR_BASE";
1008 static const char VMCS_GUEST_TR_BASE_STR[] = "GUEST_TR_BASE";
1009 static const char VMCS_GUEST_GDTR_BASE_STR[] = "GUEST_GDTR_BASE";
1010 static const char VMCS_GUEST_IDTR_BASE_STR[] = "GUEST_IDTR_BASE";
1011 static const char VMCS_GUEST_DR7_STR[] = "GUEST_DR7";
1012 static const char VMCS_GUEST_RSP_STR[] = "GUEST_RSP";
1013 static const char VMCS_GUEST_RIP_STR[] = "GUEST_RIP";
1014 static const char VMCS_GUEST_RFLAGS_STR[] = "GUEST_RFLAGS";
1015 static const char VMCS_GUEST_PENDING_DBG_EXCP_STR[] = "GUEST_PENDING_DEBUG_EXCS";
1016 static const char VMCS_GUEST_SYSENTER_ESP_STR[] = "GUEST_SYSENTER_ESP";
1017 static const char VMCS_GUEST_SYSENTER_EIP_STR[] = "GUEST_SYSENTER_EIP";
1018 static const char VMCS_HOST_CR0_STR[] = "HOST_CR0";
1019 static const char VMCS_HOST_CR3_STR[] = "HOST_CR3";
1020 static const char VMCS_HOST_CR4_STR[] = "HOST_CR4";
1021 static const char VMCS_HOST_FS_BASE_STR[] = "HOST_FS_BASE";
1022 static const char VMCS_HOST_GS_BASE_STR[] = "HOST_GS_BASE";
1023 static const char VMCS_HOST_TR_BASE_STR[] = "HOST_TR_BASE";
1024 static const char VMCS_HOST_GDTR_BASE_STR[] = "HOST_GDTR_BASE";
1025 static const char VMCS_HOST_IDTR_BASE_STR[] = "HOST_IDTR_BASE";
1026 static const char VMCS_HOST_SYSENTER_ESP_STR[] = "HOST_SYSENTER_ESP";
1027 static const char VMCS_HOST_SYSENTER_EIP_STR[] = "HOST_SYSENTER_EIP";
1028 static const char VMCS_HOST_RSP_STR[] = "HOST_RSP";
1029 static const char VMCS_HOST_RIP_STR[] = "HOST_RIP";
1030
1031
1032
1033 const char * v3_vmcs_field_to_str(vmcs_field_t field) {   
1034     switch (field) {
1035         case VMCS_GUEST_ES_SELECTOR:
1036             return VMCS_GUEST_ES_SELECTOR_STR;
1037         case VMCS_GUEST_CS_SELECTOR:
1038             return VMCS_GUEST_CS_SELECTOR_STR;
1039         case VMCS_GUEST_SS_SELECTOR:
1040             return VMCS_GUEST_SS_SELECTOR_STR;
1041         case VMCS_GUEST_DS_SELECTOR:
1042             return VMCS_GUEST_DS_SELECTOR_STR;
1043         case VMCS_GUEST_FS_SELECTOR:
1044             return VMCS_GUEST_FS_SELECTOR_STR;
1045         case VMCS_GUEST_GS_SELECTOR:
1046             return VMCS_GUEST_GS_SELECTOR_STR;
1047         case VMCS_GUEST_LDTR_SELECTOR:
1048             return VMCS_GUEST_LDTR_SELECTOR_STR;
1049         case VMCS_GUEST_TR_SELECTOR:
1050             return VMCS_GUEST_TR_SELECTOR_STR;
1051         case VMCS_HOST_ES_SELECTOR:
1052             return VMCS_HOST_ES_SELECTOR_STR;
1053         case VMCS_HOST_CS_SELECTOR:
1054             return VMCS_HOST_CS_SELECTOR_STR;
1055         case VMCS_HOST_SS_SELECTOR:
1056             return VMCS_HOST_SS_SELECTOR_STR;
1057         case VMCS_HOST_DS_SELECTOR:
1058             return VMCS_HOST_DS_SELECTOR_STR;
1059         case VMCS_HOST_FS_SELECTOR:
1060             return VMCS_HOST_FS_SELECTOR_STR;
1061         case VMCS_HOST_GS_SELECTOR:
1062             return VMCS_HOST_GS_SELECTOR_STR;
1063         case VMCS_HOST_TR_SELECTOR:
1064             return VMCS_HOST_TR_SELECTOR_STR;
1065         case VMCS_IO_BITMAP_A_ADDR:
1066             return VMCS_IO_BITMAP_A_ADDR_STR;
1067         case VMCS_IO_BITMAP_A_ADDR_HIGH:
1068             return VMCS_IO_BITMAP_A_ADDR_HIGH_STR;
1069         case VMCS_IO_BITMAP_B_ADDR:
1070             return VMCS_IO_BITMAP_B_ADDR_STR;
1071         case VMCS_IO_BITMAP_B_ADDR_HIGH:
1072             return VMCS_IO_BITMAP_B_ADDR_HIGH_STR;
1073         case VMCS_MSR_BITMAP:
1074             return VMCS_MSR_BITMAP_STR;
1075         case VMCS_MSR_BITMAP_HIGH:
1076             return VMCS_MSR_BITMAP_HIGH_STR;
1077         case VMCS_EXIT_MSR_STORE_ADDR:
1078             return VMCS_EXIT_MSR_STORE_ADDR_STR;
1079         case VMCS_EXIT_MSR_STORE_ADDR_HIGH:
1080             return VMCS_EXIT_MSR_STORE_ADDR_HIGH_STR;
1081         case VMCS_EXIT_MSR_LOAD_ADDR:
1082             return VMCS_EXIT_MSR_LOAD_ADDR_STR;
1083         case VMCS_EXIT_MSR_LOAD_ADDR_HIGH:
1084             return VMCS_EXIT_MSR_LOAD_ADDR_HIGH_STR;
1085         case VMCS_ENTRY_MSR_LOAD_ADDR:
1086             return VMCS_ENTRY_MSR_LOAD_ADDR_STR;
1087         case VMCS_ENTRY_MSR_LOAD_ADDR_HIGH:
1088             return VMCS_ENTRY_MSR_LOAD_ADDR_HIGH_STR;
1089         case VMCS_EXEC_PTR:
1090             return VMCS_EXEC_PTR_STR;
1091         case VMCS_EXEC_PTR_HIGH:
1092             return VMCS_EXEC_PTR_HIGH_STR;
1093         case VMCS_TSC_OFFSET:
1094             return VMCS_TSC_OFFSET_STR;
1095         case VMCS_TSC_OFFSET_HIGH:
1096             return VMCS_TSC_OFFSET_HIGH_STR;
1097         case VMCS_VAPIC_ADDR:
1098             return VMCS_VAPIC_ADDR_STR;
1099         case VMCS_VAPIC_ADDR_HIGH:
1100             return VMCS_VAPIC_ADDR_HIGH_STR;
1101         case VMCS_APIC_ACCESS_ADDR:
1102             return VMCS_APIC_ACCESS_ADDR_STR;
1103         case VMCS_APIC_ACCESS_ADDR_HIGH:
1104             return VMCS_APIC_ACCESS_ADDR_HIGH_STR;
1105         case VMCS_LINK_PTR:
1106             return VMCS_LINK_PTR_STR;
1107         case VMCS_LINK_PTR_HIGH:
1108             return VMCS_LINK_PTR_HIGH_STR;
1109         case VMCS_GUEST_DBG_CTL:
1110             return VMCS_GUEST_DBG_CTL_STR;
1111         case VMCS_GUEST_DBG_CTL_HIGH:
1112             return VMCS_GUEST_DBG_CTL_HIGH_STR;
1113         case VMCS_GUEST_PERF_GLOBAL_CTRL:
1114             return VMCS_GUEST_PERF_GLOBAL_CTRL_STR;
1115         case VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH:
1116             return VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH_STR;
1117         case VMCS_HOST_PERF_GLOBAL_CTRL:
1118             return VMCS_HOST_PERF_GLOBAL_CTRL_STR;
1119         case VMCS_HOST_PERF_GLOBAL_CTRL_HIGH:
1120             return VMCS_HOST_PERF_GLOBAL_CTRL_HIGH_STR;
1121         case VMCS_PIN_CTRLS:
1122             return VMCS_PIN_CTRLS_STR;
1123         case VMCS_PROC_CTRLS:
1124             return VMCS_PROC_CTRLS_STR;
1125         case VMCS_EXCP_BITMAP:
1126             return VMCS_EXCP_BITMAP_STR;
1127         case VMCS_PG_FAULT_ERR_MASK:
1128             return VMCS_PG_FAULT_ERR_MASK_STR;
1129         case VMCS_PG_FAULT_ERR_MATCH:
1130             return VMCS_PG_FAULT_ERR_MATCH_STR;
1131         case VMCS_CR3_TGT_CNT:
1132             return VMCS_CR3_TGT_CNT_STR;
1133         case VMCS_EXIT_CTRLS:
1134             return VMCS_EXIT_CTRLS_STR;
1135         case VMCS_EXIT_MSR_STORE_CNT:
1136             return VMCS_EXIT_MSR_STORE_CNT_STR;
1137         case VMCS_EXIT_MSR_LOAD_CNT:
1138             return VMCS_EXIT_MSR_LOAD_CNT_STR;
1139         case VMCS_ENTRY_CTRLS:
1140             return VMCS_ENTRY_CTRLS_STR;
1141         case VMCS_ENTRY_MSR_LOAD_CNT:
1142             return VMCS_ENTRY_MSR_LOAD_CNT_STR;
1143         case VMCS_ENTRY_INT_INFO:
1144             return VMCS_ENTRY_INT_INFO_STR;
1145         case VMCS_ENTRY_EXCP_ERR:
1146             return VMCS_ENTRY_EXCP_ERR_STR;
1147         case VMCS_ENTRY_INSTR_LEN:
1148             return VMCS_ENTRY_INSTR_LEN_STR;
1149         case VMCS_TPR_THRESHOLD:
1150             return VMCS_TPR_THRESHOLD_STR;
1151         case VMCS_SEC_PROC_CTRLS:
1152             return VMCS_SEC_PROC_CTRLS_STR;
1153         case VMCS_INSTR_ERR:
1154             return VMCS_INSTR_ERR_STR;
1155         case VMCS_EXIT_REASON:
1156             return VMCS_EXIT_REASON_STR;
1157         case VMCS_EXIT_INT_INFO:
1158             return VMCS_EXIT_INT_INFO_STR;
1159         case VMCS_EXIT_INT_ERR:
1160             return VMCS_EXIT_INT_ERR_STR;
1161         case VMCS_IDT_VECTOR_INFO:
1162             return VMCS_IDT_VECTOR_INFO_STR;
1163         case VMCS_IDT_VECTOR_ERR:
1164             return VMCS_IDT_VECTOR_ERR_STR;
1165         case VMCS_EXIT_INSTR_LEN:
1166             return VMCS_EXIT_INSTR_LEN_STR;
1167         case VMCS_EXIT_INSTR_INFO:
1168             return VMCS_EXIT_INSTR_INFO_STR;
1169         case VMCS_GUEST_ES_LIMIT:
1170             return VMCS_GUEST_ES_LIMIT_STR;
1171         case VMCS_GUEST_CS_LIMIT:
1172             return VMCS_GUEST_CS_LIMIT_STR;
1173         case VMCS_GUEST_SS_LIMIT:
1174             return VMCS_GUEST_SS_LIMIT_STR;
1175         case VMCS_GUEST_DS_LIMIT:
1176             return VMCS_GUEST_DS_LIMIT_STR;
1177         case VMCS_GUEST_FS_LIMIT:
1178             return VMCS_GUEST_FS_LIMIT_STR;
1179         case VMCS_GUEST_GS_LIMIT:
1180             return VMCS_GUEST_GS_LIMIT_STR;
1181         case VMCS_GUEST_LDTR_LIMIT:
1182             return VMCS_GUEST_LDTR_LIMIT_STR;
1183         case VMCS_GUEST_TR_LIMIT:
1184             return VMCS_GUEST_TR_LIMIT_STR;
1185         case VMCS_GUEST_GDTR_LIMIT:
1186             return VMCS_GUEST_GDTR_LIMIT_STR;
1187         case VMCS_GUEST_IDTR_LIMIT:
1188             return VMCS_GUEST_IDTR_LIMIT_STR;
1189         case VMCS_GUEST_ES_ACCESS:
1190             return VMCS_GUEST_ES_ACCESS_STR;
1191         case VMCS_GUEST_CS_ACCESS:
1192             return VMCS_GUEST_CS_ACCESS_STR;
1193         case VMCS_GUEST_SS_ACCESS:
1194             return VMCS_GUEST_SS_ACCESS_STR;
1195         case VMCS_GUEST_DS_ACCESS:
1196             return VMCS_GUEST_DS_ACCESS_STR;
1197         case VMCS_GUEST_FS_ACCESS:
1198             return VMCS_GUEST_FS_ACCESS_STR;
1199         case VMCS_GUEST_GS_ACCESS:
1200             return VMCS_GUEST_GS_ACCESS_STR;
1201         case VMCS_GUEST_LDTR_ACCESS:
1202             return VMCS_GUEST_LDTR_ACCESS_STR;
1203         case VMCS_GUEST_TR_ACCESS:
1204             return VMCS_GUEST_TR_ACCESS_STR;
1205         case VMCS_GUEST_INT_STATE:
1206             return VMCS_GUEST_INT_STATE_STR;
1207         case VMCS_GUEST_ACTIVITY_STATE:
1208             return VMCS_GUEST_ACTIVITY_STATE_STR;
1209         case VMCS_GUEST_SMBASE:
1210             return VMCS_GUEST_SMBASE_STR;
1211         case VMCS_GUEST_SYSENTER_CS:
1212             return VMCS_GUEST_SYSENTER_CS_STR;
1213         case VMCS_HOST_SYSENTER_CS:
1214             return VMCS_HOST_SYSENTER_CS_STR;
1215         case VMCS_CR0_MASK:
1216             return VMCS_CR0_MASK_STR;
1217         case VMCS_CR4_MASK:
1218             return VMCS_CR4_MASK_STR;
1219         case VMCS_CR0_READ_SHDW:
1220             return VMCS_CR0_READ_SHDW_STR;
1221         case VMCS_CR4_READ_SHDW:
1222             return VMCS_CR4_READ_SHDW_STR;
1223         case VMCS_CR3_TGT_VAL_0:
1224             return VMCS_CR3_TGT_VAL_0_STR;
1225         case VMCS_CR3_TGT_VAL_1:
1226             return VMCS_CR3_TGT_VAL_1_STR;
1227         case VMCS_CR3_TGT_VAL_2:
1228             return VMCS_CR3_TGT_VAL_2_STR;
1229         case VMCS_CR3_TGT_VAL_3:
1230             return VMCS_CR3_TGT_VAL_3_STR;
1231         case VMCS_EXIT_QUAL:
1232             return VMCS_EXIT_QUAL_STR;
1233         case VMCS_IO_RCX:
1234             return VMCS_IO_RCX_STR;
1235         case VMCS_IO_RSI:
1236             return VMCS_IO_RSI_STR;
1237         case VMCS_IO_RDI:
1238             return VMCS_IO_RDI_STR;
1239         case VMCS_IO_RIP:
1240             return VMCS_IO_RIP_STR;
1241         case VMCS_GUEST_LINEAR_ADDR:
1242             return VMCS_GUEST_LINEAR_ADDR_STR;
1243         case VMCS_GUEST_CR0:
1244             return VMCS_GUEST_CR0_STR;
1245         case VMCS_GUEST_CR3:
1246             return VMCS_GUEST_CR3_STR;
1247         case VMCS_GUEST_CR4:
1248             return VMCS_GUEST_CR4_STR;
1249         case VMCS_GUEST_ES_BASE:
1250             return VMCS_GUEST_ES_BASE_STR;
1251         case VMCS_GUEST_CS_BASE:
1252             return VMCS_GUEST_CS_BASE_STR;
1253         case VMCS_GUEST_SS_BASE:
1254             return VMCS_GUEST_SS_BASE_STR;
1255         case VMCS_GUEST_DS_BASE:
1256             return VMCS_GUEST_DS_BASE_STR;
1257         case VMCS_GUEST_FS_BASE:
1258             return VMCS_GUEST_FS_BASE_STR;
1259         case VMCS_GUEST_GS_BASE:
1260             return VMCS_GUEST_GS_BASE_STR;
1261         case VMCS_GUEST_LDTR_BASE:
1262             return VMCS_GUEST_LDTR_BASE_STR;
1263         case VMCS_GUEST_TR_BASE:
1264             return VMCS_GUEST_TR_BASE_STR;
1265         case VMCS_GUEST_GDTR_BASE:
1266             return VMCS_GUEST_GDTR_BASE_STR;
1267         case VMCS_GUEST_IDTR_BASE:
1268             return VMCS_GUEST_IDTR_BASE_STR;
1269         case VMCS_GUEST_DR7:
1270             return VMCS_GUEST_DR7_STR;
1271         case VMCS_GUEST_RSP:
1272             return VMCS_GUEST_RSP_STR;
1273         case VMCS_GUEST_RIP:
1274             return VMCS_GUEST_RIP_STR;
1275         case VMCS_GUEST_RFLAGS:
1276             return VMCS_GUEST_RFLAGS_STR;
1277         case VMCS_GUEST_PENDING_DBG_EXCP:
1278             return VMCS_GUEST_PENDING_DBG_EXCP_STR;
1279         case VMCS_GUEST_SYSENTER_ESP:
1280             return VMCS_GUEST_SYSENTER_ESP_STR;
1281         case VMCS_GUEST_SYSENTER_EIP:
1282             return VMCS_GUEST_SYSENTER_EIP_STR;
1283         case VMCS_HOST_CR0:
1284             return VMCS_HOST_CR0_STR;
1285         case VMCS_HOST_CR3:
1286             return VMCS_HOST_CR3_STR;
1287         case VMCS_HOST_CR4:
1288             return VMCS_HOST_CR4_STR;
1289         case VMCS_HOST_FS_BASE:
1290             return VMCS_HOST_FS_BASE_STR;
1291         case VMCS_HOST_GS_BASE:
1292             return VMCS_HOST_GS_BASE_STR;
1293         case VMCS_HOST_TR_BASE:
1294             return VMCS_HOST_TR_BASE_STR;
1295         case VMCS_HOST_GDTR_BASE:
1296             return VMCS_HOST_GDTR_BASE_STR;
1297         case VMCS_HOST_IDTR_BASE:
1298             return VMCS_HOST_IDTR_BASE_STR;
1299         case VMCS_HOST_SYSENTER_ESP:
1300             return VMCS_HOST_SYSENTER_ESP_STR;
1301         case VMCS_HOST_SYSENTER_EIP:
1302             return VMCS_HOST_SYSENTER_EIP_STR;
1303         case VMCS_HOST_RSP:
1304             return VMCS_HOST_RSP_STR;
1305         case VMCS_HOST_RIP:
1306             return VMCS_HOST_RIP_STR;
1307         default:
1308             return NULL;
1309     }
1310 }
1311
1312
1313