From: George Dunlap Date: Fri, 12 Sep 2008 10:53:49 +0000 (+0100) Subject: Bring up to xen-unstable cs 18443 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=cf967ceab96073a6b481a4b3f7c986a85598c529;p=xenalyze.git Bring up to xen-unstable cs 18443 --- diff --git a/analyze.c b/analyze.c index 0ccd852..4a1a25e 100644 --- a/analyze.c +++ b/analyze.c @@ -1044,9 +1044,10 @@ enum { PF_XEN_MAX, }; +#define SHADOW_WRMAP_BF 12 #define SHADOW_PREALLOC_UNPIN 13 -#define SHADOW_RESYNC_FULL 24 -#define SHADOW_RESYNC_ONLY 25 +#define SHADOW_RESYNC_FULL 14 +#define SHADOW_RESYNC_ONLY 15 char * pf_xen_name[PF_XEN_MAX] = { [PF_XEN_NOT_SHADOW]="propagate", @@ -1194,7 +1195,7 @@ struct hvm_data { unsigned long long rip; unsigned exit_reason, event_handler; char dump_header[256]; - int short_summary_done:1, prealloc_unpin:1; + int short_summary_done:1, prealloc_unpin:1, wrmap_bf:1; /* Immediate processing */ void *d; @@ -3788,7 +3789,7 @@ void hvm_msr_write_process(struct record_info *ri, struct hvm_data *h) unsigned long addr; } *r = (typeof(r))h->d; - if(ri->extra_words != (sizeof(*r)/sizeof(unsigned long))) + if(ri->extra_words != (sizeof(*r)/sizeof(unsigned long) + 1)) { fprintf(warn, "FATAL: msr_write extra_words %d, expected %d!\n", ri->extra_words, sizeof(*r)/sizeof(unsigned long)); @@ -3837,7 +3838,7 @@ void hvm_msr_read_process(struct record_info *ri, struct hvm_data *h) unsigned long addr; } *r = (typeof(r))h->d; - if(ri->extra_words != (sizeof(*r)/sizeof(unsigned long))) + if(ri->extra_words != (sizeof(*r)/sizeof(unsigned long) + 1)) { fprintf(warn, "FATAL: msr_read extra_words %d, expected %d!\n", ri->extra_words, sizeof(*r)/sizeof(unsigned long)); @@ -4314,17 +4315,19 @@ void hvm_vmexit_process(struct record_info *ri, struct hvm_data *h, struct { union { struct { - unsigned long long rip; unsigned long exit_reason; + unsigned long long rip; } x64; +#if 0 struct { unsigned long eip; unsigned long exit_reason; } x32; +#endif }; } *r; - if(ri->extra_words != 2 && ri->extra_words != 3) + if(ri->extra_words != 4) { fprintf(warn, "FATAL: vmexit has unexpected extra words %d!\n", ri->extra_words); @@ -4341,18 +4344,21 @@ void hvm_vmexit_process(struct record_info *ri, struct hvm_data *h, h->vmexit_valid=1; if(ri->event == TRC_HVM_VMEXIT64) { +#if 0 if(v->guest_paging_levels != 4) { fprintf(warn, "%s: VMEXIT64, but guest_paging_levels %d. Switching to 4.\n", __func__, v->guest_paging_levels); v->guest_paging_levels = 4; } +#endif if(!is_valid_addr64(r->x64.rip)) fprintf(warn, "%s: invalid va %llx", __func__, r->x64.rip); h->rip = r->x64.rip; h->exit_reason = r->x64.exit_reason; } else { +#if 0 if(v->guest_paging_levels == 4) { int new_paging_levels = opt.default_guest_paging_levels; @@ -4364,6 +4370,9 @@ void hvm_vmexit_process(struct record_info *ri, struct hvm_data *h, } h->rip = r->x32.eip; h->exit_reason = r->x32.exit_reason; +#endif + fprintf(stderr, "FATAL: Expected 64-bit-only traces from -unstable!\n"); + exit(1); } if(h->exit_reason > h->exit_reason_max) @@ -4399,6 +4408,7 @@ void hvm_vmexit_process(struct record_info *ri, struct hvm_data *h, h->entry_tsc = 0; h->resyncs = 0; h->prealloc_unpin = 0; + h->wrmap_bf = 0; h->short_summary_done = 0; if(!opt.svm_mode && h->exit_reason == EXIT_REASON_EXCEPTION_NMI) @@ -5040,19 +5050,16 @@ void shadow_fixup_postprocess(struct hvm_data *h) update_summary(&h->summary.pf_xen_fixup[PF_XEN_FIXUP_OOS_ADD], h->arc_cycles); if(e->flag_oos_fixup_evict) update_summary(&h->summary.pf_xen_fixup[PF_XEN_FIXUP_OOS_EVICT], h->arc_cycles); - if(e->flag_promote) { + if(e->flag_promote) update_summary(&h->summary.pf_xen_fixup[PF_XEN_FIXUP_PROMOTE], h->arc_cycles); - if(e->flag_wrmap) { - update_summary(&h->summary.pf_xen_fixup[PF_XEN_FIXUP_WRMAP], h->arc_cycles); - if(e->flag_wrmap_brute_force) - update_summary(&h->summary.pf_xen_fixup[PF_XEN_FIXUP_BRUTE_FORCE], h->arc_cycles); - } else if(e->flag_wrmap_brute_force) { - fprintf(warn, "Strange: wrmap_bf but not wrmap!\n"); - - } + if(e->flag_wrmap) { + update_summary(&h->summary.pf_xen_fixup[PF_XEN_FIXUP_WRMAP], h->arc_cycles); + if(e->flag_wrmap_brute_force || h->wrmap_bf) + update_summary(&h->summary.pf_xen_fixup[PF_XEN_FIXUP_BRUTE_FORCE], h->arc_cycles); + } else if(e->flag_wrmap_brute_force || h->wrmap_bf) { + fprintf(warn, "Strange: wrmap_bf but not wrmap!\n"); + } - } else if(e->flag_wrmap) - fprintf(warn, "Strange, wrmap but not promote!\n"); if(!(e->flag_promote || h->prealloc_unpin || e->flag_unsync)) update_summary(&h->summary.pf_xen_fixup[PF_XEN_FIXUP_UPDATE_ONLY], h->arc_cycles); @@ -5248,7 +5255,7 @@ void shadow_fault_generic_dump(unsigned long event, uint32_t *d, char *prefix, union shadow_event sevt = { .event = event }; int i; - if(sevt.minor < PF_XEN_MAX) + if(sevt.minor < PF_XEN_MAX && pf_xen_name[sevt.minor]) { evt_string = pf_xen_name[sevt.minor]; } @@ -5340,6 +5347,18 @@ void shadow_prealloc_unpin_process(struct record_info *ri, struct hvm_data *h) { cr3_prealloc_unpin(h->v, r->gfn); } +void shadow_wrmap_bf_process(struct record_info *ri, struct hvm_data *h) { + struct { + unsigned long long gfn; + } *r = (typeof(r))ri->d; + + if(opt.dump_all || opt.dump_cooked) + printf(" %s wrmap-bf gfn %llx\n", + ri->dump_header, r->gfn); + + h->wrmap_bf = 1; +} + void shadow_process(struct pcpu_info *p) { struct record_info *ri = &p->ri; @@ -5404,6 +5423,9 @@ void shadow_process(struct pcpu_info *p) case SHADOW_PREALLOC_UNPIN: shadow_prealloc_unpin_process(ri, h); break; + case SHADOW_WRMAP_BF: + shadow_wrmap_bf_process(ri, h); + break; default: if(sevt.minor <= PF_XEN_LAST_FAULT) { shadow_fault_generic_process(ri, h); @@ -6517,12 +6539,6 @@ void base_process(struct pcpu_info *p) { case TRC_LOST_RECORDS_END: process_lost_records_end(p); break; - case TRC_TRACE_VIRQ: - if(opt.dump_all || opt.dump_cooked) { - printf(" %s trace_virq\n", ri->dump_header); - } - P.buffer_trace_virq_tsc = ri->tsc; - break; default: process_generic(ri); } @@ -7879,7 +7895,7 @@ const struct argp parser_def = { .doc = "", }; -const char *argp_program_version = "xenalyze - XenServer Trunk"; +const char *argp_program_version = "xenalyze - Open-source xen-unstable (3.4)"; const char *argp_program_bug_address = "George Dunlap "; diff --git a/trace.h b/trace.h index 6f04260..a11b30f 100644 --- a/trace.h +++ b/trace.h @@ -51,30 +51,30 @@ #define TRC_HVM_ENTRYEXIT 0x00081000 /* VMENTRY and #VMEXIT */ #define TRC_HVM_HANDLER 0x00082000 /* various HVM handlers */ +#define TRC_SCHED_MIN 0x00021000 /* Just runstate changes */ +#define TRC_SCHED_VERBOSE 0x00028000 /* More inclusive scheduling */ + /* Trace events per class */ #define TRC_LOST_RECORDS (TRC_GEN + 1) #define TRC_TRACE_WRAP_BUFFER (TRC_GEN + 2) #define TRC_TRACE_CPU_CHANGE (TRC_GEN + 3) -#define TRC_TRACE_VIRQ (TRC_GEN + 4) - -#define TRC_SCHED_MIN 0x0081000 - -#define TRC_SCHED_DOM_ADD (TRC_SCHED + 1) -#define TRC_SCHED_DOM_REM (TRC_SCHED + 2) -#define TRC_SCHED_SLEEP (TRC_SCHED + 3) -#define TRC_SCHED_WAKE (TRC_SCHED + 4) -#define TRC_SCHED_YIELD (TRC_SCHED + 5) -#define TRC_SCHED_BLOCK (TRC_SCHED + 6) -#define TRC_SCHED_SHUTDOWN (TRC_SCHED + 7) -#define TRC_SCHED_CTL (TRC_SCHED + 8) -#define TRC_SCHED_ADJDOM (TRC_SCHED + 9) -#define TRC_SCHED_SWITCH (TRC_SCHED + 10) -#define TRC_SCHED_S_TIMER_FN (TRC_SCHED + 11) -#define TRC_SCHED_T_TIMER_FN (TRC_SCHED + 12) -#define TRC_SCHED_DOM_TIMER_FN (TRC_SCHED + 13) -#define TRC_SCHED_SWITCH_INFPREV (TRC_SCHED + 14) -#define TRC_SCHED_SWITCH_INFNEXT (TRC_SCHED + 15) -#define TRC_SCHED_SHUTDOWN_CODE (TRC_SCHED + 16) + +#define TRC_SCHED_RUNSTATE_CHANGE (TRC_SCHED_MIN + 1) +#define TRC_SCHED_DOM_ADD (TRC_SCHED_VERBOSE + 1) +#define TRC_SCHED_DOM_REM (TRC_SCHED_VERBOSE + 2) +#define TRC_SCHED_SLEEP (TRC_SCHED_VERBOSE + 3) +#define TRC_SCHED_WAKE (TRC_SCHED_VERBOSE + 4) +#define TRC_SCHED_YIELD (TRC_SCHED_VERBOSE + 5) +#define TRC_SCHED_BLOCK (TRC_SCHED_VERBOSE + 6) +#define TRC_SCHED_SHUTDOWN (TRC_SCHED_VERBOSE + 7) +#define TRC_SCHED_CTL (TRC_SCHED_VERBOSE + 8) +#define TRC_SCHED_ADJDOM (TRC_SCHED_VERBOSE + 9) +#define TRC_SCHED_SWITCH (TRC_SCHED_VERBOSE + 10) +#define TRC_SCHED_S_TIMER_FN (TRC_SCHED_VERBOSE + 11) +#define TRC_SCHED_T_TIMER_FN (TRC_SCHED_VERBOSE + 12) +#define TRC_SCHED_DOM_TIMER_FN (TRC_SCHED_VERBOSE + 13) +#define TRC_SCHED_SWITCH_INFPREV (TRC_SCHED_VERBOSE + 14) +#define TRC_SCHED_SWITCH_INFNEXT (TRC_SCHED_VERBOSE + 15) #define TRC_MEM_PAGE_GRANT_MAP (TRC_MEM + 1) #define TRC_MEM_PAGE_GRANT_UNMAP (TRC_MEM + 2) @@ -92,7 +92,7 @@ #define TRC_PV_PTWR_EMULATION (TRC_PV + 11) #define TRC_PV_PTWR_EMULATION_PAE (TRC_PV + 12) /* Indicates that addresses in trace record are 64 bits */ -#define TRC_PV_64_FLAG (0x100) +#define TRC_64_FLAG (0x100) #define TRC_SHADOW_NOT_SHADOW (TRC_SHADOW + 1) #define TRC_SHADOW_FAST_PROPAGATE (TRC_SHADOW + 2) @@ -105,24 +105,28 @@ #define TRC_SHADOW_EMULATE_UNSHADOW_USER (TRC_SHADOW + 9) #define TRC_SHADOW_EMULATE_UNSHADOW_EVTINJ (TRC_SHADOW + 10) #define TRC_SHADOW_EMULATE_UNSHADOW_UNHANDLED (TRC_SHADOW + 11) -#define TRC_SHADOW_EMULATE_UNSHADOW_HEURISTIC (TRC_SHADOW + 12) +#define TRC_SHADOW_WRMAP_BF (TRC_SHADOW + 12) #define TRC_SHADOW_PREALLOC_UNPIN (TRC_SHADOW + 13) -#define TRC_SHADOW_RESYNC_FULL (TRC_SHADOW + 24) -#define TRC_SHADOW_RESYNC_ONLY (TRC_SHADOW + 25) +#define TRC_SHADOW_RESYNC_FULL (TRC_SHADOW + 14) +#define TRC_SHADOW_RESYNC_ONLY (TRC_SHADOW + 15) /* trace events per subclass */ #define TRC_HVM_VMENTRY (TRC_HVM_ENTRYEXIT + 0x01) #define TRC_HVM_VMEXIT (TRC_HVM_ENTRYEXIT + 0x02) -#define TRC_HVM_VMEXIT64 (TRC_HVM_ENTRYEXIT + 0x03) +#define TRC_HVM_VMEXIT64 (TRC_HVM_ENTRYEXIT + TRC_64_FLAG + 0x02) #define TRC_HVM_PF_XEN (TRC_HVM_HANDLER + 0x01) +#define TRC_HVM_PF_XEN64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x01) #define TRC_HVM_PF_INJECT (TRC_HVM_HANDLER + 0x02) +#define TRC_HVM_PF_INJECT64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x02) #define TRC_HVM_INJ_EXC (TRC_HVM_HANDLER + 0x03) #define TRC_HVM_INJ_VIRQ (TRC_HVM_HANDLER + 0x04) #define TRC_HVM_REINJ_VIRQ (TRC_HVM_HANDLER + 0x05) #define TRC_HVM_IO_READ (TRC_HVM_HANDLER + 0x06) #define TRC_HVM_IO_WRITE (TRC_HVM_HANDLER + 0x07) #define TRC_HVM_CR_READ (TRC_HVM_HANDLER + 0x08) +#define TRC_HVM_CR_READ64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x08) #define TRC_HVM_CR_WRITE (TRC_HVM_HANDLER + 0x09) +#define TRC_HVM_CR_WRITE64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x09) #define TRC_HVM_DR_READ (TRC_HVM_HANDLER + 0x0A) #define TRC_HVM_DR_WRITE (TRC_HVM_HANDLER + 0x0B) #define TRC_HVM_MSR_READ (TRC_HVM_HANDLER + 0x0C) @@ -134,14 +138,13 @@ #define TRC_HVM_VMMCALL (TRC_HVM_HANDLER + 0x12) #define TRC_HVM_HLT (TRC_HVM_HANDLER + 0x13) #define TRC_HVM_INVLPG (TRC_HVM_HANDLER + 0x14) +#define TRC_HVM_INVLPG64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x14) #define TRC_HVM_MCE (TRC_HVM_HANDLER + 0x15) #define TRC_HVM_IO_ASSIST (TRC_HVM_HANDLER + 0x16) #define TRC_HVM_MMIO_ASSIST (TRC_HVM_HANDLER + 0x17) #define TRC_HVM_CLTS (TRC_HVM_HANDLER + 0x18) #define TRC_HVM_LMSW (TRC_HVM_HANDLER + 0x19) -#define TRC_HVM_PF_XEN64 (TRC_HVM_HANDLER + 0x20) -#define TRC_HVM_OP_DESTROY_PROC (TRC_HVM_HANDLER + 0x100) - +#define TRC_HVM_LMSW64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x19) /* This structure represents a single trace buffer record. */ struct t_rec { @@ -164,6 +167,14 @@ struct t_rec { * field, indexes into an array of struct t_rec's. */ struct t_buf { + /* Assume the data buffer size is X. X is generally not a power of 2. + * CONS and PROD are incremented modulo (2*X): + * 0 <= cons < 2*X + * 0 <= prod < 2*X + * This is done because addition modulo X breaks at 2^32 when X is not a + * power of 2: + * (((2^32 - 1) % X) + 1) % X != (2^32) % X + */ uint32_t cons; /* Offset of next item to be consumed by control tools. */ uint32_t prod; /* Offset of next item to be produced by Xen. */ /* Records follow immediately after the meta-data header. */