void hvm_cr_write_process(struct record_info *ri, struct hvm_data *h)
{
- struct {
+ union {
struct {
unsigned cr;
unsigned long val;
} x32;
struct {
unsigned cr;
- unsigned long val;
+ unsigned long long val;
} x64;
} *r = (typeof(r))h->d;
unsigned cr;
unsigned long long 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;
+ } else {
+ h->inflight.cr_write.cr = cr = r->x32.cr;
+ h->inflight.cr_write.val = val = r->x32.val;
}
h->post_process = hvm_cr_write_postprocess;
void hvm_pf_inject_process(struct record_info *ri, struct hvm_data *h)
{
- struct {
- unsigned cr2, ec;
+ union {
+ struct {
+ unsigned ec;
+ unsigned long cr2;
+ } x32;
+ struct {
+ unsigned ec;
+ unsigned long long cr2;
+ } x64;
} *r = (typeof(r))h->d;
+ unsigned long ec;
+ unsigned long long cr2;
+ int is_64 = 0;
+
+ if(ri->event & TRC_64_FLAG) {
+ is_64 = 1;
+ cr2 = r->x64.cr2;
+ ec = r->x64.ec;
+ } else {
+ cr2 = r->x32.cr2;
+ ec = r->x32.ec;
+ }
if ( opt.dump_cooked || opt.dump_all )
{
- printf(" %3lu.%09lu %s pf_inject guest_cr2 %x guest_ec %x\n",
+ printf(" %3lu.%09lu %s pf_inject%s guest_cr2 %llx guest_ec %lx\n",
ri->t.s, ri->t.ns, pcpu_string(ri->cpu),
- r->cr2, r->ec);
+ is_64?"64":"",
+ cr2, ec);
}
}
goto needs_vmexit;
/* Records about changing guest state */
case TRC_HVM_PF_INJECT:
+ case TRC_HVM_PF_INJECT64:
hvm_pf_inject_process(ri, h);
break;
case TRC_HVM_REINJ_VIRQ: