}
-void hvm_cr_write_process(struct hvm_data *h)
+void hvm_cr_write_process(struct record_info *ri, struct hvm_data *h)
{
struct {
- /* FIXME -- 64-bit values */
- unsigned cr;
- unsigned val;
+ struct {
+ unsigned cr;
+ unsigned long val;
+ } x32;
+ struct {
+ unsigned cr;
+ unsigned long val;
+ } x64;
} *r = (typeof(r))h->d;
+ unsigned cr;
+ unsigned long long val;
- h->inflight.cr_write.cr = r->cr;
- h->inflight.cr_write.val = r->val;
+ if(ri->event & TRC_64_FLAG) {
+ h->inflight.cr_write.cr = cr = r->x32.cr;
+ h->inflight.cr_write.val = val = r->x32.val;
+ } else {
+ h->inflight.cr_write.cr = cr = r->x64.cr;
+ h->inflight.cr_write.val = val = r->x64.val;
+ }
h->post_process = hvm_cr_write_postprocess;
if(opt.dump_all)
{
- if(r->cr == 3 && h->v->cr3.val) {
+ if(cr == 3 && h->v->cr3.val) {
printf("]%s cr_write cr3 val %llx oval %llx %s\n",
h->dump_header,
- (unsigned long long)r->val,
+ val,
h->v->cr3.val,
- (h->v->cr3.val == r->val)?"flush":"switch");
+ (h->v->cr3.val == val)?"flush":"switch");
} else {
printf(" %s cr_write cr%d val %llx\n",
h->dump_header,
- r->cr, (unsigned long long)r->val);
+ cr, val);
}
}
char *evt_string, evt_number[256];
unsigned *d;
- int i, evt = ri->event - TRC_HVM_HANDLER;
+ int i, evt, is_64 = 0;
+
+ evt = ri->event - TRC_HVM_HANDLER;
+
+ if(evt & TRC_64_FLAG) {
+ evt &= ~(TRC_64_FLAG);
+ is_64=1;
+ }
if(evt < HVM_EVENT_HANDLER_MAX)
{
}
d = ri->d;
- printf("%s%s %s [",
+ printf("%s%s %s%s [",
prefix,
ri->dump_header,
- evt_string);
+ evt_string,
+ is_64?"64":"");
for(i=0; i<4; i++)
{
hvm_mmio_assist_process(ri, h);
break;
case TRC_HVM_CR_WRITE:
- hvm_cr_write_process(h);
+ case TRC_HVM_CR_WRITE64:
+ hvm_cr_write_process(ri, h);
break;
case TRC_HVM_MSR_WRITE:
hvm_msr_write_process(ri, h);
hvm_vmcall_process(ri, h);
break;
case TRC_HVM_CR_READ:
+ case TRC_HVM_CR_READ64:
case TRC_HVM_DR_READ:
case TRC_HVM_DR_WRITE:
case TRC_HVM_CPUID:
case TRC_HVM_SMI:
case TRC_HVM_HLT:
case TRC_HVM_INVLPG:
+ case TRC_HVM_INVLPG64:
case TRC_HVM_MCE:
case TRC_HVM_CLTS:
case TRC_HVM_LMSW:
+ case TRC_HVM_LMSW64:
if ( h->post_process != NULL )
fprintf(warn, "Strange, h->postprocess already set!\n");
h->inflight.generic.event = ri->event;