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.


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