WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] Add support for privified mov-from-pmd

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] Add support for privified mov-from-pmd
From: BitKeeper Bot <riel@xxxxxxxxxxx>
Date: Fri, 06 May 2005 17:02:01 +0000
Delivery-date: Wed, 11 May 2005 07:03:07 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: Xen Development List <xen-devel@xxxxxxxxxxxxxxxxxxx>
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
ChangeSet 1.1423.5.1, 2005/05/06 11:02:01-06:00, djm@xxxxxxxxxxxxxxx

        Add support for privified mov-from-pmd
        Add counters for privified-fc and privified-cpuid
        Add optional support for counting addresses of privops
        Remove unnecessary PCI stuff
        Add optional heartbeat console output
        Signed-off by: Dan Magenheimer <dan.magenheimer@xxxxxx>
        



 arch/ia64/privop.c        |   82 +++++++++++++++++++++++++++++++++++++++++++---
 arch/ia64/vcpu.c          |   41 ++++++++++++-----------
 arch/ia64/xenmisc.c       |   69 --------------------------------------
 arch/ia64/xentime.c       |   11 ++++++
 include/asm-ia64/config.h |    6 ---
 include/asm-ia64/vcpu.h   |   15 ++++++++
 6 files changed, 126 insertions(+), 98 deletions(-)


diff -Nru a/xen/arch/ia64/privop.c b/xen/arch/ia64/privop.c
--- a/xen/arch/ia64/privop.c    2005-05-11 03:03:38 -04:00
+++ b/xen/arch/ia64/privop.c    2005-05-11 03:03:38 -04:00
@@ -417,10 +417,17 @@
        UINT64 val;
        IA64FAULT fault;
        
-       fault = vcpu_get_pmc(vcpu,vcpu_get_gr(vcpu,inst.M43.r3),&val);
-       if (fault == IA64_NO_FAULT)
-               return vcpu_set_gr(vcpu, inst.M43.r1, val);
-       else return fault;
+       if (inst.M43.r1 > 63) { // privified mov from pmd
+               fault = vcpu_get_pmd(vcpu,vcpu_get_gr(vcpu,inst.M43.r3),&val);
+               if (fault == IA64_NO_FAULT)
+                       return vcpu_set_gr(vcpu, inst.M43.r1-64, val);
+       }
+       else {
+               fault = vcpu_get_pmc(vcpu,vcpu_get_gr(vcpu,inst.M43.r3),&val);
+               if (fault == IA64_NO_FAULT)
+                       return vcpu_set_gr(vcpu, inst.M43.r1, val);
+       }
+       return fault;
 }
 
 unsigned long from_cr_cnt[128] = { 0 };
@@ -531,6 +538,8 @@
        unsigned long bsw0;
        unsigned long bsw1;
        unsigned long cover;
+       unsigned long fc;
+       unsigned long cpuid;
        unsigned long Mpriv_cnt[64];
 } privcnt = { 0 };
 
@@ -631,7 +640,11 @@
                                else x6 = 0x1a;
                        }
                }
-               privcnt.Mpriv_cnt[x6]++;
+               if (x6 == 52 && inst.M28.r3 > 63)
+                       privcnt.fc++;
+               else if (x6 == 16 && inst.M43.r3 > 63)
+                       privcnt.cpuid++;
+               else privcnt.Mpriv_cnt[x6]++;
                return (*pfunc)(vcpu,inst);
                break;
            case B:
@@ -826,6 +839,12 @@
        if (privcnt.cover)
                s += sprintf(s,"%10d  %s [%d%%]\r\n", privcnt.cover,
                        "cover", (privcnt.cover*100L)/sum);
