1 /* (c) 2008, Jack Lange <jarusl@cs.northwestern.edu> */
2 /* (c) 2008, The V3VEE Project <http://www.v3vee.org> */
4 #include <palacios/vmcb.h>
5 #include <palacios/vmm.h>
6 #include <palacios/vmm_util.h>
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;
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;
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);
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));
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);
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));
72 void PrintDebugVMCB(vmcb_t * vmcb) {
75 vmcb_ctrl_t * ctrl_area = GET_VMCB_CTRL_AREA(vmcb);
76 vmcb_saved_state_t * guest_area = GET_VMCB_SAVE_STATE_AREA(vmcb);
78 PrintDebug("VMCB (0x%.8x)\n", vmcb);
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));
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);
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);
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);
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);
165 PrintDebug("guest_ASID: %d\n", ctrl_area->guest_ASID);
166 PrintDebug("TLB_CONTROL: %d\n", ctrl_area->TLB_CONTROL);
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);
177 PrintDebug("Interrupt_shadow: %d\n", ctrl_area->interrupt_shadow);
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);
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);
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);
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);
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);
208 PrintDebug("LBR_VIRTUALIZATION_ENABLE: %d\n", ctrl_area->LBR_VIRTUALIZATION_ENABLE);
211 PrintDebug("\n--Guest Saved State--\n");
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
333 PrintDebug("cpl: %d\n", guest_area->cpl);
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);
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);
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);
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);
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);