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.


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