[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] More hyperprivops



ChangeSet 1.1709.1.11, 2005/06/15 17:26:50-06:00, djm@xxxxxxxxxxxxxxx

        More hyperprivops
        Signed-off-by: Dan Magenheimer <dan.magenheimer@xxxxxx>



 arch/ia64/privop.c      |   32 ++++++++++++++++++++++++++++++--
 arch/ia64/vcpu.c        |   13 +++++++++----
 include/asm-ia64/vcpu.h |    4 ++--
 3 files changed, 41 insertions(+), 8 deletions(-)


diff -Nru a/xen/arch/ia64/privop.c b/xen/arch/ia64/privop.c
--- a/xen/arch/ia64/privop.c    2005-06-19 14:04:55 -04:00
+++ b/xen/arch/ia64/privop.c    2005-06-19 14:04:55 -04:00
@@ -753,11 +753,17 @@
 #define HYPERPRIVOP_SET_TPR            0xa
 #define HYPERPRIVOP_EOI                        0xb
 #define HYPERPRIVOP_SET_ITM            0xc
-#define HYPERPRIVOP_MAX                        0xc
+#define HYPERPRIVOP_THASH              0xd
+#define HYPERPRIVOP_PTC_GA             0xe
+#define HYPERPRIVOP_ITR_D              0xf
+#define HYPERPRIVOP_GET_RR             0x10
+#define HYPERPRIVOP_SET_RR             0x11
+#define HYPERPRIVOP_MAX                        0x11
 
 char *hyperpriv_str[HYPERPRIVOP_MAX+1] = {
        0, "rfi", "rsm.dt", "ssm.dt", "cover", "itc.d", "itc.i", "ssm.i",
-       "=ivr", "=tpr", "tpr=", "eoi", "itm=",
+       "=ivr", "=tpr", "tpr=", "eoi", "itm=", "thash", "ptc.ga", "itr.d",
+       "=rr", "rr=",
        0
 };
 
@@ -772,6 +778,7 @@
        struct vcpu *v = (struct domain *) current;
        INST64 inst;
        UINT64 val;
+       UINT64 itir, ifa;
 
 // FIXME: Handle faults appropriately for these
        if (!iim || iim > HYPERPRIVOP_MAX) {
@@ -819,6 +826,27 @@
                return 1;
            case HYPERPRIVOP_SET_ITM:
                (void)vcpu_set_itm(v,regs->r8);
+               return 1;
+           case HYPERPRIVOP_THASH:
+               (void)vcpu_thash(v,regs->r8,&val);
+               regs->r8 = val;
+               return 1;
+           case HYPERPRIVOP_PTC_GA:
+               // FIXME: this doesn't seem to work yet, turned off
+               //(void)vcpu_ptc_ga(v,regs->r8,regs->r9);
+               //return 1;
+               break;
+           case HYPERPRIVOP_ITR_D:
+               (void)vcpu_get_itir(v,&itir);
+               (void)vcpu_get_ifa(v,&ifa);
+               (void)vcpu_itr_d(v,regs->r8,regs->r9,itir,ifa);
+               return 1;
+           case HYPERPRIVOP_GET_RR:
+               (void)vcpu_get_rr(v,regs->r8,&val);
+               regs->r8 = val;
+               return 1;
+           case HYPERPRIVOP_SET_RR:
+               (void)vcpu_set_rr(v,regs->r8,regs->r9);
                return 1;
        }
        return 0;
diff -Nru a/xen/arch/ia64/vcpu.c b/xen/arch/ia64/vcpu.c
--- a/xen/arch/ia64/vcpu.c      2005-06-19 14:04:55 -04:00
+++ b/xen/arch/ia64/vcpu.c      2005-06-19 14:04:55 -04:00
@@ -43,8 +43,9 @@
 
 #ifdef PRIVOP_ADDR_COUNT
 struct privop_addr_count privop_addr_counter[PRIVOP_COUNT_NINSTS] = {
-       { "rsm", { 0 }, { 0 }, 0 },
-       { "ssm", { 0 }, { 0 }, 0 }
+       { "=ifa", { 0 }, { 0 }, 0 },
+       { "thash", { 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)
@@ -135,7 +136,7 @@
        struct ia64_psr psr, imm, *ipsr;
        REGS *regs = vcpu_regs(vcpu);
 
-       PRIVOP_COUNT_ADDR(regs,_RSM);
+       //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");
@@ -183,7 +184,7 @@
        REGS *regs = vcpu_regs(vcpu);
        UINT64 mask, enabling_interrupts = 0;
 
-       PRIVOP_COUNT_ADDR(regs,_SSM);
+       //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;
@@ -369,6 +370,8 @@
 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;
        return (IA64_NO_FAULT);
 }
@@ -422,6 +425,8 @@
 {
        //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;
        return (IA64_NO_FAULT);
 }
diff -Nru a/xen/include/asm-ia64/vcpu.h b/xen/include/asm-ia64/vcpu.h
--- a/xen/include/asm-ia64/vcpu.h       2005-06-19 14:04:55 -04:00
+++ b/xen/include/asm-ia64/vcpu.h       2005-06-19 14:04:55 -04:00
@@ -23,8 +23,8 @@
 
 #define PRIVOP_ADDR_COUNT
 #ifdef PRIVOP_ADDR_COUNT
-#define _RSM 0
-#define _SSM 1
+#define _GET_IFA 0
+#define _THASH 1
 #define PRIVOP_COUNT_NINSTS 2
 #define PRIVOP_COUNT_NADDRS 30
 

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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.