1 #include <palacios/vmcb.h>
2 #include <palacios/vmm.h>
3 #include <palacios/vmm_util.h>
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;
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;
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);
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));
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);
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));
69 void PrintDebugVMCB(vmcb_t * vmcb) {
72 vmcb_ctrl_t * ctrl_area = GET_VMCB_CTRL_AREA(vmcb);
73 vmcb_saved_state_t * guest_area = GET_VMCB_SAVE_STATE_AREA(vmcb);
75 PrintDebug("VMCB (0x%.8x)\n", vmcb);
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));
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);
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);
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);
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);
162 PrintDebug("guest_ASID: %d\n", ctrl_area->guest_ASID);
163 PrintDebug("TLB_CONTROL: %d\n", ctrl_area->TLB_CONTROL);
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);
174 PrintDebug("Interrupt_shadow: %d\n", ctrl_area->interrupt_shadow);
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);
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);
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);
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);
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);
205 PrintDebug("LBR_VIRTUALIZATION_ENABLE: %d\n", ctrl_area->LBR_VIRTUALIZATION_ENABLE);
208 PrintDebug("\n--Guest Saved State--\n");
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
330 PrintDebug("cpl: %d\n", guest_area->cpl);
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);
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);
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);
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);
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);