+       if (privcnt.fc)
+               s += sprintf(s,"%10d  %s [%d%%]\r\n", privcnt.fc,
+                       "privified-fc", (privcnt.fc*100L)/sum);
+       if (privcnt.cpuid)
+               s += sprintf(s,"%10d  %s [%d%%]\r\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!!\r\n");
                else s += sprintf(s,"%10d  %s [%d%%]\r\n", privcnt.Mpriv_cnt[i],
@@ -864,6 +883,7 @@
        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;
@@ -871,12 +891,61 @@
        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++;;
+}
+
+int dump_privop_addrs(char *buf)
+{
+       int i,j;
+       char *s = buf;
+       s += sprintf(s,"Privop addresses:\r\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," @%p #%ld\n",v->addr[j],v->count[j]);
+               }
+               if (v->overflow) 
+                       s += sprintf(s," other #%ld\n",v->overflow);
+       }
+       return s - buf;
+}
+
+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
+
 #define TMPBUFLEN 8*1024
 int dump_privop_counts_to_user(char __user *ubuf, int len)
 {
        char buf[TMPBUFLEN];
        int n = dump_privop_counts(buf);
 
+#ifdef PRIVOP_ADDR_COUNT
+       n += dump_privop_addrs(buf + n);
+#endif
        if (len < TMPBUFLEN) return -1;
        if (__copy_to_user(ubuf,buf,n)) return -1;
        return n;
@@ -887,6 +956,9 @@
        char buf[TMPBUFLEN];
        int n = zero_privop_counts(buf);
 
+#ifdef PRIVOP_ADDR_COUNT
+       zero_privop_addrs();
+#endif
        if (len < TMPBUFLEN) return -1;
        if (__copy_to_user(ubuf,buf,n)) return -1;
        return n;
diff -Nru a/xen/arch/ia64/vcpu.c b/xen/arch/ia64/vcpu.c
--- a/xen/arch/ia64/vcpu.c      2005-05-11 03:03:38 -04:00
+++ b/xen/arch/ia64/vcpu.c      2005-05-11 03:03:38 -04:00
@@ -37,6 +37,17 @@
 
 #define STATIC
 
+#ifdef PRIVOP_ADDR_COUNT
+struct privop_addr_count privop_addr_counter[PRIVOP_COUNT_NINSTS] = {
+       { "rsm", { 0 }, { 0 }, 0 },
+       { "ssm", { 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 vcpu_verbose = 0;
 #define verbose(a...) do {if (vcpu_verbose) printf(a);} while(0)
 
@@ -77,30 +88,20 @@
 IA64FAULT vcpu_set_ar(VCPU *vcpu, UINT64 reg, UINT64 val)
 {
        if (reg == 44) return (vcpu_set_itc(vcpu,val));
-       if (reg == 27) return (IA64_ILLOP_FAULT);
-       if (reg > 7) return (IA64_ILLOP_FAULT);
-       PSCB(vcpu,krs[reg]) = val;
-#if 0
-// for now, privify kr read's so all kr accesses are privileged
-       switch (reg) {
-             case 0: asm volatile ("mov ar.k0=%0" :: "r"(val)); break;
-             case 1: asm volatile ("mov ar.k1=%0" :: "r"(val)); break;
-             case 2: asm volatile ("mov ar.k2=%0" :: "r"(val)); break;
-             case 3: asm volatile ("mov ar.k3=%0" :: "r"(val)); break;
-             case 4: asm volatile ("mov ar.k4=%0" :: "r"(val)); break;
-             case 5: asm volatile ("mov ar.k5=%0" :: "r"(val)); break;
-             case 6: asm volatile ("mov ar.k6=%0" :: "r"(val)); break;
-             case 7: asm volatile ("mov ar.k7=%0" :: "r"(val)); break;
-             case 27: asm volatile ("mov ar.cflg=%0" :: "r"(val)); break;
-       }
-#endif
+       else if (reg == 27) return (IA64_ILLOP_FAULT);
+       else if (reg == 24)
+           printf("warning: setting ar.eflg is a no-op; no IA-32 support\n");
+       else if (reg > 7) return (IA64_ILLOP_FAULT);
+       else PSCB(vcpu,krs[reg]) = val;
        return IA64_NO_FAULT;
 }
 
 IA64FAULT vcpu_get_ar(VCPU *vcpu, UINT64 reg, UINT64 *val)
 {
-       if (reg > 7) return (IA64_ILLOP_FAULT);
-       *val = PSCB(vcpu,krs[reg]);
+       if (reg == 24)
+           printf("warning: getting ar.eflg is a no-op; no IA-32 support\n");
+       else if (reg > 7) return (IA64_ILLOP_FAULT);
+       else *val = PSCB(vcpu,krs[reg]);
        return IA64_NO_FAULT;
 }
 
@@ -124,6 +125,7 @@
        struct ia64_psr psr, imm, *ipsr;
        REGS *regs = vcpu_regs(vcpu);
 
+       PRIVOP_COUNT_ADDR(regs,_RSM);
        // TODO: All of these bits need to be virtualized
        // TODO: Only allowed for current vcpu
        __asm__ __volatile ("mov %0=psr;;" : "=r"(psr) :: "memory");
@@ -158,6 +160,7 @@
        REGS *regs = vcpu_regs(vcpu);
        UINT64 mask, enabling_interrupts = 0;
 
+       PRIVOP_COUNT_ADDR(regs,_SSM);
        // TODO: All of these bits need to be virtualized
        __asm__ __volatile ("mov %0=psr;;" : "=r"(psr) :: "memory");
        imm = *(struct ia64_psr *)&imm24;
diff -Nru a/xen/arch/ia64/xenmisc.c b/xen/arch/ia64/xenmisc.c
--- a/xen/arch/ia64/xenmisc.c   2005-05-11 03:03:38 -04:00
+++ b/xen/arch/ia64/xenmisc.c   2005-05-11 03:03:38 -04:00
@@ -133,80 +133,13 @@
 }
 
 ///////////////////////////////
-// from arch/x86/pci.c
-///////////////////////////////
-
-int
-pcibios_prep_mwi (struct pci_dev *dev)
-{
-       dummy();
-}
-
-///////////////////////////////
-// from arch/x86/pci-irq.c
-///////////////////////////////
-
-void pcibios_enable_irq(struct pci_dev *dev)
-{
-       dummy();
-}
-
-///////////////////////////////
-// from arch/ia64/pci-pc.c
-///////////////////////////////
-
-#include <xen/pci.h>
-
-int pcibios_enable_device(struct pci_dev *dev, int mask)
-{

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] Add support for privified mov-from-pmd, BitKeeper Bot <=