# HG changeset patch # User gingold@virtu10 # Node ID 7988370500e3b2196512237072c5204ec5eefa5d # Parent 4b51d081378d6783cce48255ffb7655931f26d63 Cleanup: create privop_stat.[ch] Move all stats function to privop_stat.c to depolute other files. Signed-off-by: Tristan Gingold diff -r 4b51d081378d -r 7988370500e3 xen/arch/ia64/vmx/mmio.c --- a/xen/arch/ia64/vmx/mmio.c Wed Jun 28 07:52:21 2006 -0600 +++ b/xen/arch/ia64/vmx/mmio.c Thu Jun 29 10:06:12 2006 +0200 @@ -27,7 +27,7 @@ #include #include #include -#include +#include #include #include #include diff -r 4b51d081378d -r 7988370500e3 xen/arch/ia64/vmx/vmx_virt.c --- a/xen/arch/ia64/vmx/vmx_virt.c Wed Jun 28 07:52:21 2006 -0600 +++ b/xen/arch/ia64/vmx/vmx_virt.c Thu Jun 29 10:06:12 2006 +0200 @@ -20,10 +20,7 @@ * Shaofan Li (Susue Li) * Xuefei Xu (Anthony Xu) (Anthony.xu@xxxxxxxxx) */ - - - -#include +#include #include #include #include // Debug only @@ -33,7 +30,6 @@ #include #include #include -extern UINT64 privop_trace; extern void vhpi_detection(VCPU *vcpu);//temporarily place here,need a header file. void @@ -1381,15 +1377,6 @@ vmx_emulate(VCPU *vcpu, REGS *regs) cause = VMX(vcpu,cause); opcode = VMX(vcpu,opcode); -/* - if (privop_trace) { - static long i = 400; - //if (i > 0) printf("privop @%p\n",iip); - if (i > 0) printf("priv_handle_op: @%p, itc=%lx, itm=%lx\n", - iip,ia64_get_itc(),ia64_get_itm()); - i--; - } -*/ #ifdef VTLB_DEBUG check_vtlb_sanity(vmx_vcpu_get_vtlb(vcpu)); dump_vtlb(vmx_vcpu_get_vtlb(vcpu)); diff -r 4b51d081378d -r 7988370500e3 xen/arch/ia64/xen/Makefile --- a/xen/arch/ia64/xen/Makefile Wed Jun 28 07:52:21 2006 -0600 +++ b/xen/arch/ia64/xen/Makefile Thu Jun 29 10:06:12 2006 +0200 @@ -24,5 +24,6 @@ obj-y += xensetup.o obj-y += xensetup.o obj-y += xentime.o obj-y += flushd.o +obj-y += privop_stat.o obj-$(crash_debug) += gdbstub.o diff -r 4b51d081378d -r 7988370500e3 xen/arch/ia64/xen/dom_fw.c --- a/xen/arch/ia64/xen/dom_fw.c Wed Jun 28 07:52:21 2006 -0600 +++ b/xen/arch/ia64/xen/dom_fw.c Thu Jun 29 10:06:12 2006 +0200 @@ -23,6 +23,7 @@ #include #include +#include static struct ia64_boot_param *dom_fw_init(struct domain *, const char *,int,char *,int); extern struct domain *dom0; @@ -81,6 +82,83 @@ dom_pa(unsigned long imva) assign_new_domain0_page((d), (mpaddr)); \ } \ } while (0) + +/************************************************************************** +Hypercall bundle creation +**************************************************************************/ + +static void build_hypercall_bundle(UINT64 *imva, UINT64 brkimm, UINT64 hypnum, UINT64 ret) +{ + INST64_A5 slot0; + INST64_I19 slot1; + INST64_B4 slot2; + IA64_BUNDLE bundle; + + // slot1: mov r2 = hypnum (low 20 bits) + slot0.inst = 0; + slot0.qp = 0; slot0.r1 = 2; slot0.r3 = 0; slot0.major = 0x9; + slot0.imm7b = hypnum; slot0.imm9d = hypnum >> 7; + slot0.imm5c = hypnum >> 16; slot0.s = 0; + // slot1: break brkimm + slot1.inst = 0; + slot1.qp = 0; slot1.x6 = 0; slot1.x3 = 0; slot1.major = 0x0; + slot1.imm20 = brkimm; slot1.i = brkimm >> 20; + // if ret slot2: br.ret.sptk.many rp + // else slot2: br.cond.sptk.many rp + slot2.inst = 0; slot2.qp = 0; slot2.p = 1; slot2.b2 = 0; + slot2.wh = 0; slot2.d = 0; slot2.major = 0x0; + if (ret) { + slot2.btype = 4; slot2.x6 = 0x21; + } + else { + slot2.btype = 0; slot2.x6 = 0x20; + } + + bundle.i64[0] = 0; bundle.i64[1] = 0; + bundle.template = 0x11; + bundle.slot0 = slot0.inst; bundle.slot2 = slot2.inst; + bundle.slot1a = slot1.inst; bundle.slot1b = slot1.inst >> 18; + + imva[0] = bundle.i64[0]; imva[1] = bundle.i64[1]; + ia64_fc (imva); + ia64_fc (imva + 1); +} + +static void build_pal_hypercall_bundles(UINT64 *imva, UINT64 brkimm, UINT64 hypnum) +{ + extern unsigned long pal_call_stub[]; + IA64_BUNDLE bundle; + INST64_A5 slot_a5; + INST64_M37 slot_m37; + + /* The source of the hypercall stub is the pal_call_stub function + defined in xenasm.S. */ + + /* Copy the first bundle and patch the hypercall number. */ + bundle.i64[0] = pal_call_stub[0]; + bundle.i64[1] = pal_call_stub[1]; + slot_a5.inst = bundle.slot0; + slot_a5.imm7b = hypnum; + slot_a5.imm9d = hypnum >> 7; + slot_a5.imm5c = hypnum >> 16; + bundle.slot0 = slot_a5.inst; + imva[0] = bundle.i64[0]; + imva[1] = bundle.i64[1]; + ia64_fc (imva); + ia64_fc (imva + 1); + + /* Copy the second bundle and patch the hypercall vector. */ + bundle.i64[0] = pal_call_stub[2]; + bundle.i64[1] = pal_call_stub[3]; + slot_m37.inst = bundle.slot0; + slot_m37.imm20a = brkimm; + slot_m37.i = brkimm >> 20; + bundle.slot0 = slot_m37.inst; + imva[2] = bundle.i64[0]; + imva[3] = bundle.i64[1]; + ia64_fc (imva + 2); + ia64_fc (imva + 3); +} // builds a hypercall bundle at domain physical address static void dom_fpswa_hypercall_patch(struct domain *d) diff -r 4b51d081378d -r 7988370500e3 xen/arch/ia64/xen/domain.c --- a/xen/arch/ia64/xen/domain.c Wed Jun 28 07:52:21 2006 -0600 +++ b/xen/arch/ia64/xen/domain.c Thu Jun 29 10:06:12 2006 +0200 @@ -59,6 +59,7 @@ #include #include #include +#include #ifndef CONFIG_XEN_IA64_DOM0_VP #define CONFIG_DOMAIN0_CONTIGUOUS @@ -82,8 +83,6 @@ void build_physmap_table(struct domain * void build_physmap_table(struct domain *d); /* this belongs in include/asm, but there doesn't seem to be a suitable place */ -unsigned long context_switch_count = 0; - extern struct vcpu *ia64_switch_to (struct vcpu *next_task); /* Address of vpsr.i (in fact evtchn_upcall_mask) of current vcpu. diff -r 4b51d081378d -r 7988370500e3 xen/arch/ia64/xen/faults.c --- a/xen/arch/ia64/xen/faults.c Wed Jun 28 07:52:21 2006 -0600 +++ b/xen/arch/ia64/xen/faults.c Thu Jun 29 10:06:12 2006 +0200 @@ -26,6 +26,8 @@ #include #include #include +#include +#include #include extern void die_if_kernel(char *str, struct pt_regs *regs, long err); @@ -49,41 +51,7 @@ extern IA64FAULT ia64_hypercall(struct p extern void do_ssc(unsigned long ssc, struct pt_regs *regs); -unsigned long slow_reflect_count[0x80] = { 0 }; -unsigned long fast_reflect_count[0x80] = { 0 }; - #define inc_slow_reflect_count(vec) slow_reflect_count[vec>>8]++; - -void zero_reflect_counts(void) -{ - int i; - for (i=0; i<0x80; i++) slow_reflect_count[i] = 0; - for (i=0; i<0x80; i++) fast_reflect_count[i] = 0; -} - -int dump_reflect_counts(char *buf) -{ - int i,j,cnt; - char *s = buf; - - s += sprintf(s,"Slow reflections by vector:\n"); - for (i = 0, j = 0; i < 0x80; i++) { - if ( (cnt = slow_reflect_count[i]) != 0 ) { - s += sprintf(s,"0x%02x00:%10d, ",i,cnt); - if ((j++ & 3) == 3) s += sprintf(s,"\n"); - } - } - if (j & 3) s += sprintf(s,"\n"); - s += sprintf(s,"Fast reflections by vector:\n"); - for (i = 0, j = 0; i < 0x80; i++) { - if ( (cnt = fast_reflect_count[i]) != 0 ) { - s += sprintf(s,"0x%02x00:%10d, ",i,cnt); - if ((j++ & 3) == 3) s += sprintf(s,"\n"); - } - } - if (j & 3) s += sprintf(s,"\n"); - return s - buf; -} // should never panic domain... if it does, stack may have been overrun void check_bad_nested_interruption(unsigned long isr, struct pt_regs *regs, unsigned long vector) @@ -194,7 +162,6 @@ void deliver_pending_interrupt(struct pt ++pending_false_positive; } } -unsigned long lazy_cover_count = 0; static int handle_lazy_cover(struct vcpu *v, struct pt_regs *regs) diff -r 4b51d081378d -r 7988370500e3 xen/arch/ia64/xen/hypercall.c --- a/xen/arch/ia64/xen/hypercall.c Wed Jun 28 07:52:21 2006 -0600 +++ b/xen/arch/ia64/xen/hypercall.c Thu Jun 29 10:06:12 2006 +0200 @@ -28,16 +28,11 @@ #include #include #include +#include static long do_physdev_op_compat(XEN_GUEST_HANDLE(physdev_op_t) uop); static long do_physdev_op(int cmd, XEN_GUEST_HANDLE(void) arg); static long do_callback_op(int cmd, XEN_GUEST_HANDLE(void) arg); -/* FIXME: where these declarations should be there ? */ -extern int dump_privop_counts_to_user(char *, int); -extern int zero_privop_counts_to_user(char *, int); - -unsigned long idle_when_pending = 0; -unsigned long pal_halt_light_count = 0; hypercall_t ia64_hypercall_table[] = { diff -r 4b51d081378d -r 7988370500e3 xen/arch/ia64/xen/ivt.S --- a/xen/arch/ia64/xen/ivt.S Wed Jun 28 07:52:21 2006 -0600 +++ b/xen/arch/ia64/xen/ivt.S Thu Jun 29 10:06:12 2006 +0200 @@ -14,7 +14,6 @@ #define ia64_trace_syscall 0 #define sys_call_table 0 #define sys_ni_syscall 0 -#include #include #endif /* diff -r 4b51d081378d -r 7988370500e3 xen/arch/ia64/xen/privop.c --- a/xen/arch/ia64/xen/privop.c Wed Jun 28 07:52:21 2006 -0600 +++ b/xen/arch/ia64/xen/privop.c Thu Jun 29 10:06:12 2006 +0200 @@ -12,12 +12,11 @@ #include // Debug only #include #include - -/* FIXME: where these declarations should be there ? */ -extern int dump_reflect_counts(char *); -extern void zero_reflect_counts(void); +#include +#include long priv_verbose=0; +unsigned long privop_trace = 0; /* Set to 1 to handle privified instructions from the privify tool. */ #ifndef CONFIG_PRIVIFY @@ -25,84 +24,6 @@ static const int privify_en = 0; #else static const int privify_en = 1; #endif - -/************************************************************************** -Hypercall bundle creation -**************************************************************************/ - -void build_hypercall_bundle(UINT64 *imva, UINT64 brkimm, UINT64 hypnum, UINT64 ret) -{ - INST64_A5 slot0; - INST64_I19 slot1; - INST64_B4 slot2; - IA64_BUNDLE bundle; - - // slot1: mov r2 = hypnum (low 20 bits) - slot0.inst = 0; - slot0.qp = 0; slot0.r1 = 2; slot0.r3 = 0; slot0.major = 0x9; - slot0.imm7b = hypnum; slot0.imm9d = hypnum >> 7; - slot0.imm5c = hypnum >> 16; slot0.s = 0; - // slot1: break brkimm - slot1.inst = 0; - slot1.qp = 0; slot1.x6 = 0; slot1.x3 = 0; slot1.major = 0x0; - slot1.imm20 = brkimm; slot1.i = brkimm >> 20; - // if ret slot2: br.ret.sptk.many rp - // else slot2: br.cond.sptk.many rp - slot2.inst = 0; slot2.qp = 0; slot2.p = 1; slot2.b2 = 0; - slot2.wh = 0; slot2.d = 0; slot2.major = 0x0; - if (ret) { - slot2.btype = 4; slot2.x6 = 0x21; - } - else { - slot2.btype = 0; slot2.x6 = 0x20; - } - - bundle.i64[0] = 0; bundle.i64[1] = 0; - bundle.template = 0x11; - bundle.slot0 = slot0.inst; bundle.slot2 = slot2.inst; - bundle.slot1a = slot1.inst; bundle.slot1b = slot1.inst >> 18; - - imva[0] = bundle.i64[0]; imva[1] = bundle.i64[1]; - ia64_fc (imva); - ia64_fc (imva + 1); -} - -void build_pal_hypercall_bundles(UINT64 *imva, UINT64 brkimm, UINT64 hypnum) -{ - extern unsigned long pal_call_stub[]; - IA64_BUNDLE bundle; - INST64_A5 slot_a5; - INST64_M37 slot_m37; - - /* The source of the hypercall stub is the pal_call_stub function - defined in xenasm.S. */ - - /* Copy the first bundle and patch the hypercall number. */ - bundle.i64[0] = pal_call_stub[0]; - bundle.i64[1] = pal_call_stub[1]; - slot_a5.inst = bundle.slot0; - slot_a5.imm7b = hypnum; - slot_a5.imm9d = hypnum >> 7; - slot_a5.imm5c = hypnum >> 16; - bundle.slot0 = slot_a5.inst; - imva[0] = bundle.i64[0]; - imva[1] = bundle.i64[1]; - ia64_fc (imva); - ia64_fc (imva + 1); - - /* Copy the second bundle and patch the hypercall vector. */ - bundle.i64[0] = pal_call_stub[2]; - bundle.i64[1] = pal_call_stub[3]; - slot_m37.inst = bundle.slot0; - slot_m37.imm20a = brkimm; - slot_m37.i = brkimm >> 20; - bundle.slot0 = slot_m37.inst; - imva[2] = bundle.i64[0]; - imva[3] = bundle.i64[1]; - ia64_fc (imva + 2); - ia64_fc (imva + 3); -} - /************************************************************************** Privileged operation emulation routines @@ -351,12 +272,10 @@ static IA64FAULT priv_mov_to_pmd(VCPU *v return (vcpu_set_pmd(vcpu,r3,r2)); } -unsigned long to_cr_cnt[128] = { 0 }; - static IA64FAULT priv_mov_to_cr(VCPU *vcpu, INST64 inst) { UINT64 val = vcpu_get_gr(vcpu, inst.M32.r2); - to_cr_cnt[inst.M32.cr3]++; + privcnt.to_cr_cnt[inst.M32.cr3]++; switch (inst.M32.cr3) { case 0: return vcpu_set_dcr(vcpu,val); case 1: return vcpu_set_itm(vcpu,val); @@ -488,8 +407,6 @@ static IA64FAULT priv_mov_from_pmc(VCPU return fault; } -unsigned long from_cr_cnt[128] = { 0 }; - #define cr_get(cr) \ ((fault = vcpu_get_##cr(vcpu,&val)) == IA64_NO_FAULT) ? \ vcpu_set_gr(vcpu, tgt, val, 0) : fault; @@ -500,7 +417,7 @@ static IA64FAULT priv_mov_from_cr(VCPU * UINT64 val; IA64FAULT fault; - from_cr_cnt[inst.M33.cr3]++; + privcnt.from_cr_cnt[inst.M33.cr3]++; switch (inst.M33.cr3) { case 0: return cr_get(dcr); case 1: return cr_get(itm); @@ -586,23 +503,6 @@ static const PPEFCN Mpriv_funcs[64] = { 0, 0, 0, 0, 0, 0, 0, 0 }; -struct { - unsigned long mov_to_ar_imm; - unsigned long mov_to_ar_reg; - unsigned long mov_from_ar; - unsigned long ssm; - unsigned long rsm; - unsigned long rfi; - unsigned long bsw0; - unsigned long bsw1; - unsigned long cover; - unsigned long fc; - unsigned long cpuid; - unsigned long Mpriv_cnt[64]; -} privcnt = { 0 }; - -unsigned long privop_trace = 0; - static IA64FAULT priv_handle_op(VCPU *vcpu, REGS *regs, int privlvl) { @@ -791,15 +691,6 @@ priv_emulate(VCPU *vcpu, REGS *regs, UIN return fault; } -static const char * const hyperpriv_str[HYPERPRIVOP_MAX+1] = { - 0, "rfi", "rsm.dt", "ssm.dt", "cover", "itc.d", "itc.i", "ssm.i", - "=ivr", "=tpr", "tpr=", "eoi", "itm=", "thash", "ptc.ga", "itr.d", - "=rr", "rr=", "kr=", "fc", "=cpuid", "=pmd", "=ar.eflg", "ar.eflg=" -}; - -unsigned long slow_hyperpriv_cnt[HYPERPRIVOP_MAX+1] = { 0 }; -unsigned long fast_hyperpriv_cnt[HYPERPRIVOP_MAX+1] = { 0 }; - /* hyperprivops are generally executed in assembly (with physical psr.ic off) * so this code is primarily used for debugging them */ int @@ -811,8 +702,9 @@ ia64_hyperprivop(unsigned long iim, REGS // FIXME: Handle faults appropriately for these if (!iim || iim > HYPERPRIVOP_MAX) { - printf("bad hyperprivop; ignored\n"); - printf("iim=%lx, iip=0x%lx\n", iim, regs->cr_iip); + panic_domain + (regs, "bad hyperprivop ignored; iim=%lx, iip=0x%lx\n", + iim, regs->cr_iip); return 1; } slow_hyperpriv_cnt[iim]++; @@ -904,288 +796,3 @@ ia64_hyperprivop(unsigned long iim, REGS } -/************************************************************************** -Privileged operation instrumentation routines -**************************************************************************/ - -static const char * const Mpriv_str[64] = { - "mov_to_rr", "mov_to_dbr", "mov_to_ibr", "mov_to_pkr", - "mov_to_pmc", "mov_to_pmd", "<0x06>", "<0x07>", - "<0x08>", "ptc_l", "ptc_g", "ptc_ga", - "ptr_d", "ptr_i", "itr_d", "itr_i", - "mov_from_rr", "mov_from_dbr", "mov_from_ibr", "mov_from_pkr", - "mov_from_pmc", "<0x15>", "<0x16>", "<0x17>", - "<0x18>", "<0x19>", "privified-thash", "privified-ttag", - "<0x1c>", "<0x1d>", "tpa", "tak", - "<0x20>", "<0x21>", "<0x22>", "<0x23>", - "mov_from_cr", "mov_from_psr", "<0x26>", "<0x27>", - "<0x28>", "<0x29>", "<0x2a>", "<0x2b>", - "mov_to_cr", "mov_to_psr", "itc_d", "itc_i", - "<0x30>", "<0x31>", "<0x32>", "<0x33>", - "ptc_e", "<0x35>", "<0x36>", "<0x37>", - "<0x38>", "<0x39>", "<0x3a>", "<0x3b>", - "<0x3c>", "<0x3d>", "<0x3e>", "<0x3f>" -}; - -#define RS "Rsvd" -static const char * const cr_str[128] = { - "dcr","itm","iva",RS,RS,RS,RS,RS, - "pta",RS,RS,RS,RS,RS,RS,RS, - "ipsr","isr",RS,"iip","ifa","itir","iipa","ifs", - "iim","iha",RS,RS,RS,RS,RS,RS, - RS,RS,RS,RS,RS,RS,RS,RS, RS,RS,RS,RS,RS,RS,RS,RS, - RS,RS,RS,RS,RS,RS,RS,RS, RS,RS,RS,RS,RS,RS,RS,RS, - "lid","ivr","tpr","eoi","irr0","irr1","irr2","irr3", - "itv","pmv","cmcv",RS,RS,RS,RS,RS, - "lrr0","lrr1",RS,RS,RS,RS,RS,RS, - RS,RS,RS,RS,RS,RS,RS,RS, RS,RS,RS,RS,RS,RS,RS,RS, - RS,RS,RS,RS,RS,RS,RS,RS, RS,RS,RS,RS,RS,RS,RS,RS, - RS,RS,RS,RS,RS,RS,RS,RS -}; - -// FIXME: should use snprintf to ensure no buffer overflow -static int dump_privop_counts(char *buf) -{ - int i, j; - UINT64 sum = 0; - char *s = buf; - - // this is ugly and should probably produce sorted output - // but it will have to do for now - sum += privcnt.mov_to_ar_imm; sum += privcnt.mov_to_ar_reg; - sum += privcnt.ssm; sum += privcnt.rsm; - sum += privcnt.rfi; sum += privcnt.bsw0; - sum += privcnt.bsw1; sum += privcnt.cover; - for (i=0; i < 64; i++) sum += privcnt.Mpriv_cnt[i]; - s += sprintf(s,"Privop statistics: (Total privops: %ld)\n",sum); - if (privcnt.mov_to_ar_imm) - s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.mov_to_ar_imm, - "mov_to_ar_imm", (privcnt.mov_to_ar_imm*100L)/sum); - if (privcnt.mov_to_ar_reg) - s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.mov_to_ar_reg, - "mov_to_ar_reg", (privcnt.mov_to_ar_reg*100L)/sum); - if (privcnt.mov_from_ar) - s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.mov_from_ar, - "privified-mov_from_ar", (privcnt.mov_from_ar*100L)/sum); - if (privcnt.ssm) - s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.ssm, - "ssm", (privcnt.ssm*100L)/sum); - if (privcnt.rsm) - s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.rsm, - "rsm", (privcnt.rsm*100L)/sum); - if (privcnt.rfi) - s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.rfi, - "rfi", (privcnt.rfi*100L)/sum); - if (privcnt.bsw0) - s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.bsw0, - "bsw0", (privcnt.bsw0*100L)/sum); - if (privcnt.bsw1) - s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.bsw1, - "bsw1", (privcnt.bsw1*100L)/sum); - if (privcnt.cover) - s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.cover, - "cover", (privcnt.cover*100L)/sum); - if (privcnt.fc) - s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.fc, - "privified-fc", (privcnt.fc*100L)/sum); - if (privcnt.cpuid) - s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.cpuid, - "privified-getcpuid", (privcnt.cpuid*100L)/sum); - for (i=0; i < 64; i++) if (privcnt.Mpriv_cnt[i]) { - if (!Mpriv_str[i]) s += sprintf(s,"PRIVSTRING NULL!!\n"); - else s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.Mpriv_cnt[i], - Mpriv_str[i], (privcnt.Mpriv_cnt[i]*100L)/sum); - if (i == 0x24) { // mov from CR - s += sprintf(s," ["); - for (j=0; j < 128; j++) if (from_cr_cnt[j]) { - if (!cr_str[j]) - s += sprintf(s,"PRIVSTRING NULL!!\n"); - s += sprintf(s,"%s(%ld),",cr_str[j],from_cr_cnt[j]); - } - s += sprintf(s,"]\n"); - } - else if (i == 0x2c) { // mov to CR - s += sprintf(s," ["); - for (j=0; j < 128; j++) if (to_cr_cnt[j]) { - if (!cr_str[j]) - s += sprintf(s,"PRIVSTRING NULL!!\n"); - s += sprintf(s,"%s(%ld),",cr_str[j],to_cr_cnt[j]); - } - s += sprintf(s,"]\n"); - } - } - return s - buf; -} - -static int zero_privop_counts(char *buf) -{ - int i, j; - char *s = buf; - - // this is ugly and should probably produce sorted output - // but it will have to do for now - privcnt.mov_to_ar_imm = 0; privcnt.mov_to_ar_reg = 0; - privcnt.mov_from_ar = 0; - privcnt.ssm = 0; privcnt.rsm = 0; - privcnt.rfi = 0; privcnt.bsw0 = 0; - privcnt.bsw1 = 0; privcnt.cover = 0; - privcnt.fc = 0; privcnt.cpuid = 0; - for (i=0; i < 64; i++) privcnt.Mpriv_cnt[i] = 0; - for (j=0; j < 128; j++) from_cr_cnt[j] = 0; - for (j=0; j < 128; j++) to_cr_cnt[j] = 0; - s += sprintf(s,"All privop statistics zeroed\n"); - return s - buf; -} - -#ifdef PRIVOP_ADDR_COUNT - -extern struct privop_addr_count privop_addr_counter[]; - -void privop_count_addr(unsigned long iip, int inst) -{ - struct privop_addr_count *v = &privop_addr_counter[inst]; - int i; - - for (i = 0; i < PRIVOP_COUNT_NADDRS; i++) { - if (!v->addr[i]) { v->addr[i] = iip; v->count[i]++; return; } - else if (v->addr[i] == iip) { v->count[i]++; return; } - } - v->overflow++;; -} - -static int dump_privop_addrs(char *buf) -{ - int i,j; - char *s = buf; - s += sprintf(s,"Privop addresses:\n"); - for (i = 0; i < PRIVOP_COUNT_NINSTS; i++) { - struct privop_addr_count *v = &privop_addr_counter[i]; - s += sprintf(s,"%s:\n",v->instname); - for (j = 0; j < PRIVOP_COUNT_NADDRS; j++) { - if (!v->addr[j]) break; - s += sprintf(s," at 0x%lx #%ld\n",v->addr[j],v->count[j]); - } - if (v->overflow) - s += sprintf(s," other #%ld\n",v->overflow); - } - return s - buf; -} - -static void zero_privop_addrs(void) -{ - int i,j; - for (i = 0; i < PRIVOP_COUNT_NINSTS; i++) { - struct privop_addr_count *v = &privop_addr_counter[i]; - for (j = 0; j < PRIVOP_COUNT_NADDRS; j++) - v->addr[j] = v->count[j] = 0; - v->overflow = 0; - } -} -#endif - -extern unsigned long dtlb_translate_count; -extern unsigned long tr_translate_count; -extern unsigned long phys_translate_count; -extern unsigned long vhpt_translate_count; -extern unsigned long fast_vhpt_translate_count; -extern unsigned long recover_to_page_fault_count; -extern unsigned long recover_to_break_fault_count; -extern unsigned long lazy_cover_count; -extern unsigned long idle_when_pending; -extern unsigned long pal_halt_light_count; -extern unsigned long context_switch_count; - -static int dump_misc_stats(char *buf) -{ - char *s = buf; - s += sprintf(s,"Virtual TR translations: %ld\n",tr_translate_count); - s += sprintf(s,"Virtual VHPT slow translations: %ld\n",vhpt_translate_count); - s += sprintf(s,"Virtual VHPT fast translations: %ld\n",fast_vhpt_translate_count); - s += sprintf(s,"Virtual DTLB translations: %ld\n",dtlb_translate_count); - s += sprintf(s,"Physical translations: %ld\n",phys_translate_count); - s += sprintf(s,"Recoveries to page fault: %ld\n",recover_to_page_fault_count); - s += sprintf(s,"Recoveries to break fault: %ld\n",recover_to_break_fault_count); - s += sprintf(s,"Idle when pending: %ld\n",idle_when_pending); - s += sprintf(s,"PAL_HALT_LIGHT (no pending): %ld\n",pal_halt_light_count); - s += sprintf(s,"context switches: %ld\n",context_switch_count); - s += sprintf(s,"Lazy covers: %ld\n",lazy_cover_count); - return s - buf; -} - -static void zero_misc_stats(void) -{ - dtlb_translate_count = 0; - tr_translate_count = 0; - phys_translate_count = 0; - vhpt_translate_count = 0; - fast_vhpt_translate_count = 0; - recover_to_page_fault_count = 0; - recover_to_break_fault_count = 0; - lazy_cover_count = 0; - pal_halt_light_count = 0; - idle_when_pending = 0; - context_switch_count = 0; -} - -static int dump_hyperprivop_counts(char *buf) -{ - int i; - char *s = buf; - unsigned long total = 0; - for (i = 1; i <= HYPERPRIVOP_MAX; i++) total += slow_hyperpriv_cnt[i]; - s += sprintf(s,"Slow hyperprivops (total %ld):\n",total); - for (i = 1; i <= HYPERPRIVOP_MAX; i++) - if (slow_hyperpriv_cnt[i]) - s += sprintf(s,"%10ld %s\n", - slow_hyperpriv_cnt[i], hyperpriv_str[i]); - total = 0; - for (i = 1; i <= HYPERPRIVOP_MAX; i++) total += fast_hyperpriv_cnt[i]; - s += sprintf(s,"Fast hyperprivops (total %ld):\n",total); - for (i = 1; i <= HYPERPRIVOP_MAX; i++) - if (fast_hyperpriv_cnt[i]) - s += sprintf(s,"%10ld %s\n", - fast_hyperpriv_cnt[i], hyperpriv_str[i]); - return s - buf; -} - -static void zero_hyperprivop_counts(void) -{ - int i; - for (i = 0; i <= HYPERPRIVOP_MAX; i++) slow_hyperpriv_cnt[i] = 0; - for (i = 0; i <= HYPERPRIVOP_MAX; i++) fast_hyperpriv_cnt[i] = 0; -} - -#define TMPBUFLEN 8*1024 -int dump_privop_counts_to_user(char __user *ubuf, int len) -{ - char buf[TMPBUFLEN]; - int n = dump_privop_counts(buf); - - n += dump_hyperprivop_counts(buf + n); - n += dump_reflect_counts(buf + n); -#ifdef PRIVOP_ADDR_COUNT - n += dump_privop_addrs(buf + n); -#endif - n += dump_vhpt_stats(buf + n); - n += dump_misc_stats(buf + n); - if (len < TMPBUFLEN) return -1; - if (__copy_to_user(ubuf,buf,n)) return -1; - return n; -} - -int zero_privop_counts_to_user(char __user *ubuf, int len) -{ - char buf[TMPBUFLEN]; - int n = zero_privop_counts(buf); - - zero_hyperprivop_counts(); -#ifdef PRIVOP_ADDR_COUNT - zero_privop_addrs(); -#endif - zero_vhpt_stats(); - zero_misc_stats(); - zero_reflect_counts(); - if (len < TMPBUFLEN) return -1; - if (__copy_to_user(ubuf,buf,n)) return -1; - return n; -} diff -r 4b51d081378d -r 7988370500e3 xen/arch/ia64/xen/vcpu.c --- a/xen/arch/ia64/xen/vcpu.c Wed Jun 28 07:52:21 2006 -0600 +++ b/xen/arch/ia64/xen/vcpu.c Thu Jun 29 10:06:12 2006 +0200 @@ -20,6 +20,8 @@ #include #include #include +#include +#include /* FIXME: where these declarations should be there ? */ extern void getreg(unsigned long regnum, unsigned long *val, int *nat, struct pt_regs *regs); @@ -46,24 +48,6 @@ typedef union { #define IA64_PTA_BASE_BIT 15 #define IA64_PTA_LFMT (1UL << IA64_PTA_VF_BIT) #define IA64_PTA_SZ(x) (x##UL << IA64_PTA_SZ_BIT) - -#define STATIC - -#ifdef PRIVOP_ADDR_COUNT -struct privop_addr_count privop_addr_counter[PRIVOP_COUNT_NINSTS+1] = { - { "=ifa", { 0 }, { 0 }, 0 }, - { "thash", { 0 }, { 0 }, 0 }, - { 0, { 0 }, { 0 }, 0 } -}; -extern void privop_count_addr(unsigned long addr, int inst); -#define PRIVOP_COUNT_ADDR(regs,inst) privop_count_addr(regs->cr_iip,inst) -#else -#define PRIVOP_COUNT_ADDR(x,y) do {} while (0) -#endif - -unsigned long dtlb_translate_count = 0; -unsigned long tr_translate_count = 0; -unsigned long phys_translate_count = 0; unsigned long vcpu_verbose = 0; @@ -446,8 +430,6 @@ UINT64 vcpu_get_ipsr_int_state(VCPU *vcp IA64FAULT vcpu_get_dcr(VCPU *vcpu, UINT64 *pval) { -//extern unsigned long privop_trace; -//privop_trace=0; //verbose("vcpu_get_dcr: called @%p\n",PSCB(vcpu,iip)); // Reads of cr.dcr on Xen always have the sign bit set, so // a domain can differentiate whether it is running on SP or not @@ -495,10 +477,8 @@ IA64FAULT vcpu_get_iip(VCPU *vcpu, UINT6 IA64FAULT vcpu_get_ifa(VCPU *vcpu, UINT64 *pval) { - UINT64 val = PSCB(vcpu,ifa); - REGS *regs = vcpu_regs(vcpu); - PRIVOP_COUNT_ADDR(regs,_GET_IFA); - *pval = val; + PRIVOP_COUNT_ADDR(vcpu_regs(vcpu),_GET_IFA); + *pval = PSCB(vcpu,ifa); return (IA64_NO_FAULT); } @@ -564,18 +544,13 @@ IA64FAULT vcpu_get_iim(VCPU *vcpu, UINT6 IA64FAULT vcpu_get_iha(VCPU *vcpu, UINT64 *pval) { - //return vcpu_thash(vcpu,PSCB(vcpu,ifa),pval); - UINT64 val = PSCB(vcpu,iha); - REGS *regs = vcpu_regs(vcpu); - PRIVOP_COUNT_ADDR(regs,_THASH); - *pval = val; + PRIVOP_COUNT_ADDR(vcpu_regs(vcpu),_THASH); + *pval = PSCB(vcpu,iha); return (IA64_NO_FAULT); } IA64FAULT vcpu_set_dcr(VCPU *vcpu, UINT64 val) { -//extern unsigned long privop_trace; -//privop_trace=1; // Reads of cr.dcr on SP always have the sign bit set, so // a domain can differentiate whether it is running on SP or not // Thus, writes of DCR should ignore the sign bit @@ -1331,11 +1306,6 @@ IA64FAULT vcpu_ttag(VCPU *vcpu, UINT64 v printf("vcpu_ttag: ttag instruction unsupported\n"); return (IA64_ILLOP_FAULT); } - -unsigned long vhpt_translate_count = 0; -unsigned long fast_vhpt_translate_count = 0; -unsigned long recover_to_page_fault_count = 0; -unsigned long recover_to_break_fault_count = 0; int warn_region0_address = 0; // FIXME later: tie to a boot parameter? diff -r 4b51d081378d -r 7988370500e3 xen/include/asm-ia64/dom_fw.h --- a/xen/include/asm-ia64/dom_fw.h Wed Jun 28 07:52:21 2006 -0600 +++ b/xen/include/asm-ia64/dom_fw.h Thu Jun 29 10:06:12 2006 +0200 @@ -166,8 +166,6 @@ extern struct ia64_pal_retval xen_pal_em extern struct ia64_pal_retval xen_pal_emulator(UINT64, u64, u64, u64); extern struct sal_ret_values sal_emulator (long index, unsigned long in1, unsigned long in2, unsigned long in3, unsigned long in4, unsigned long in5, unsigned long in6, unsigned long in7); extern struct ia64_pal_retval pal_emulator_static (unsigned long); -extern unsigned long dom_fw_setup (struct domain *, const char *, int); extern efi_status_t efi_emulator (struct pt_regs *regs, unsigned long *fault); -extern void build_pal_hypercall_bundles(unsigned long *imva, unsigned long brkimm, unsigned long hypnum); -extern void build_hypercall_bundle(UINT64 *imva, UINT64 brkimm, UINT64 hypnum, UINT64 ret); +extern unsigned long dom_fw_setup (struct domain *, const char *, int); diff -r 4b51d081378d -r 7988370500e3 xen/include/asm-ia64/privop.h --- a/xen/include/asm-ia64/privop.h Wed Jun 28 07:52:21 2006 -0600 +++ b/xen/include/asm-ia64/privop.h Thu Jun 29 10:06:12 2006 +0200 @@ -2,234 +2,9 @@ #define _XEN_IA64_PRIVOP_H #include -#include #include -typedef unsigned long IA64_INST; - extern IA64FAULT priv_emulate(VCPU *vcpu, REGS *regs, UINT64 isr); - -typedef union U_IA64_BUNDLE { - unsigned long i64[2]; - struct { unsigned long template:5,slot0:41,slot1a:18,slot1b:23,slot2:41; }; - // NOTE: following doesn't work because bitfields can't cross natural - // size boundaries - //struct { unsigned long template:5, slot0:41, slot1:41, slot2:41; }; -} IA64_BUNDLE; - -typedef enum E_IA64_SLOT_TYPE { I, M, F, B, L, ILLEGAL } IA64_SLOT_TYPE; - -typedef union U_INST64_A5 { - IA64_INST inst; - struct { unsigned long qp:6, r1:7, imm7b:7, r3:2, imm5c:5, imm9d:9, s:1, major:4; }; -} INST64_A5; - -typedef union U_INST64_B4 { - IA64_INST inst; - struct { unsigned long qp:6, btype:3, un3:3, p:1, b2:3, un11:11, x6:6, wh:2, d:1, un1:1, major:4; }; -} INST64_B4; - -typedef union U_INST64_B8 { - IA64_INST inst; - struct { unsigned long qp:6, un21:21, x6:6, un4:4, major:4; }; -} INST64_B8; - -typedef union U_INST64_B9 { - IA64_INST inst; - struct { unsigned long qp:6, imm20:20, :1, x6:6, :3, i:1, major:4; }; -} INST64_B9; - -typedef union U_INST64_I19 { - IA64_INST inst; - struct { unsigned long qp:6, imm20:20, :1, x6:6, x3:3, i:1, major:4; }; -} INST64_I19; - -typedef union U_INST64_I26 { - IA64_INST inst; - struct { unsigned long qp:6, :7, r2:7, ar3:7, x6:6, x3:3, :1, major:4;}; -} INST64_I26; - -typedef union U_INST64_I27 { - IA64_INST inst; - struct { unsigned long qp:6, :7, imm:7, ar3:7, x6:6, x3:3, s:1, major:4;}; -} INST64_I27; - -typedef union U_INST64_I28 { // not privileged (mov from AR) - IA64_INST inst; - struct { unsigned long qp:6, r1:7, :7, ar3:7, x6:6, x3:3, :1, major:4;}; -} INST64_I28; - -typedef union U_INST64_M28 { - IA64_INST inst; - struct { unsigned long qp:6, :14, r3:7, x6:6, x3:3, :1, major:4;}; -} INST64_M28; - -typedef union U_INST64_M29 { - IA64_INST inst; - struct { unsigned long qp:6, :7, r2:7, ar3:7, x6:6, x3:3, :1, major:4;}; -} INST64_M29; - -typedef union U_INST64_M30 { - IA64_INST inst; - struct { unsigned long qp:6, :7, imm:7, ar3:7,x4:4,x2:2,x3:3,s:1,major:4;}; -} INST64_M30; - -typedef union U_INST64_M31 { - IA64_INST inst; - struct { unsigned long qp:6, r1:7, :7, ar3:7, x6:6, x3:3, :1, major:4;}; -} INST64_M31; - -typedef union U_INST64_M32 { - IA64_INST inst; - struct { unsigned long qp:6, :7, r2:7, cr3:7, x6:6, x3:3, :1, major:4;}; -} INST64_M32; - -typedef union U_INST64_M33 { - IA64_INST inst; - struct { unsigned long qp:6, r1:7, :7, cr3:7, x6:6, x3:3, :1, major:4; }; -} INST64_M33; - -typedef union U_INST64_M35 { - IA64_INST inst; - struct { unsigned long qp:6, :7, r2:7, :7, x6:6, x3:3, :1, major:4; }; - -} INST64_M35; - -typedef union U_INST64_M36 { - IA64_INST inst; - struct { unsigned long qp:6, r1:7, :14, x6:6, x3:3, :1, major:4; }; -} INST64_M36; - -typedef union U_INST64_M37 { - IA64_INST inst; - struct { unsigned long qp:6, imm20a:20,:1, x4:4,x2:2,x3:3, i:1, major:4; }; -} INST64_M37; - -typedef union U_INST64_M41 { - IA64_INST inst; - struct { unsigned long qp:6, :7, r2:7, :7, x6:6, x3:3, :1, major:4; }; -} INST64_M41; - -typedef union U_INST64_M42 { - IA64_INST inst; - struct { unsigned long qp:6, :7, r2:7, r3:7, x6:6, x3:3, :1, major:4; }; -} INST64_M42; - -typedef union U_INST64_M43 { - IA64_INST inst; - struct { unsigned long qp:6, r1:7, :7, r3:7, x6:6, x3:3, :1, major:4; }; -} INST64_M43; - -typedef union U_INST64_M44 { - IA64_INST inst; - struct { unsigned long qp:6, imm:21, x4:4, i2:2, x3:3, i:1, major:4; }; -} INST64_M44; - -typedef union U_INST64_M45 { - IA64_INST inst; - struct { unsigned long qp:6, :7, r2:7, r3:7, x6:6, x3:3, :1, major:4; }; -} INST64_M45; - -typedef union U_INST64_M46 { - IA64_INST inst; - struct { unsigned long qp:6, r1:7, un7:7, r3:7, x6:6, x3:3, un1:1, major:4; }; -} INST64_M46; - -typedef union U_INST64_M47 { - IA64_INST inst; - struct { unsigned long qp:6, un14:14, r3:7, x6:6, x3:3, un1:1, major:4; }; -} INST64_M47; - -typedef union U_INST64_M1{ - IA64_INST inst; - struct { unsigned long qp:6, r1:7, un7:7, r3:7, x:1, hint:2, x6:6, m:1, major:4; }; -} INST64_M1; - -typedef union U_INST64_M2{ - IA64_INST inst; - struct { unsigned long qp:6, r1:7, r2:7, r3:7, x:1, hint:2, x6:6, m:1, major:4; }; -} INST64_M2; - -typedef union U_INST64_M3{ - IA64_INST inst; - struct { unsigned long qp:6, r1:7, imm7:7, r3:7, i:1, hint:2, x6:6, s:1, major:4; }; -} INST64_M3; - -typedef union U_INST64_M4 { - IA64_INST inst; - struct { unsigned long qp:6, un7:7, r2:7, r3:7, x:1, hint:2, x6:6, m:1, major:4; }; -} INST64_M4; - -typedef union U_INST64_M5 { - IA64_INST inst; - struct { unsigned long qp:6, imm7:7, r2:7, r3:7, i:1, hint:2, x6:6, s:1, major:4; }; -} INST64_M5; - -typedef union U_INST64_M6 { - IA64_INST inst; - struct { unsigned long qp:6, f1:7, un7:7, r3:7, x:1, hint:2, x6:6, m:1, major:4; }; -} INST64_M6; - -typedef union U_INST64_M9 { - IA64_INST inst; - struct { unsigned long qp:6, :7, f2:7, r3:7, x:1, hint:2, x6:6, m:1, major:4; }; -} INST64_M9; - -typedef union U_INST64_M10 { - IA64_INST inst; - struct { unsigned long qp:6, imm7:7, f2:7, r3:7, i:1, hint:2, x6:6, s:1, major:4; }; -} INST64_M10; - -typedef union U_INST64_M12 { - IA64_INST inst; - struct { unsigned long qp:6, f1:7, f2:7, r3:7, x:1, hint:2, x6:6, m:1, major:4; }; -} INST64_M12; - -typedef union U_INST64_M15 { - IA64_INST inst; - struct { unsigned long qp:6, :7, imm7:7, r3:7, i:1, hint:2, x6:6, s:1, major:4; }; -} INST64_M15; - -typedef union U_INST64 { - IA64_INST inst; - struct { unsigned long :37, major:4; } generic; - INST64_A5 A5; // used in build_hypercall_bundle only - INST64_B4 B4; // used in build_hypercall_bundle only - INST64_B8 B8; // rfi, bsw.[01] - INST64_B9 B9; // break.b - INST64_I19 I19; // used in build_hypercall_bundle only - INST64_I26 I26; // mov register to ar (I unit) - INST64_I27 I27; // mov immediate to ar (I unit) - INST64_I28 I28; // mov from ar (I unit) - INST64_M1 M1; // ld integer - INST64_M2 M2; - INST64_M3 M3; - INST64_M4 M4; // st integer - INST64_M5 M5; - INST64_M6 M6; // ldfd floating pointer - INST64_M9 M9; // stfd floating pointer - INST64_M10 M10; // stfd floating pointer - INST64_M12 M12; // ldfd pair floating pointer - INST64_M15 M15; // lfetch + imm update - INST64_M28 M28; // purge translation cache entry - INST64_M29 M29; // mov register to ar (M unit) - INST64_M30 M30; // mov immediate to ar (M unit) - INST64_M31 M31; // mov from ar (M unit) - INST64_M32 M32; // mov reg to cr - INST64_M33 M33; // mov from cr - INST64_M35 M35; // mov to psr - INST64_M36 M36; // mov from psr - INST64_M37 M37; // break.m - INST64_M41 M41; // translation cache insert - INST64_M42 M42; // mov to indirect reg/translation reg insert - INST64_M43 M43; // mov from indirect reg - INST64_M44 M44; // set/reset system mask - INST64_M45 M45; // translation purge - INST64_M46 M46; // translation access (tpa,tak) - INST64_M47 M47; // purge translation entry -} INST64; - -#define MASK_41 ((UINT64)0x1ffffffffff) extern void privify_memory(void *start, UINT64 len); diff -r 4b51d081378d -r 7988370500e3 xen/include/asm-ia64/vcpu.h --- a/xen/include/asm-ia64/vcpu.h Wed Jun 28 07:52:21 2006 -0600 +++ b/xen/include/asm-ia64/vcpu.h Thu Jun 29 10:06:12 2006 +0200 @@ -4,7 +4,8 @@ // TODO: Many (or perhaps most) of these should eventually be // static inline functions -//#include "thread.h" +#include +#include #include #include typedef unsigned long UINT64; @@ -12,29 +13,13 @@ typedef int BOOLEAN; typedef int BOOLEAN; struct vcpu; typedef struct vcpu VCPU; - typedef cpu_user_regs_t REGS; - /* Note: PSCB stands for Privilegied State Communication Block. */ #define VCPU(_v,_x) (_v->arch.privregs->_x) #define PSCB(_v,_x) VCPU(_v,_x) #define PSCBX(_v,_x) (_v->arch._x) -#define PRIVOP_ADDR_COUNT -#ifdef PRIVOP_ADDR_COUNT -#define _GET_IFA 0 -#define _THASH 1 -#define PRIVOP_COUNT_NINSTS 2 -#define PRIVOP_COUNT_NADDRS 30 - -struct privop_addr_count { - char *instname; - unsigned long addr[PRIVOP_COUNT_NADDRS]; - unsigned long count[PRIVOP_COUNT_NADDRS]; - unsigned long overflow; -}; -#endif /* general registers */ extern UINT64 vcpu_get_gr(VCPU *vcpu, unsigned long reg); diff -r 4b51d081378d -r 7988370500e3 xen/include/asm-ia64/vhpt.h --- a/xen/include/asm-ia64/vhpt.h Wed Jun 28 07:52:21 2006 -0600 +++ b/xen/include/asm-ia64/vhpt.h Thu Jun 29 10:06:12 2006 +0200 @@ -21,6 +21,8 @@ #define VLE_CCHAIN_OFFSET 24 #ifndef __ASSEMBLY__ +#include + // // VHPT Long Format Entry (as recognized by hw) // diff -r 4b51d081378d -r 7988370500e3 xen/arch/ia64/xen/privop_stat.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xen/arch/ia64/xen/privop_stat.c Thu Jun 29 10:06:12 2006 +0200 @@ -0,0 +1,361 @@ +#include +#include +#include +#include + +unsigned long dtlb_translate_count = 0; +unsigned long tr_translate_count = 0; +unsigned long phys_translate_count = 0; +unsigned long vhpt_translate_count = 0; +unsigned long fast_vhpt_translate_count = 0; +unsigned long recover_to_page_fault_count = 0; +unsigned long recover_to_break_fault_count = 0; +unsigned long idle_when_pending = 0; +unsigned long pal_halt_light_count = 0; +unsigned long context_switch_count = 0; +unsigned long lazy_cover_count = 0; + +unsigned long slow_hyperpriv_cnt[HYPERPRIVOP_MAX+1] = { 0 }; +unsigned long fast_hyperpriv_cnt[HYPERPRIVOP_MAX+1] = { 0 }; + +unsigned long slow_reflect_count[0x80] = { 0 }; +unsigned long fast_reflect_count[0x80] = { 0 }; + +struct privop_counters privcnt; + +#ifdef PRIVOP_ADDR_COUNT +#define PRIVOP_COUNT_NINSTS 2 +#define PRIVOP_COUNT_NADDRS 30 + +struct privop_addr_count { + const char *instname; + unsigned long addr[PRIVOP_COUNT_NADDRS]; + unsigned long count[PRIVOP_COUNT_NADDRS]; + unsigned long overflow; +}; + + +static struct privop_addr_count privop_addr_counter[PRIVOP_COUNT_NINSTS] = { + [_GET_IFA] = { "=ifa", { 0 }, { 0 }, 0 }, + [_THASH] = { "thash", { 0 }, { 0 }, 0 } +}; + +void privop_count_addr(unsigned long iip, int inst) +{ + struct privop_addr_count *v = &privop_addr_counter[inst]; + int i; + + if (inst >= PRIVOP_COUNT_NINSTS) + return; + for (i = 0; i < PRIVOP_COUNT_NADDRS; i++) { + if (!v->addr[i]) { v->addr[i] = iip; v->count[i]++; return; } + else if (v->addr[i] == iip) { v->count[i]++; return; } + } + v->overflow++;; +} + +static int dump_privop_addrs(char *buf) +{ + int i,j; + char *s = buf; + s += sprintf(s,"Privop addresses:\n"); + for (i = 0; i < PRIVOP_COUNT_NINSTS; i++) { + struct privop_addr_count *v = &privop_addr_counter[i]; + s += sprintf(s,"%s:\n",v->instname); + for (j = 0; j < PRIVOP_COUNT_NADDRS; j++) { + if (!v->addr[j]) break; + s += sprintf(s," at 0x%lx #%ld\n",v->addr[j],v->count[j]); + } + if (v->overflow) + s += sprintf(s," other #%ld\n",v->overflow); + } + return s - buf; +} + +static void zero_privop_addrs(void) +{ + int i,j; + for (i = 0; i < PRIVOP_COUNT_NINSTS; i++) { + struct privop_addr_count *v = &privop_addr_counter[i]; + for (j = 0; j < PRIVOP_COUNT_NADDRS; j++) + v->addr[j] = v->count[j] = 0; + v->overflow = 0; + } +} +#endif + +/************************************************************************** +Privileged operation instrumentation routines +**************************************************************************/ + +static const char * const Mpriv_str[64] = { + "mov_to_rr", "mov_to_dbr", "mov_to_ibr", "mov_to_pkr", + "mov_to_pmc", "mov_to_pmd", "<0x06>", "<0x07>", + "<0x08>", "ptc_l", "ptc_g", "ptc_ga", + "ptr_d", "ptr_i", "itr_d", "itr_i", + "mov_from_rr", "mov_from_dbr", "mov_from_ibr", "mov_from_pkr", + "mov_from_pmc", "<0x15>", "<0x16>", "<0x17>", + "<0x18>", "<0x19>", "privified-thash", "privified-ttag", + "<0x1c>", "<0x1d>", "tpa", "tak", + "<0x20>", "<0x21>", "<0x22>", "<0x23>", + "mov_from_cr", "mov_from_psr", "<0x26>", "<0x27>", + "<0x28>", "<0x29>", "<0x2a>", "<0x2b>", + "mov_to_cr", "mov_to_psr", "itc_d", "itc_i", + "<0x30>", "<0x31>", "<0x32>", "<0x33>", + "ptc_e", "<0x35>", "<0x36>", "<0x37>", + "<0x38>", "<0x39>", "<0x3a>", "<0x3b>", + "<0x3c>", "<0x3d>", "<0x3e>", "<0x3f>" +}; + +#define RS "Rsvd" +static const char * const cr_str[128] = { + "dcr","itm","iva",RS,RS,RS,RS,RS, + "pta",RS,RS,RS,RS,RS,RS,RS, + "ipsr","isr",RS,"iip","ifa","itir","iipa","ifs", + "iim","iha",RS,RS,RS,RS,RS,RS, + RS,RS,RS,RS,RS,RS,RS,RS, RS,RS,RS,RS,RS,RS,RS,RS, + RS,RS,RS,RS,RS,RS,RS,RS, RS,RS,RS,RS,RS,RS,RS,RS, + "lid","ivr","tpr","eoi","irr0","irr1","irr2","irr3", + "itv","pmv","cmcv",RS,RS,RS,RS,RS, + "lrr0","lrr1",RS,RS,RS,RS,RS,RS, + RS,RS,RS,RS,RS,RS,RS,RS, RS,RS,RS,RS,RS,RS,RS,RS, + RS,RS,RS,RS,RS,RS,RS,RS, RS,RS,RS,RS,RS,RS,RS,RS, + RS,RS,RS,RS,RS,RS,RS,RS +}; + +// FIXME: should use snprintf to ensure no buffer overflow +static int dump_privop_counts(char *buf) +{ + int i, j; + unsigned long sum = 0; + char *s = buf; + + // this is ugly and should probably produce sorted output + // but it will have to do for now + sum += privcnt.mov_to_ar_imm; sum += privcnt.mov_to_ar_reg; + sum += privcnt.ssm; sum += privcnt.rsm; + sum += privcnt.rfi; sum += privcnt.bsw0; + sum += privcnt.bsw1; sum += privcnt.cover; + for (i=0; i < 64; i++) sum += privcnt.Mpriv_cnt[i]; + s += sprintf(s,"Privop statistics: (Total privops: %ld)\n",sum); + if (privcnt.mov_to_ar_imm) + s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.mov_to_ar_imm, + "mov_to_ar_imm", (privcnt.mov_to_ar_imm*100L)/sum); + if (privcnt.mov_to_ar_reg) + s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.mov_to_ar_reg, + "mov_to_ar_reg", (privcnt.mov_to_ar_reg*100L)/sum); + if (privcnt.mov_from_ar) + s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.mov_from_ar, + "privified-mov_from_ar", (privcnt.mov_from_ar*100L)/sum); + if (privcnt.ssm) + s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.ssm, + "ssm", (privcnt.ssm*100L)/sum); + if (privcnt.rsm) + s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.rsm, + "rsm", (privcnt.rsm*100L)/sum); + if (privcnt.rfi) + s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.rfi, + "rfi", (privcnt.rfi*100L)/sum); + if (privcnt.bsw0) + s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.bsw0, + "bsw0", (privcnt.bsw0*100L)/sum); + if (privcnt.bsw1) + s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.bsw1, + "bsw1", (privcnt.bsw1*100L)/sum); + if (privcnt.cover) + s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.cover, + "cover", (privcnt.cover*100L)/sum); + if (privcnt.fc) + s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.fc, + "privified-fc", (privcnt.fc*100L)/sum); + if (privcnt.cpuid) + s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.cpuid, + "privified-getcpuid", (privcnt.cpuid*100L)/sum); + for (i=0; i < 64; i++) if (privcnt.Mpriv_cnt[i]) { + if (!Mpriv_str[i]) s += sprintf(s,"PRIVSTRING NULL!!\n"); + else s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.Mpriv_cnt[i], + Mpriv_str[i], (privcnt.Mpriv_cnt[i]*100L)/sum); + if (i == 0x24) { // mov from CR + s += sprintf(s," ["); + for (j=0; j < 128; j++) if (privcnt.from_cr_cnt[j]) { + if (!cr_str[j]) + s += sprintf(s,"PRIVSTRING NULL!!\n"); + else + s += sprintf(s,"%s(%ld),",cr_str[j], + privcnt.from_cr_cnt[j]); + } + s += sprintf(s,"]\n"); + } + else if (i == 0x2c) { // mov to CR + s += sprintf(s," ["); + for (j=0; j < 128; j++) if (privcnt.to_cr_cnt[j]) { + if (!cr_str[j]) + s += sprintf(s,"PRIVSTRING NULL!!\n"); + else + s += sprintf(s,"%s(%ld),",cr_str[j], + privcnt.to_cr_cnt[j]); + } + s += sprintf(s,"]\n"); + } + } + return s - buf; +} + +static int zero_privop_counts(char *buf) +{ + int i, j; + char *s = buf; + + // this is ugly and should probably produce sorted output + // but it will have to do for now + privcnt.mov_to_ar_imm = 0; privcnt.mov_to_ar_reg = 0; + privcnt.mov_from_ar = 0; + privcnt.ssm = 0; privcnt.rsm = 0; + privcnt.rfi = 0; privcnt.bsw0 = 0; + privcnt.bsw1 = 0; privcnt.cover = 0; + privcnt.fc = 0; privcnt.cpuid = 0; + for (i=0; i < 64; i++) privcnt.Mpriv_cnt[i] = 0; + for (j=0; j < 128; j++) privcnt.from_cr_cnt[j] = 0; + for (j=0; j < 128; j++) privcnt.to_cr_cnt[j] = 0; + s += sprintf(s,"All privop statistics zeroed\n"); + return s - buf; +} + +static int dump_misc_stats(char *buf) +{ + char *s = buf; + s += sprintf(s,"Virtual TR translations: %ld\n",tr_translate_count); + s += sprintf(s,"Virtual VHPT slow translations: %ld\n",vhpt_translate_count); + s += sprintf(s,"Virtual VHPT fast translations: %ld\n",fast_vhpt_translate_count); + s += sprintf(s,"Virtual DTLB translations: %ld\n",dtlb_translate_count); + s += sprintf(s,"Physical translations: %ld\n",phys_translate_count); + s += sprintf(s,"Recoveries to page fault: %ld\n",recover_to_page_fault_count); + s += sprintf(s,"Recoveries to break fault: %ld\n",recover_to_break_fault_count); + s += sprintf(s,"Idle when pending: %ld\n",idle_when_pending); + s += sprintf(s,"PAL_HALT_LIGHT (no pending): %ld\n",pal_halt_light_count); + s += sprintf(s,"context switches: %ld\n",context_switch_count); + s += sprintf(s,"Lazy covers: %ld\n",lazy_cover_count); + return s - buf; +} + +static void zero_misc_stats(void) +{ + dtlb_translate_count = 0; + tr_translate_count = 0; + phys_translate_count = 0; + vhpt_translate_count = 0; + fast_vhpt_translate_count = 0; + recover_to_page_fault_count = 0; + recover_to_break_fault_count = 0; + lazy_cover_count = 0; + pal_halt_light_count = 0; + idle_when_pending = 0; + context_switch_count = 0; +} + +static const char * const hyperpriv_str[HYPERPRIVOP_MAX+1] = { + 0, "rfi", "rsm.dt", "ssm.dt", "cover", "itc.d", "itc.i", "ssm.i", + "=ivr", "=tpr", "tpr=", "eoi", "itm=", "thash", "ptc.ga", "itr.d", + "=rr", "rr=", "kr=", "fc", "=cpuid", "=pmd", "=ar.eflg", "ar.eflg=" +}; + + +static int dump_hyperprivop_counts(char *buf) +{ + int i; + char *s = buf; + unsigned long total = 0; + for (i = 1; i <= HYPERPRIVOP_MAX; i++) total += slow_hyperpriv_cnt[i]; + s += sprintf(s,"Slow hyperprivops (total %ld):\n",total); + for (i = 1; i <= HYPERPRIVOP_MAX; i++) + if (slow_hyperpriv_cnt[i]) + s += sprintf(s,"%10ld %s\n", + slow_hyperpriv_cnt[i], hyperpriv_str[i]); + total = 0; + for (i = 1; i <= HYPERPRIVOP_MAX; i++) total += fast_hyperpriv_cnt[i]; + s += sprintf(s,"Fast hyperprivops (total %ld):\n",total); + for (i = 1; i <= HYPERPRIVOP_MAX; i++) + if (fast_hyperpriv_cnt[i]) + s += sprintf(s,"%10ld %s\n", + fast_hyperpriv_cnt[i], hyperpriv_str[i]); + return s - buf; +} + +static void zero_hyperprivop_counts(void) +{ + int i; + for (i = 0; i <= HYPERPRIVOP_MAX; i++) slow_hyperpriv_cnt[i] = 0; + for (i = 0; i <= HYPERPRIVOP_MAX; i++) fast_hyperpriv_cnt[i] = 0; +} + +static void zero_reflect_counts(void) +{ + int i; + for (i=0; i<0x80; i++) slow_reflect_count[i] = 0; + for (i=0; i<0x80; i++) fast_reflect_count[i] = 0; +} + +static int dump_reflect_counts(char *buf) +{ + int i,j,cnt; + char *s = buf; + + s += sprintf(s,"Slow reflections by vector:\n"); + for (i = 0, j = 0; i < 0x80; i++) { + if ( (cnt = slow_reflect_count[i]) != 0 ) { + s += sprintf(s,"0x%02x00:%10d, ",i,cnt); + if ((j++ & 3) == 3) s += sprintf(s,"\n"); + } + } + if (j & 3) s += sprintf(s,"\n"); + s += sprintf(s,"Fast reflections by vector:\n"); + for (i = 0, j = 0; i < 0x80; i++) { + if ( (cnt = fast_reflect_count[i]) != 0 ) { + s += sprintf(s,"0x%02x00:%10d, ",i,cnt); + if ((j++ & 3) == 3) s += sprintf(s,"\n"); + } + } + if (j & 3) s += sprintf(s,"\n"); + return s - buf; +} + + +#define TMPBUFLEN 8*1024 +int dump_privop_counts_to_user(char __user *ubuf, int len) +{ + char buf[TMPBUFLEN]; + int n; + + if (len < TMPBUFLEN) return -1; + + n = dump_privop_counts(buf); + n += dump_hyperprivop_counts(buf + n); + n += dump_reflect_counts(buf + n); +#ifdef PRIVOP_ADDR_COUNT + n += dump_privop_addrs(buf + n); +#endif + n += dump_vhpt_stats(buf + n); + n += dump_misc_stats(buf + n); + if (__copy_to_user(ubuf,buf,n)) return -1; + return n; +} + +int zero_privop_counts_to_user(char __user *ubuf, int len) +{ + char buf[TMPBUFLEN]; + int n; + + if (len < TMPBUFLEN) return -1; + + n = zero_privop_counts(buf); + + zero_hyperprivop_counts(); +#ifdef PRIVOP_ADDR_COUNT + zero_privop_addrs(); +#endif + zero_vhpt_stats(); + zero_misc_stats(); + zero_reflect_counts(); + if (__copy_to_user(ubuf,buf,n)) return -1; + return n; +} diff -r 4b51d081378d -r 7988370500e3 xen/include/asm-ia64/bundle.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xen/include/asm-ia64/bundle.h Thu Jun 29 10:06:12 2006 +0200 @@ -0,0 +1,228 @@ +#ifndef _XEN_IA64_BUNDLE_H +#define _XEN_IA64_BUNDLE_H + +typedef unsigned long IA64_INST; + +typedef union U_IA64_BUNDLE { + unsigned long i64[2]; + struct { unsigned long template:5,slot0:41,slot1a:18,slot1b:23,slot2:41; }; + // NOTE: following doesn't work because bitfields can't cross natural + // size boundaries + //struct { unsigned long template:5, slot0:41, slot1:41, slot2:41; }; +} IA64_BUNDLE; + +typedef enum E_IA64_SLOT_TYPE { I, M, F, B, L, ILLEGAL } IA64_SLOT_TYPE; + +typedef union U_INST64_A5 { + IA64_INST inst; + struct { unsigned long qp:6, r1:7, imm7b:7, r3:2, imm5c:5, imm9d:9, s:1, major:4; }; +} INST64_A5; + +typedef union U_INST64_B4 { + IA64_INST inst; + struct { unsigned long qp:6, btype:3, un3:3, p:1, b2:3, un11:11, x6:6, wh:2, d:1, un1:1, major:4; }; +} INST64_B4; + +typedef union U_INST64_B8 { + IA64_INST inst; + struct { unsigned long qp:6, un21:21, x6:6, un4:4, major:4; }; +} INST64_B8; + +typedef union U_INST64_B9 { + IA64_INST inst; + struct { unsigned long qp:6, imm20:20, :1, x6:6, :3, i:1, major:4; }; +} INST64_B9; + +typedef union U_INST64_I19 { + IA64_INST inst; + struct { unsigned long qp:6, imm20:20, :1, x6:6, x3:3, i:1, major:4; }; +} INST64_I19; + +typedef union U_INST64_I26 { + IA64_INST inst; + struct { unsigned long qp:6, :7, r2:7, ar3:7, x6:6, x3:3, :1, major:4;}; +} INST64_I26; + +typedef union U_INST64_I27 { + IA64_INST inst; + struct { unsigned long qp:6, :7, imm:7, ar3:7, x6:6, x3:3, s:1, major:4;}; +} INST64_I27; + +typedef union U_INST64_I28 { // not privileged (mov from AR) + IA64_INST inst; + struct { unsigned long qp:6, r1:7, :7, ar3:7, x6:6, x3:3, :1, major:4;}; +} INST64_I28; + +typedef union U_INST64_M28 { + IA64_INST inst; + struct { unsigned long qp:6, :14, r3:7, x6:6, x3:3, :1, major:4;}; +} INST64_M28; + +typedef union U_INST64_M29 { + IA64_INST inst; + struct { unsigned long qp:6, :7, r2:7, ar3:7, x6:6, x3:3, :1, major:4;}; +} INST64_M29; + +typedef union U_INST64_M30 { + IA64_INST inst; + struct { unsigned long qp:6, :7, imm:7, ar3:7,x4:4,x2:2,x3:3,s:1,major:4;}; +} INST64_M30; + +typedef union U_INST64_M31 { + IA64_INST inst; + struct { unsigned long qp:6, r1:7, :7, ar3:7, x6:6, x3:3, :1, major:4;}; +} INST64_M31; + +typedef union U_INST64_M32 { + IA64_INST inst; + struct { unsigned long qp:6, :7, r2:7, cr3:7, x6:6, x3:3, :1, major:4;}; +} INST64_M32; + +typedef union U_INST64_M33 { + IA64_INST inst; + struct { unsigned long qp:6, r1:7, :7, cr3:7, x6:6, x3:3, :1, major:4; }; +} INST64_M33; + +typedef union U_INST64_M35 { + IA64_INST inst; + struct { unsigned long qp:6, :7, r2:7, :7, x6:6, x3:3, :1, major:4; }; + +} INST64_M35; + +typedef union U_INST64_M36 { + IA64_INST inst; + struct { unsigned long qp:6, r1:7, :14, x6:6, x3:3, :1, major:4; }; +} INST64_M36; + +typedef union U_INST64_M37 { + IA64_INST inst; + struct { unsigned long qp:6, imm20a:20,:1, x4:4,x2:2,x3:3, i:1, major:4; }; +} INST64_M37; + +typedef union U_INST64_M41 { + IA64_INST inst; + struct { unsigned long qp:6, :7, r2:7, :7, x6:6, x3:3, :1, major:4; }; +} INST64_M41; + +typedef union U_INST64_M42 { + IA64_INST inst; + struct { unsigned long qp:6, :7, r2:7, r3:7, x6:6, x3:3, :1, major:4; }; +} INST64_M42; + +typedef union U_INST64_M43 { + IA64_INST inst; + struct { unsigned long qp:6, r1:7, :7, r3:7, x6:6, x3:3, :1, major:4; }; +} INST64_M43; + +typedef union U_INST64_M44 { + IA64_INST inst; + struct { unsigned long qp:6, imm:21, x4:4, i2:2, x3:3, i:1, major:4; }; +} INST64_M44; + +typedef union U_INST64_M45 { + IA64_INST inst; + struct { unsigned long qp:6, :7, r2:7, r3:7, x6:6, x3:3, :1, major:4; }; +} INST64_M45; + +typedef union U_INST64_M46 { + IA64_INST inst; + struct { unsigned long qp:6, r1:7, un7:7, r3:7, x6:6, x3:3, un1:1, major:4; }; +} INST64_M46; + +typedef union U_INST64_M47 { + IA64_INST inst; + struct { unsigned long qp:6, un14:14, r3:7, x6:6, x3:3, un1:1, major:4; }; +} INST64_M47; + +typedef union U_INST64_M1{ + IA64_INST inst; + struct { unsigned long qp:6, r1:7, un7:7, r3:7, x:1, hint:2, x6:6, m:1, major:4; }; +} INST64_M1; + +typedef union U_INST64_M2{ + IA64_INST inst; + struct { unsigned long qp:6, r1:7, r2:7, r3:7, x:1, hint:2, x6:6, m:1, major:4; }; +} INST64_M2; + +typedef union U_INST64_M3{ + IA64_INST inst; + struct { unsigned long qp:6, r1:7, imm7:7, r3:7, i:1, hint:2, x6:6, s:1, major:4; }; +} INST64_M3; + +typedef union U_INST64_M4 { + IA64_INST inst; + struct { unsigned long qp:6, un7:7, r2:7, r3:7, x:1, hint:2, x6:6, m:1, major:4; }; +} INST64_M4; + +typedef union U_INST64_M5 { + IA64_INST inst; + struct { unsigned long qp:6, imm7:7, r2:7, r3:7, i:1, hint:2, x6:6, s:1, major:4; }; +} INST64_M5; + +typedef union U_INST64_M6 { + IA64_INST inst; + struct { unsigned long qp:6, f1:7, un7:7, r3:7, x:1, hint:2, x6:6, m:1, major:4; }; +} INST64_M6; + +typedef union U_INST64_M9 { + IA64_INST inst; + struct { unsigned long qp:6, :7, f2:7, r3:7, x:1, hint:2, x6:6, m:1, major:4; }; +} INST64_M9; + +typedef union U_INST64_M10 { + IA64_INST inst; + struct { unsigned long qp:6, imm7:7, f2:7, r3:7, i:1, hint:2, x6:6, s:1, major:4; }; +} INST64_M10; + +typedef union U_INST64_M12 { + IA64_INST inst; + struct { unsigned long qp:6, f1:7, f2:7, r3:7, x:1, hint:2, x6:6, m:1, major:4; }; +} INST64_M12; + +typedef union U_INST64_M15 { + IA64_INST inst; + struct { unsigned long qp:6, :7, imm7:7, r3:7, i:1, hint:2, x6:6, s:1, major:4; }; +} INST64_M15; + +typedef union U_INST64 { + IA64_INST inst; + struct { unsigned long :37, major:4; } generic; + INST64_A5 A5; // used in build_hypercall_bundle only + INST64_B4 B4; // used in build_hypercall_bundle only + INST64_B8 B8; // rfi, bsw.[01] + INST64_B9 B9; // break.b + INST64_I19 I19; // used in build_hypercall_bundle only + INST64_I26 I26; // mov register to ar (I unit) + INST64_I27 I27; // mov immediate to ar (I unit) + INST64_I28 I28; // mov from ar (I unit) + INST64_M1 M1; // ld integer + INST64_M2 M2; + INST64_M3 M3; + INST64_M4 M4; // st integer + INST64_M5 M5; + INST64_M6 M6; // ldfd floating pointer + INST64_M9 M9; // stfd floating pointer + INST64_M10 M10; // stfd floating pointer + INST64_M12 M12; // ldfd pair floating pointer + INST64_M15 M15; // lfetch + imm update + INST64_M28 M28; // purge translation cache entry + INST64_M29 M29; // mov register to ar (M unit) + INST64_M30 M30; // mov immediate to ar (M unit) + INST64_M31 M31; // mov from ar (M unit) + INST64_M32 M32; // mov reg to cr + INST64_M33 M33; // mov from cr + INST64_M35 M35; // mov to psr + INST64_M36 M36; // mov from psr + INST64_M37 M37; // break.m + INST64_M41 M41; // translation cache insert + INST64_M42 M42; // mov to indirect reg/translation reg insert + INST64_M43 M43; // mov from indirect reg + INST64_M44 M44; // set/reset system mask + INST64_M45 M45; // translation purge + INST64_M46 M46; // translation access (tpa,tak) + INST64_M47 M47; // purge translation entry +} INST64; + +#define MASK_41 ((unsigned long)0x1ffffffffff) + +#endif /* _XEN_IA64_BUNDLE_H */ diff -r 4b51d081378d -r 7988370500e3 xen/include/asm-ia64/privop_stat.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xen/include/asm-ia64/privop_stat.h Thu Jun 29 10:06:12 2006 +0200 @@ -0,0 +1,66 @@ +#ifndef _XEN_UA64_PRIVOP_STAT_H +#define _XEN_UA64_PRIVOP_STAT_H +#include + +extern int dump_privop_counts_to_user(char *, int); +extern int zero_privop_counts_to_user(char *, int); + +#define PRIVOP_ADDR_COUNT + +/* vcpu_translate hit with dtlb. */ +extern unsigned long dtlb_translate_count; + +/* vcpu_translate hit with tr. */ +extern unsigned long tr_translate_count; + +/* vcpu_translate in metaphysical mode. */ +extern unsigned long phys_translate_count; + +extern unsigned long vhpt_translate_count; +extern unsigned long fast_vhpt_translate_count; +extern unsigned long recover_to_page_fault_count; +extern unsigned long recover_to_break_fault_count; +extern unsigned long idle_when_pending; +extern unsigned long pal_halt_light_count; +extern unsigned long context_switch_count; +extern unsigned long lazy_cover_count; + +extern unsigned long slow_hyperpriv_cnt[HYPERPRIVOP_MAX+1]; +extern unsigned long fast_hyperpriv_cnt[HYPERPRIVOP_MAX+1]; + +extern unsigned long slow_reflect_count[0x80]; +extern unsigned long fast_reflect_count[0x80]; + +struct privop_counters { + unsigned long mov_to_ar_imm; + unsigned long mov_to_ar_reg; + unsigned long mov_from_ar; + unsigned long ssm; + unsigned long rsm; + unsigned long rfi; + unsigned long bsw0; + unsigned long bsw1; + unsigned long cover; + unsigned long fc; + unsigned long cpuid; + unsigned long Mpriv_cnt[64]; + + unsigned long to_cr_cnt[128]; /* Number of mov to cr privop. */ + unsigned long from_cr_cnt[128]; /* Number of mov from cr privop. */ +}; + +extern struct privop_counters privcnt; + +#ifdef PRIVOP_ADDR_COUNT + +/* INST argument of PRIVOP_COUNT_ADDR. */ +#define _GET_IFA 0 +#define _THASH 1 +#define PRIVOP_COUNT_ADDR(regs,inst) privop_count_addr(regs->cr_iip,inst) +extern void privop_count_addr(unsigned long addr, int inst); + +#else +#define PRIVOP_COUNT_ADDR(x,y) do {} while (0) +#endif + +#endif /* _XEN_UA64_PRIVOP_STAT_H */