[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 03 of 12] xenalyze: Function-ize setting of h->post_process
Introduce hvm_set_postprocess, so that we can make changes to the setting and warning all in one place. Special-case hvm_exception_nmi_generic_postprocess for now to avoid regression; will get rid of it in the next c/s Signed-off-by: George Dunlap <george.dunlap@xxxxxxxxxxxxx> diff -r 6650e492be5d -r 47d436ca14d1 xenalyze.c --- a/xenalyze.c Mon Nov 28 16:16:23 2011 +0000 +++ b/xenalyze.c Mon Nov 28 16:16:23 2011 +0000 @@ -3073,6 +3073,20 @@ int __hvm_set_summary_handler(struct hvm return -EINVAL; } +void hvm_exception_nmi_generic_postprocess(struct hvm_data *h); + +static int hvm_set_postprocess(struct hvm_data *h, void (*s)(struct hvm_data *h)) +{ + if ( h->post_process == NULL + || h->post_process == hvm_exception_nmi_generic_postprocess ) + { + h->post_process = s; + return 0; + } + else + return 1; +} + #define SIGN_EXTENDED_BITS (~((1ULL<<48)-1)) #define HIGH_BIT(_v) ((_v) & (1ULL<<47)) static inline int is_valid_addr64(unsigned long long va) @@ -3416,7 +3430,8 @@ void hvm_pf_xen_process(struct record_in e->pt_index[4]); } - h->post_process = hvm_pf_xen_postprocess; + if ( hvm_set_postprocess(h, hvm_pf_xen_postprocess) ) + fprintf(warn, "%s: Strange, postprocess already set\n", __func__); } char * hvm_vlapic_icr_dest_shorthand_name[4] = { @@ -3703,10 +3718,9 @@ void hvm_mmio_assist_process(struct reco if((e->gpa & 0xfffff000) == 0xfee00000) hvm_vlapic_handler(h); - /* Catch MMIOs that don't go through the shadow code */ - if ( h->post_process == NULL ) - h->post_process = hvm_mmio_assist_postprocess; - + /* Catch MMIOs that don't go through the shadow code; tolerate + * failures to set (probably shadow_mmio) */ + hvm_set_postprocess(h, hvm_mmio_assist_postprocess); } void hvm_inj_virq_process(struct record_info *ri, struct hvm_data *h) { @@ -3889,10 +3903,12 @@ void hvm_io_assist_process(struct record if(mevt.write) { h->inflight.io.is_write = 1; - h->post_process = hvm_io_write_postprocess; + if ( hvm_set_postprocess(h, hvm_io_write_postprocess) ) + fprintf(warn, "%s: Strange, postprocess already set\n", __func__); } else { h->inflight.io.is_write = 0; - h->post_process = hvm_io_read_postprocess; + if ( hvm_set_postprocess(h, hvm_io_read_postprocess) ) + fprintf(warn, "%s: Strange, postprocess already set\n", __func__); } if(opt.dump_all) @@ -4234,7 +4250,6 @@ void hvm_cr_write_postprocess(struct hvm } } -void hvm_exception_nmi_generic_postprocess(struct hvm_data *h); void hvm_cr_write_process(struct record_info *ri, struct hvm_data *h) { union { @@ -4258,13 +4273,11 @@ void hvm_cr_write_process(struct record_ h->inflight.cr_write.val = val = r->x32.val; } - /* In real mode, cr accesses may cause EXNMI vmexits */ - if ( !h->post_process - || (!opt.svm_mode - && h->post_process == hvm_exception_nmi_generic_postprocess) ) - h->post_process = hvm_cr_write_postprocess; - else - fprintf(warn, "Strange, h->postprocess already set!\n"); + /* In vmx, in real mode, cr accesses may cause EXNMI vmexits. + * Account them under that heading; otherwise, complain */ + if ( hvm_set_postprocess(h, hvm_cr_write_postprocess) ) + fprintf(warn, "%s: Strange, h->postprocess already set!\n", + __func__); if(opt.dump_all) { @@ -4326,7 +4339,8 @@ void hvm_msr_write_process(struct record r->addr, r->val); } - h->post_process = hvm_msr_write_postprocess; + if ( hvm_set_postprocess(h, hvm_msr_write_postprocess) ) + fprintf(warn, "%s: Strange, postprocess already set\n", __func__); } /* msr_read */ @@ -4371,7 +4385,8 @@ void hvm_msr_read_process(struct record_ r->addr, r->val); } - h->post_process = hvm_msr_read_postprocess; + if ( hvm_set_postprocess(h, hvm_msr_read_postprocess) ) + fprintf(warn, "%s: Strange, postprocess already set\n", __func__); } void hvm_vmcall_summary(struct hvm_data *h, void *d) @@ -4421,10 +4436,10 @@ void hvm_vmcall_process(struct record_in r->eax); } - if(opt.summary) { - h->inflight.vmcall.eax = r->eax; - h->post_process = hvm_vmcall_postprocess; - } + h->inflight.vmcall.eax = r->eax; + + if ( hvm_set_postprocess(h, hvm_vmcall_postprocess) ) + fprintf(warn, "%s: Strange, postprocess already set\n", __func__); } void hvm_inj_exc_process(struct record_info *ri, struct hvm_data *h) @@ -5640,8 +5655,8 @@ void shadow_emulate_process(struct recor flag_string(e), e->flags, e->pt_level, e->corresponding_va); - h->post_process = shadow_emulate_postprocess; - + if ( hvm_set_postprocess(h, shadow_emulate_postprocess) ) + fprintf(warn, "%s: Strange, postprocess already set\n", __func__); } struct shadow_emulate_other { @@ -5776,7 +5791,8 @@ void shadow_unsync_process(struct record e->pt_level, e->corresponding_va); - h->post_process = shadow_unsync_postprocess; + if ( hvm_set_postprocess(h, shadow_unsync_postprocess) ) + fprintf(warn, "%s: Strange, postprocess already set\n", __func__); } #endif @@ -5802,7 +5818,8 @@ void shadow_emulate_other_process(struct e->gfn, e->va); - h->post_process = shadow_fault_generic_postprocess; + if ( hvm_set_postprocess(h, shadow_fault_generic_postprocess) ) + fprintf(warn, "%s: Strange, postprocess already set\n", __func__); } void shadow_fixup_postprocess(struct hvm_data *h) @@ -5962,7 +5979,8 @@ void shadow_fixup_process(struct record_ flag_string(e)); } - h->post_process = shadow_fixup_postprocess; + if ( hvm_set_postprocess(h, shadow_fixup_postprocess) ) + fprintf(warn, "%s: Strange, postprocess already set\n", __func__); } void shadow_mmio_postprocess(struct hvm_data *h) @@ -6058,7 +6076,8 @@ void shadow_mmio_process(struct record_i (e->pf_case==PF_XEN_FAST_MMIO)?"fast ":"", e->va); - h->post_process = shadow_mmio_postprocess; + if ( hvm_set_postprocess(h, shadow_mmio_postprocess) ) + fprintf(warn, "%s: Strange, postprocess already set\n", __func__); } void shadow_propagate_postprocess(struct hvm_data *h) @@ -6150,7 +6169,8 @@ void shadow_propagate_process(struct rec e->va, e->gl1e, e->flags, flag_string(e)); - h->post_process = shadow_propagate_postprocess; + if ( hvm_set_postprocess(h, shadow_propagate_postprocess) ) + fprintf(warn, "%s: Strange, postprocess already set\n", __func__); } void shadow_fault_generic_dump(unsigned int event, uint32_t *d, char *prefix, @@ -6216,7 +6236,8 @@ void shadow_fault_generic_process(struct "]", ri->dump_header); h->inflight.pf_xen.pf_case = sevt.minor; - h->post_process = shadow_fault_generic_postprocess; + if ( hvm_set_postprocess(h, shadow_fault_generic_postprocess) ) + fprintf(warn, "%s: Strange, postprocess already set\n", __func__); } void shadow_resync_process(struct record_info *ri, struct hvm_data *h) _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |