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.


modified copyright tags
[palacios.git] / palacios / src / palacios / vmcb.c
1 /* (c) 2008, Jack Lange <jarusl@cs.northwestern.edu> */
2 /* (c) 2008, The V3VEE Project <http://www.v3vee.org> */
3
4 #include <palacios/vmcb.h>
5 #include <palacios/vmm.h>
6 #include <palacios/vmm_util.h>
7
8
9
10 void set_vmcb_segment(struct vmcb_selector * vmcb_seg, struct v3_segment * seg) {
11   vmcb_seg->selector = seg->selector;
12   vmcb_seg->limit = seg->limit;
13   vmcb_seg->base = seg->base;
14   vmcb_seg->attrib.fields.type = seg->type;
15   vmcb_seg->attrib.fields.S = seg->system;
16   vmcb_seg->attrib.fields.dpl = seg->dpl;
17   vmcb_seg->attrib.fields.P = seg->present;
18   vmcb_seg->attrib.fields.avl = seg->avail;
19   vmcb_seg->attrib.fields.L = seg->long_mode;
20   vmcb_seg->attrib.fields.db = seg->db;
21   vmcb_seg->attrib.fields.G = seg->granularity;
22 }
23
24
25 void get_vmcb_segment(struct vmcb_selector * vmcb_seg, struct v3_segment * seg) {
26   seg->selector = vmcb_seg->selector;
27   seg->limit = vmcb_seg->limit;
28   seg->base = vmcb_seg->base;
29   seg->type = vmcb_seg->attrib.fields.type;
30   seg->system = vmcb_seg->attrib.fields.S;
31   seg->dpl = vmcb_seg->attrib.fields.dpl;
32   seg->present = vmcb_seg->attrib.fields.P;
33   seg->avail = vmcb_seg->attrib.fields.avl;
34   seg->long_mode = vmcb_seg->attrib.fields.L;
35   seg->db = vmcb_seg->attrib.fields.db;
36   seg->granularity = vmcb_seg->attrib.fields.G;
37 }
38
39
40 void set_vmcb_segments(vmcb_t * vmcb, struct v3_segments * segs) {
41   vmcb_saved_state_t * guest_area = GET_VMCB_SAVE_STATE_AREA(vmcb);
42
43   set_vmcb_segment(&(guest_area->cs), &(segs->cs));
44   set_vmcb_segment(&(guest_area->ds), &(segs->ds));
45   set_vmcb_segment(&(guest_area->es), &(segs->es));
46   set_vmcb_segment(&(guest_area->fs), &(segs->fs));
47   set_vmcb_segment(&(guest_area->gs), &(segs->gs));
48   set_vmcb_segment(&(guest_area->ss), &(segs->ss));
49   set_vmcb_segment(&(guest_area->ldtr), &(segs->ldtr));
50   set_vmcb_segment(&(guest_area->gdtr), &(segs->gdtr));
51   set_vmcb_segment(&(guest_area->idtr), &(segs->idtr));
52   set_vmcb_segment(&(guest_area->tr), &(segs->tr));
53 }
54
55
56 void get_vmcb_segments(vmcb_t * vmcb, struct v3_segments * segs) {
57   vmcb_saved_state_t * guest_area = GET_VMCB_SAVE_STATE_AREA(vmcb);
58
59   get_vmcb_segment(&(guest_area->cs), &(segs->cs));
60   get_vmcb_segment(&(guest_area->ds), &(segs->ds));
61   get_vmcb_segment(&(guest_area->es), &(segs->es));
62   get_vmcb_segment(&(guest_area->fs), &(segs->fs));
63   get_vmcb_segment(&(guest_area->gs), &(segs->gs));
64   get_vmcb_segment(&(guest_area->ss), &(segs->ss));
65   get_vmcb_segment(&(guest_area->ldtr), &(segs->ldtr));
66   get_vmcb_segment(&(guest_area->gdtr), &(segs->gdtr));
67   get_vmcb_segment(&(guest_area->idtr), &(segs->idtr));
68   get_vmcb_segment(&(guest_area->tr), &(segs->tr));
69 }
70
71
72 void PrintDebugVMCB(vmcb_t * vmcb) {
73   reg_ex_t tmp_reg;
74
75   vmcb_ctrl_t * ctrl_area = GET_VMCB_CTRL_AREA(vmcb);
76   vmcb_saved_state_t * guest_area = GET_VMCB_SAVE_STATE_AREA(vmcb);
77
78   PrintDebug("VMCB (0x%.8x)\n", vmcb);
79
80   PrintDebug("--Control Area--\n");
81   PrintDebug("CR Reads: %x\n", *(ushort_t*)&(ctrl_area->cr_reads));
82   PrintDebug("CR Writes: %x\n", *(ushort_t*)&(ctrl_area->cr_writes));
83   PrintDebug("DR Reads: %x\n", *(ushort_t*)&(ctrl_area->dr_reads));
84   PrintDebug("DR Writes: %x\n", *(ushort_t*)&(ctrl_area->dr_writes));
85   
86   PrintDebug("Exception Bitmap: %x (at 0x%.8x)\n", *(uint_t*)&(ctrl_area->exceptions), &(ctrl_area->exceptions));
87   PrintDebug("\tDivide-by-Zero: %d\n", ctrl_area->exceptions.de);
88   PrintDebug("\tDebug: %d\n", ctrl_area->exceptions.db);
89   PrintDebug("\tNon-maskable interrupts: %d\n", ctrl_area->exceptions.nmi);
90   PrintDebug("\tBreakpoint: %d\n", ctrl_area->exceptions.bp);
91   PrintDebug("\tOverflow: %d\n", ctrl_area->exceptions.of);
92   PrintDebug("\tBound-Range: %d\n", ctrl_area->exceptions.br);
93   PrintDebug("\tInvalid Opcode: %d\n", ctrl_area->exceptions.ud);
94   PrintDebug("\tDevice not available: %d\n", ctrl_area->exceptions.nm);
95   PrintDebug("\tDouble Fault: %d\n", ctrl_area->exceptions.df);
96   PrintDebug("\tInvalid TSS: %d\n", ctrl_area->exceptions.ts);
97   PrintDebug("\tSegment not present: %d\n", ctrl_area->exceptions.np);
98   PrintDebug("\tStack: %d\n", ctrl_area->exceptions.ss);
99   PrintDebug("\tGPF: %d\n", ctrl_area->exceptions.gp);
100   PrintDebug("\tPage Fault: %d\n", ctrl_area->exceptions.pf);
101   PrintDebug("\tFloating Point: %d\n", ctrl_area->exceptions.mf);
102   PrintDebug("\tAlignment Check: %d\n", ctrl_area->exceptions.ac);
103   PrintDebug("\tMachine Check: %d\n", ctrl_area->exceptions.mc);
104   PrintDebug("\tSIMD floating point: %d\n", ctrl_area->exceptions.xf);
105   PrintDebug("\tSecurity: %d\n", ctrl_area->exceptions.sx);
106
107   PrintDebug("Instructions bitmap: %.8x (at 0x%.8x)\n", *(uint_t*)&(ctrl_area->instrs), &(ctrl_area->instrs));
108   PrintDebug("\tINTR: %d\n", ctrl_area->instrs.INTR);
109   PrintDebug("\tNMI: %d\n", ctrl_area->instrs.NMI);
110   PrintDebug("\tSMI: %d\n", ctrl_area->instrs.SMI);
111   PrintDebug("\tINIT: %d\n", ctrl_area->instrs.INIT);
112   PrintDebug("\tVINTR: %d\n", ctrl_area->instrs.VINTR);
113   PrintDebug("\tCR0: %d\n", ctrl_area->instrs.CR0);
114   PrintDebug("\tRD_IDTR: %d\n", ctrl_area->instrs.RD_IDTR);
115   PrintDebug("\tRD_GDTR: %d\n", ctrl_area->instrs.RD_GDTR);
116   PrintDebug("\tRD_LDTR: %d\n", ctrl_area->instrs.RD_LDTR);
117   PrintDebug("\tRD_TR: %d\n", ctrl_area->instrs.RD_TR);
118   PrintDebug("\tWR_IDTR: %d\n", ctrl_area->instrs.WR_IDTR);
119   PrintDebug("\tWR_GDTR: %d\n", ctrl_area->instrs.WR_GDTR);
120   PrintDebug("\tWR_LDTR: %d\n", ctrl_area->instrs.WR_LDTR);
121   PrintDebug("\tWR_TR: %d\n", ctrl_area->instrs.WR_TR);
122   PrintDebug("\tRDTSC: %d\n", ctrl_area->instrs.RDTSC);
123   PrintDebug("\tRDPMC: %d\n", ctrl_area->instrs.RDPMC);
124   PrintDebug("\tPUSHF: %d\n", ctrl_area->instrs.PUSHF);
125   PrintDebug("\tPOPF: %d\n", ctrl_area->instrs.POPF);
126   PrintDebug("\tCPUID: %d\n", ctrl_area->instrs.CPUID);
127   PrintDebug("\tRSM: %d\n", ctrl_area->instrs.RSM);
128   PrintDebug("\tIRET: %d\n", ctrl_area->instrs.IRET);
129   PrintDebug("\tINTn: %d\n", ctrl_area->instrs.INTn);
130   PrintDebug("\tINVD: %d\n", ctrl_area->instrs.INVD);
131   PrintDebug("\tPAUSE: %d\n", ctrl_area->instrs.PAUSE);
132   PrintDebug("\tHLT: %d\n", ctrl_area->instrs.HLT);
133   PrintDebug("\tINVLPG: %d\n", ctrl_area->instrs.INVLPG);
134   PrintDebug("\tINVLPGA: %d\n", ctrl_area->instrs.INVLPGA);
135   PrintDebug("\tIOIO_PROT: %d\n", ctrl_area->instrs.IOIO_PROT);
136   PrintDebug("\tMSR_PROT: %d\n", ctrl_area->instrs.MSR_PROT);
137   PrintDebug("\ttask_switch: %d\n", ctrl_area->instrs.task_switch);
138   PrintDebug("\tFERR_FREEZE: %d\n", ctrl_area->instrs.FERR_FREEZE);
139   PrintDebug("\tshutdown_evts: %d\n", ctrl_area->instrs.shutdown_evts);
140
141   PrintDebug("SVM Instruction Bitmap: %.8x (at 0x%.8x)\n", *(uint_t*)&(ctrl_area->svm_instrs), &(ctrl_area->svm_instrs));
142   PrintDebug("\tVMRUN: %d\n", ctrl_area->svm_instrs.VMRUN);
143   PrintDebug("\tVMMCALL: %d\n", ctrl_area->svm_instrs.VMMCALL);
144   PrintDebug("\tVMLOAD: %d\n", ctrl_area->svm_instrs.VMLOAD);
145   PrintDebug("\tVMSAVE: %d\n", ctrl_area->svm_instrs.VMSAVE);
146   PrintDebug("\tSTGI: %d\n", ctrl_area->svm_instrs.STGI);
147   PrintDebug("\tCLGI: %d\n", ctrl_area->svm_instrs.CLGI);
148   PrintDebug("\tSKINIT: %d\n", ctrl_area->svm_instrs.SKINIT);
149   PrintDebug("\tRDTSCP: %d\n", ctrl_area->svm_instrs.RDTSCP);
150   PrintDebug("\tICEBP: %d\n", ctrl_area->svm_instrs.ICEBP);
151   PrintDebug("\tWBINVD: %d\n", ctrl_area->svm_instrs.WBINVD);
152   PrintDebug("\tMONITOR: %d\n", ctrl_area->svm_instrs.MONITOR);
153   PrintDebug("\tMWAIT_always: %d\n", ctrl_area->svm_instrs.MWAIT_always);
154   PrintDebug("\tMWAIT_if_armed: %d\n", ctrl_area->svm_instrs.MWAIT_if_armed);
155
156
157
158   tmp_reg.r_reg = ctrl_area->IOPM_BASE_PA;
159   PrintDebug("IOPM_BASE_PA: lo: 0x%.8x, hi: 0x%.8x\n", tmp_reg.e_reg.low, tmp_reg.e_reg.high);
160   tmp_reg.r_reg = ctrl_area->MSRPM_BASE_PA;
161   PrintDebug("MSRPM_BASE_PA: lo: 0x%.8x, hi: 0x%.8x\n", tmp_reg.e_reg.low, tmp_reg.e_reg.high);
162   tmp_reg.r_reg = ctrl_area->TSC_OFFSET;
163   PrintDebug("TSC_OFFSET: lo: 0x%.8x, hi: 0x%.8x\n", tmp_reg.e_reg.low, tmp_reg.e_reg.high);
164
165   PrintDebug("guest_ASID: %d\n", ctrl_area->guest_ASID);
166   PrintDebug("TLB_CONTROL: %d\n", ctrl_area->TLB_CONTROL);
167
168
169   PrintDebug("Guest Control Bitmap: %x (at 0x%.8x)\n", *(uint_t*)&(ctrl_area->guest_ctrl), &(ctrl_area->guest_ctrl));
170   PrintDebug("\tV_TPR: %d\n", ctrl_area->guest_ctrl.V_TPR);
171   PrintDebug("\tV_IRQ: %d\n", ctrl_area->guest_ctrl.V_IRQ);
172   PrintDebug("\tV_INTR_PRIO: %d\n", ctrl_area->guest_ctrl.V_INTR_PRIO);
173   PrintDebug("\tV_IGN_TPR: %d\n", ctrl_area->guest_ctrl.V_IGN_TPR);
174   PrintDebug("\tV_INTR_MASKING: %d\n", ctrl_area->guest_ctrl.V_INTR_MASKING);
175   PrintDebug("\tV_INTR_VECTOR: %d\n", ctrl_area->guest_ctrl.V_INTR_VECTOR);
176
177   PrintDebug("Interrupt_shadow: %d\n", ctrl_area->interrupt_shadow);
178
179
180   tmp_reg.r_reg = ctrl_area->exit_code;
181   PrintDebug("exit_code: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
182   tmp_reg.r_reg = ctrl_area->exit_info1;
183   PrintDebug("exit_info1: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
184   tmp_reg.r_reg = ctrl_area->exit_info2;
185   PrintDebug("exit_info2: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
186
187
188   PrintDebug("Exit Int Info: (at 0x%.8x)\n", &(ctrl_area->exit_int_info));
189   PrintDebug("Vector: %d\n", ctrl_area->exit_int_info.vector);
190   PrintDebug("(type=%d) (ev=%d) (valid=%d)\n", ctrl_area->exit_int_info.type, 
191              ctrl_area->exit_int_info.ev, ctrl_area->exit_int_info.valid);
192   PrintDebug("Error Code: %d\n", ctrl_area->exit_int_info.error_code);
193
194
195   tmp_reg.r_reg = ctrl_area->NP_ENABLE;
196   PrintDebug("NP_ENABLE: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
197
198   PrintDebug("Event Injection: (at 0x%.8x)\n", &(ctrl_area->EVENTINJ));
199   PrintDebug("Vector: %d\n", ctrl_area->EVENTINJ.vector);
200   PrintDebug("(type=%d) (ev=%d) (valid=%d)\n", ctrl_area->EVENTINJ.type, 
201              ctrl_area->EVENTINJ.ev, ctrl_area->EVENTINJ.valid);
202   PrintDebug("Error Code: %d\n", ctrl_area->EVENTINJ.error_code);
203
204
205   tmp_reg.r_reg = ctrl_area->N_CR3;
206   PrintDebug("N_CR3: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
207
208   PrintDebug("LBR_VIRTUALIZATION_ENABLE: %d\n", ctrl_area->LBR_VIRTUALIZATION_ENABLE);
209
210
211   PrintDebug("\n--Guest Saved State--\n");
212
213   PrintDebug("es Selector (at 0x%.8x): \n", &(guest_area->es));
214   PrintDebug("\tSelector: %d\n", guest_area->es.selector); 
215   PrintDebug("\t(type=%x), (S=%d), (dpl=%d), (P=%d), (avl=%d), (L=%d), (db=%d), (G=%d)\n", 
216              guest_area->es.attrib.fields.type, guest_area->es.attrib.fields.S, 
217              guest_area->es.attrib.fields.dpl, guest_area->es.attrib.fields.P,
218              guest_area->es.attrib.fields.avl, guest_area->es.attrib.fields.L,
219              guest_area->es.attrib.fields.db, guest_area->es.attrib.fields.G);
220   PrintDebug("\tlimit: %lu\n", guest_area->es.limit);
221   tmp_reg.r_reg = guest_area->es.base;
222   PrintDebug("\tBase: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
223
224
225   PrintDebug("cs Selector (at 0x%.8x): \n", &(guest_area->cs));
226   PrintDebug("\tSelector: %d\n", guest_area->cs.selector); 
227   PrintDebug("\t(type=%x), (S=%d), (dpl=%d), (P=%d), (avl=%d), (L=%d), (db=%d), (G=%d)\n", 
228              guest_area->cs.attrib.fields.type, guest_area->cs.attrib.fields.S, 
229              guest_area->cs.attrib.fields.dpl, guest_area->cs.attrib.fields.P,
230              guest_area->cs.attrib.fields.avl, guest_area->cs.attrib.fields.L,
231              guest_area->cs.attrib.fields.db, guest_area->cs.attrib.fields.G);
232   PrintDebug("\tlimit: %lu\n", guest_area->cs.limit);
233   tmp_reg.r_reg = guest_area->cs.base;
234   PrintDebug("\tBase: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
235
236
237   PrintDebug("ss Selector (at 0x%.8x): \n", &(guest_area->ss));
238   PrintDebug("\tSelector: %d\n", guest_area->ss.selector); 
239   PrintDebug("\t(type=%x), (S=%d), (dpl=%d), (P=%d), (avl=%d), (L=%d), (db=%d), (G=%d)\n", 
240              guest_area->ss.attrib.fields.type, guest_area->ss.attrib.fields.S, 
241              guest_area->ss.attrib.fields.dpl, guest_area->ss.attrib.fields.P,
242              guest_area->ss.attrib.fields.avl, guest_area->ss.attrib.fields.L,
243              guest_area->ss.attrib.fields.db, guest_area->ss.attrib.fields.G);
244   PrintDebug("\tlimit: %lu\n", guest_area->ss.limit);
245   tmp_reg.r_reg = guest_area->ss.base;
246   PrintDebug("\tBase: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
247
248
249   PrintDebug("ds Selector (at 0x%.8x): \n", &(guest_area->ds));
250   PrintDebug("\tSelector: %d\n", guest_area->ds.selector); 
251   PrintDebug("\t(type=%x), (S=%d), (dpl=%d), (P=%d), (avl=%d), (L=%d), (db=%d), (G=%d)\n", 
252              guest_area->ds.attrib.fields.type, guest_area->ds.attrib.fields.S, 
253              guest_area->ds.attrib.fields.dpl, guest_area->ds.attrib.fields.P,
254              guest_area->ds.attrib.fields.avl, guest_area->ds.attrib.fields.L,
255              guest_area->ds.attrib.fields.db, guest_area->ds.attrib.fields.G);
256   PrintDebug("\tlimit: %lu\n", guest_area->ds.limit);
257   tmp_reg.r_reg = guest_area->ds.base;
258   PrintDebug("\tBase: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
259
260
261   PrintDebug("fs Selector (at 0x%.8x): \n", &(guest_area->fs));
262   PrintDebug("\tSelector: %d\n", guest_area->fs.selector); 
263   PrintDebug("\t(type=%x), (S=%d), (dpl=%d), (P=%d), (avl=%d), (L=%d), (db=%d), (G=%d)\n", 
264              guest_area->fs.attrib.fields.type, guest_area->fs.attrib.fields.S, 
265              guest_area->fs.attrib.fields.dpl, guest_area->fs.attrib.fields.P,
266              guest_area->fs.attrib.fields.avl, guest_area->fs.attrib.fields.L,
267              guest_area->fs.attrib.fields.db, guest_area->fs.attrib.fields.G);
268   PrintDebug("\tlimit: %lu\n", guest_area->fs.limit);
269   tmp_reg.r_reg = guest_area->fs.base;
270   PrintDebug("\tBase: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
271
272
273   PrintDebug("gs Selector (at 0x%.8x): \n", &(guest_area->gs));
274   PrintDebug("\tSelector: %d\n", guest_area->gs.selector); 
275   PrintDebug("\t(type=%x), (S=%d), (dpl=%d), (P=%d), (avl=%d), (L=%d), (db=%d), (G=%d)\n", 
276              guest_area->gs.attrib.fields.type, guest_area->gs.attrib.fields.S, 
277              guest_area->gs.attrib.fields.dpl, guest_area->gs.attrib.fields.P,
278              guest_area->gs.attrib.fields.avl, guest_area->gs.attrib.fields.L,
279              guest_area->gs.attrib.fields.db, guest_area->gs.attrib.fields.G);
280   PrintDebug("\tlimit: %lu\n", guest_area->gs.limit);
281   tmp_reg.r_reg = guest_area->gs.base;
282   PrintDebug("\tBase: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
283
284
285   PrintDebug("gdtr Selector (at 0x%.8x): \n", &(guest_area->gdtr));
286   PrintDebug("\tSelector: %d\n", guest_area->gdtr.selector); 
287   PrintDebug("\t(type=%x), (S=%d), (dpl=%d), (P=%d), (avl=%d), (L=%d), (db=%d), (G=%d)\n", 
288              guest_area->gdtr.attrib.fields.type, guest_area->gdtr.attrib.fields.S, 
289              guest_area->gdtr.attrib.fields.dpl, guest_area->gdtr.attrib.fields.P,
290              guest_area->gdtr.attrib.fields.avl, guest_area->gdtr.attrib.fields.L,
291              guest_area->gdtr.attrib.fields.db, guest_area->gdtr.attrib.fields.G);
292   PrintDebug("\tlimit: %lu\n", guest_area->gdtr.limit);
293   tmp_reg.r_reg = guest_area->gdtr.base;
294   PrintDebug("\tBase: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
295
296
297   PrintDebug("ldtr Selector (at 0x%.8x): \n", &(guest_area->ldtr));
298   PrintDebug("\tSelector: %d\n", guest_area->ldtr.selector); 
299   PrintDebug("\t(type=%x), (S=%d), (dpl=%d), (P=%d), (avl=%d), (L=%d), (db=%d), (G=%d)\n", 
300              guest_area->ldtr.attrib.fields.type, guest_area->ldtr.attrib.fields.S, 
301              guest_area->ldtr.attrib.fields.dpl, guest_area->ldtr.attrib.fields.P,
302              guest_area->ldtr.attrib.fields.avl, guest_area->ldtr.attrib.fields.L,
303              guest_area->ldtr.attrib.fields.db, guest_area->ldtr.attrib.fields.G);
304   PrintDebug("\tlimit: %lu\n", guest_area->ldtr.limit);
305   tmp_reg.r_reg = guest_area->ldtr.base;
306   PrintDebug("\tBase: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
307
308
309   PrintDebug("idtr Selector (at 0x%.8x): \n", &(guest_area->idtr));
310   PrintDebug("\tSelector: %d\n", guest_area->idtr.selector); 
311   PrintDebug("\t(type=%x), (S=%d), (dpl=%d), (P=%d), (avl=%d), (L=%d), (db=%d), (G=%d)\n", 
312              guest_area->idtr.attrib.fields.type, guest_area->idtr.attrib.fields.S, 
313              guest_area->idtr.attrib.fields.dpl, guest_area->idtr.attrib.fields.P,
314              guest_area->idtr.attrib.fields.avl, guest_area->idtr.attrib.fields.L,
315              guest_area->idtr.attrib.fields.db, guest_area->idtr.attrib.fields.G);
316   PrintDebug("\tlimit: %lu\n", guest_area->idtr.limit);
317   tmp_reg.r_reg = guest_area->idtr.base;
318   PrintDebug("\tBase: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
319
320
321   PrintDebug("tr Selector (at 0x%.8x): \n", &(guest_area->tr));
322   PrintDebug("\tSelector: %d\n", guest_area->tr.selector); 
323   PrintDebug("\t(type=%x), (S=%d), (dpl=%d), (P=%d), (avl=%d), (L=%d), (db=%d), (G=%d)\n", 
324              guest_area->tr.attrib.fields.type, guest_area->tr.attrib.fields.S, 
325              guest_area->tr.attrib.fields.dpl, guest_area->tr.attrib.fields.P,
326              guest_area->tr.attrib.fields.avl, guest_area->tr.attrib.fields.L,
327              guest_area->tr.attrib.fields.db, guest_area->tr.attrib.fields.G);
328   PrintDebug("\tlimit: %lu\n", guest_area->tr.limit);
329   tmp_reg.r_reg = guest_area->tr.base;
330   PrintDebug("\tBase: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
331
332
333   PrintDebug("cpl: %d\n", guest_area->cpl);
334
335   
336   tmp_reg.r_reg = guest_area->efer;
337   PrintDebug("EFER: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
338
339   tmp_reg.r_reg = guest_area->cr4;
340   PrintDebug("CR4: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
341   tmp_reg.r_reg = guest_area->cr3;
342   PrintDebug("CR3: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
343   tmp_reg.r_reg = guest_area->cr0;
344   PrintDebug("CR0: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
345   tmp_reg.r_reg = guest_area->dr7;
346   PrintDebug("DR7: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
347   tmp_reg.r_reg = guest_area->dr6;
348   PrintDebug("DR6: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
349   tmp_reg.r_reg = guest_area->rflags;
350   PrintDebug("RFLAGS: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
351   tmp_reg.r_reg = guest_area->rip;
352   PrintDebug("RIP: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
353
354
355   tmp_reg.r_reg = guest_area->rsp;
356   PrintDebug("RSP: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
357
358   
359   tmp_reg.r_reg = guest_area->rax;
360   PrintDebug("RAX: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
361   tmp_reg.r_reg = guest_area->star;
362   PrintDebug("STAR: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
363   tmp_reg.r_reg = guest_area->lstar;
364   PrintDebug("LSTAR: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
365   tmp_reg.r_reg = guest_area->cstar;
366   PrintDebug("CSTAR: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
367   tmp_reg.r_reg = guest_area->sfmask;
368   PrintDebug("SFMASK: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
369   tmp_reg.r_reg = guest_area->KernelGsBase;
370   PrintDebug("KernelGsBase: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
371   tmp_reg.r_reg = guest_area->sysenter_cs;
372   PrintDebug("sysenter_cs: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
373   tmp_reg.r_reg = guest_area->sysenter_esp;
374   PrintDebug("sysenter_esp: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
375   tmp_reg.r_reg = guest_area->sysenter_eip;
376   PrintDebug("sysenter_eip: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
377   tmp_reg.r_reg = guest_area->cr2;
378   PrintDebug("CR2: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
379
380   tmp_reg.r_reg = guest_area->g_pat;
381   PrintDebug("g_pat: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
382   tmp_reg.r_reg = guest_area->dbgctl;
383   PrintDebug("dbgctl: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
384   tmp_reg.r_reg = guest_area->br_from;
385   PrintDebug("br_from: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
386   tmp_reg.r_reg = guest_area->br_to;
387   PrintDebug("br_to: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
388   tmp_reg.r_reg = guest_area->lastexcpfrom;
389   PrintDebug("lastexcpfrom: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
390   tmp_reg.r_reg = guest_area->lastexcpto;
391   PrintDebug("lastexcpto: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low);
392
393
394
395
396
397
398 }