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

[Xen-changelog] [IA64] more mmio insn for VTi



# HG changeset patch
# User awilliam@xxxxxxxxxxx
# Node ID c3972d632ff6bda90a858117ed5ba7b525c24ba2
# Parent  2de95fd92e740eb709e2b54aa5d4ef54e1cf97a1
[IA64] more mmio insn for VTi

getfpregs rewritten for Xen.
mmio.c: handle more instructions, panic replaced by panic_domain.

Signed-off-by: Tristan Gingold <tristan.gingold@xxxxxxxx>

diff -r 2de95fd92e74 -r c3972d632ff6 xen/arch/ia64/Rules.mk
--- a/xen/arch/ia64/Rules.mk    Wed Apr 19 10:26:50 2006 -0600
+++ b/xen/arch/ia64/Rules.mk    Wed Apr 19 10:32:36 2006 -0600
@@ -28,7 +28,7 @@ CFLAGS  += -I$(BASEDIR)/include/asm-ia64
            -I$(BASEDIR)/arch/ia64/linux -I$(BASEDIR)/arch/ia64/linux-xen
 #CFLAGS  += -Wno-pointer-arith -Wredundant-decls
 CFLAGS  += -DIA64 -DXEN -DLINUX_2_6 -DV_IOSAPIC_READY
-CFLAGS += -ffixed-r13 -mfixed-range=f12-f15,f32-f127
+CFLAGS += -ffixed-r13 -mfixed-range=f2-f5,f12-f127
 CFLAGS += -g
 #CFLAGS  += -DVTI_DEBUG
 ifeq ($(VALIDATE_VT),y)
diff -r 2de95fd92e74 -r c3972d632ff6 xen/arch/ia64/linux-xen/unaligned.c
--- a/xen/arch/ia64/linux-xen/unaligned.c       Wed Apr 19 10:26:50 2006 -0600
+++ b/xen/arch/ia64/linux-xen/unaligned.c       Wed Apr 19 10:32:36 2006 -0600
@@ -750,6 +750,154 @@ getfpreg (unsigned long regnum, struct i
                }
        }
 }
+#else
+void
+getfpreg (unsigned long regnum, struct ia64_fpreg *fpval, struct pt_regs *regs)
+{
+#define CASE_FIXED_FP(reg)                     \
+       case reg:                               \
+               ia64_stf_spill(fpval,reg);      \
+               break
+#define CASE_SAVED_FP(reg)                                     \
+       case reg:                                               \
+               fpval->u.bits[0] = regs->f##reg.u.bits[0];      \
+               fpval->u.bits[1] = regs->f##reg.u.bits[1];      \
+               break
+       switch(regnum) {
+               CASE_FIXED_FP(0);
+               CASE_FIXED_FP(1);
+               CASE_FIXED_FP(2);
+               CASE_FIXED_FP(3);
+               CASE_FIXED_FP(4);
+               CASE_FIXED_FP(5);
+
+               CASE_SAVED_FP(6);
+               CASE_SAVED_FP(7);
+               CASE_SAVED_FP(8);
+               CASE_SAVED_FP(9);
+               CASE_SAVED_FP(10);
+               CASE_SAVED_FP(11);
+
+               CASE_FIXED_FP(12);
+               CASE_FIXED_FP(13);
+               CASE_FIXED_FP(14);
+               CASE_FIXED_FP(15);
+               CASE_FIXED_FP(16);
+               CASE_FIXED_FP(17);
+               CASE_FIXED_FP(18);
+               CASE_FIXED_FP(19);
+               CASE_FIXED_FP(20);
+               CASE_FIXED_FP(21);
+               CASE_FIXED_FP(22);
+               CASE_FIXED_FP(23);
+               CASE_FIXED_FP(24);
+               CASE_FIXED_FP(25);
+               CASE_FIXED_FP(26);
+               CASE_FIXED_FP(27);
+               CASE_FIXED_FP(28);
+               CASE_FIXED_FP(29);
+               CASE_FIXED_FP(30);
+               CASE_FIXED_FP(31);
+               CASE_FIXED_FP(32);
+               CASE_FIXED_FP(33);
+               CASE_FIXED_FP(34);
+               CASE_FIXED_FP(35);
+               CASE_FIXED_FP(36);
+               CASE_FIXED_FP(37);
+               CASE_FIXED_FP(38);
+               CASE_FIXED_FP(39);
+               CASE_FIXED_FP(40);
+               CASE_FIXED_FP(41);
+               CASE_FIXED_FP(42);
+               CASE_FIXED_FP(43);
+               CASE_FIXED_FP(44);
+               CASE_FIXED_FP(45);
+               CASE_FIXED_FP(46);
+               CASE_FIXED_FP(47);
+               CASE_FIXED_FP(48);
+               CASE_FIXED_FP(49);
+               CASE_FIXED_FP(50);
+               CASE_FIXED_FP(51);
+               CASE_FIXED_FP(52);
+               CASE_FIXED_FP(53);
+               CASE_FIXED_FP(54);
+               CASE_FIXED_FP(55);
+               CASE_FIXED_FP(56);
+               CASE_FIXED_FP(57);
+               CASE_FIXED_FP(58);
+               CASE_FIXED_FP(59);
+               CASE_FIXED_FP(60);
+               CASE_FIXED_FP(61);
+               CASE_FIXED_FP(62);
+               CASE_FIXED_FP(63);
+               CASE_FIXED_FP(64);
+               CASE_FIXED_FP(65);
+               CASE_FIXED_FP(66);
+               CASE_FIXED_FP(67);
+               CASE_FIXED_FP(68);
+               CASE_FIXED_FP(69);
+               CASE_FIXED_FP(70);
+               CASE_FIXED_FP(71);
+               CASE_FIXED_FP(72);
+               CASE_FIXED_FP(73);
+               CASE_FIXED_FP(74);
+               CASE_FIXED_FP(75);
+               CASE_FIXED_FP(76);
+               CASE_FIXED_FP(77);
+               CASE_FIXED_FP(78);
+               CASE_FIXED_FP(79);
+               CASE_FIXED_FP(80);
+               CASE_FIXED_FP(81);
+               CASE_FIXED_FP(82);
+               CASE_FIXED_FP(83);
+               CASE_FIXED_FP(84);
+               CASE_FIXED_FP(85);
+               CASE_FIXED_FP(86);
+               CASE_FIXED_FP(87);
+               CASE_FIXED_FP(88);
+               CASE_FIXED_FP(89);
+               CASE_FIXED_FP(90);
+               CASE_FIXED_FP(91);
+               CASE_FIXED_FP(92);
+               CASE_FIXED_FP(93);
+               CASE_FIXED_FP(94);
+               CASE_FIXED_FP(95);
+               CASE_FIXED_FP(96);
+               CASE_FIXED_FP(97);
+               CASE_FIXED_FP(98);
+               CASE_FIXED_FP(99);
+               CASE_FIXED_FP(100);
+               CASE_FIXED_FP(101);
+               CASE_FIXED_FP(102);
+               CASE_FIXED_FP(103);
+               CASE_FIXED_FP(104);
+               CASE_FIXED_FP(105);
+               CASE_FIXED_FP(106);
+               CASE_FIXED_FP(107);
+               CASE_FIXED_FP(108);
+               CASE_FIXED_FP(109);
+               CASE_FIXED_FP(110);
+               CASE_FIXED_FP(111);
+               CASE_FIXED_FP(112);
+               CASE_FIXED_FP(113);
+               CASE_FIXED_FP(114);
+               CASE_FIXED_FP(115);
+               CASE_FIXED_FP(116);
+               CASE_FIXED_FP(117);
+               CASE_FIXED_FP(118);
+               CASE_FIXED_FP(119);
+               CASE_FIXED_FP(120);
+               CASE_FIXED_FP(121);
+               CASE_FIXED_FP(122);
+               CASE_FIXED_FP(123);
+               CASE_FIXED_FP(124);
+               CASE_FIXED_FP(125);
+               CASE_FIXED_FP(126);
+               CASE_FIXED_FP(127);
+       }
+#undef CASE_FIXED_FP
+#undef CASE_SAVED_FP
+}
 #endif /* XEN */
 
 
diff -r 2de95fd92e74 -r c3972d632ff6 xen/arch/ia64/vmx/mmio.c
--- a/xen/arch/ia64/vmx/mmio.c  Wed Apr 19 10:26:50 2006 -0600
+++ b/xen/arch/ia64/vmx/mmio.c  Wed Apr 19 10:32:36 2006 -0600
@@ -57,20 +57,21 @@ static void pib_write(VCPU *vcpu, void *
 {
     switch (pib_off) {
     case PIB_OFST_INTA:
-        panic("Undefined write on PIB INTA\n");
+        panic_domain(NULL,"Undefined write on PIB INTA\n");
         break;
     case PIB_OFST_XTP:
         if ( s == 1 && ma == 4 /* UC */) {
             vmx_vcpu_get_plat(vcpu)->xtp = *(uint8_t *)src;
         }
         else {
-            panic("Undefined write on PIB XTP\n");
+            panic_domain(NULL,"Undefined write on PIB XTP\n");
         }
         break;
     default:
         if ( PIB_LOW_HALF(pib_off) ) {   // lower half
             if ( s != 8 || ma != 0x4 /* UC */ ) {
-                panic("Undefined IPI-LHF write with s %ld, ma %d!\n", s, ma);
+                panic_domain
+                 (NULL,"Undefined IPI-LHF write with s %ld, ma %d!\n", s, ma);
             }
             else {
                 write_ipi(vcpu, pib_off, *(uint64_t *)src);
@@ -79,7 +80,7 @@ static void pib_write(VCPU *vcpu, void *
         }
         else {      // upper half
             printf("IPI-UHF write %lx\n",pib_off);
-            panic("Not support yet for SM-VP\n");
+            panic_domain(NULL,"Not support yet for SM-VP\n");
         }
         break;
     }
@@ -94,7 +95,7 @@ static void pib_read(VCPU *vcpu, uint64_
             // TODO: INTA read from IOSAPIC
         }
         else {
-            panic("Undefined read on PIB INTA\n");
+            panic_domain(NULL,"Undefined read on PIB INTA\n");
         }
         break;
     case PIB_OFST_XTP:
@@ -102,13 +103,13 @@ static void pib_read(VCPU *vcpu, uint64_
             *((uint8_t*)dest) = vmx_vcpu_get_plat(vcpu)->xtp;
         }
         else {
-            panic("Undefined read on PIB XTP\n");
+            panic_domain(NULL,"Undefined read on PIB XTP\n");
         }
         break;
     default:
         if ( PIB_LOW_HALF(pib_off) ) {   // lower half
             if ( s != 8 || ma != 4 ) {
-                panic("Undefined IPI-LHF read!\n");
+                panic_domain(NULL,"Undefined IPI-LHF read!\n");
             }
             else {
 #ifdef  IPI_DEBUG
@@ -119,7 +120,7 @@ static void pib_read(VCPU *vcpu, uint64_
         }
         else {      // upper half
             if ( s != 1 || ma != 4 ) {
-                panic("Undefined PIB-UHF read!\n");
+                panic_domain(NULL,"Undefined PIB-UHF read!\n");
             }
             else {
 #ifdef  IPI_DEBUG
@@ -140,7 +141,7 @@ static void low_mmio_access(VCPU *vcpu, 
 
     vio = get_vio(v->domain, v->vcpu_id);
     if (vio == 0) {
-        panic("bad shared page: %lx", (unsigned long)vio);
+        panic_domain(NULL,"bad shared page: %lx", (unsigned long)vio);
     }
     p = &vio->vp_ioreq;
     p->addr = pa;
@@ -172,7 +173,7 @@ static void legacy_io_access(VCPU *vcpu,
 
     vio = get_vio(v->domain, v->vcpu_id);
     if (vio == 0) {
-        panic("bad shared page\n");
+        panic_domain(NULL,"bad shared page\n");
     }
     p = &vio->vp_ioreq;
     p->addr = TO_LEGACY_IO(pa&0x3ffffffUL);
@@ -237,7 +238,7 @@ static void mmio_access(VCPU *vcpu, u64 
         legacy_io_access(vcpu, src_pa, dest, s, dir);
         break;
     default:
-        panic("Bad I/O access\n");
+        panic_domain(NULL,"Bad I/O access\n");
         break;
     }
     return;
@@ -285,7 +286,7 @@ memread_v(VCPU *vcpu, thash_data_t *vtlb
     uint64_t pa;
 
     if (!vtlb->nomap)
-        panic("Normal memory write shouldn't go to this point!");
+        panic_domain(NULL,"Normal memory write shouldn't go to this point!");
     pa = PPN_2_PA(vtlb->ppn);
     pa += POFFSET((u64)src, vtlb->ps);
 
@@ -329,14 +330,14 @@ static void deliver_ipi (VCPU *vcpu, uin
         break;
     case 2:     // PMI
         // TODO -- inject guest PMI
-        panic ("Inject guest PMI!\n");
+        panic_domain (NULL, "Inject guest PMI!\n");
         break;
     case 4:     // NMI
         vmx_vcpu_pend_interrupt (vcpu, 2);
         break;
     case 5:     // INIT
         // TODO -- inject guest INIT
-        panic ("Inject guest INIT!\n");
+        panic_domain (NULL, "Inject guest INIT!\n");
         break;
     case 7:     // ExtINT
         vmx_vcpu_pend_interrupt (vcpu, 0);
@@ -345,7 +346,7 @@ static void deliver_ipi (VCPU *vcpu, uin
     case 3:
     case 6:
     default:
-        panic ("Deliver reserved IPI!\n");
+        panic_domain (NULL, "Deliver reserved IPI!\n");
         break;
     }
 }
@@ -379,7 +380,7 @@ static int write_ipi (VCPU *vcpu, uint64
  
     target_cpu = lid_2_vcpu(vcpu->domain, 
                                ((ipi_a_t)addr).id, ((ipi_a_t)addr).eid);
-    if ( target_cpu == NULL ) panic("Unknown IPI cpu\n");
+    if ( target_cpu == NULL ) panic_domain (NULL,"Unknown IPI cpu\n");
     if ( target_cpu == vcpu ) {
        // IPI to self
         deliver_ipi (vcpu, ((ipi_d_t)value).dm, 
@@ -388,7 +389,7 @@ static int write_ipi (VCPU *vcpu, uint64
     }
     else {
        // TODO: send Host IPI to inject guest SMP IPI interruption
-        panic ("No SM-VP supported!\n");
+        panic_domain (NULL, "No SM-VP supported!\n");
         return 0;
     }
 }
@@ -473,15 +474,65 @@ void emulate_io_inst(VCPU *vcpu, u64 pad
 
         }
     }
-    // Floating-point Load/Store
+    // Floating-point spill + Imm update
+    else if(inst.M10.major==7&&inst.M10.x6==0x3B){
+        struct ia64_fpreg v;
+       inst_type=SL_FLOATING;
+       dir=IOREQ_WRITE;
+       vcpu_get_fpreg(vcpu,inst.M10.f2,&v);
+       vcpu_get_gr_nat(vcpu,inst.M10.r3,&temp);
+       post_update = (inst.M10.i<<7)+inst.M10.imm7;
+       if(inst.M10.s)
+            temp -= post_update;
+       else
+            temp += post_update;
+       vcpu_set_gr(vcpu,inst.M10.r3,temp,0);
+
+       /* Write high word.
+          FIXME: this is a kludge!  */
+       v.u.bits[1] &= 0x3ffff;
+       mmio_access(vcpu, padr + 8, &v.u.bits[1], 8, ma, IOREQ_WRITE);
+       data = v.u.bits[0];
+       size = 3;
+    }
+    // Floating-point stf8 + Imm update
+    else if(inst.M10.major==7&&inst.M10.x6==0x31){
+        struct ia64_fpreg v;
+       inst_type=SL_FLOATING;
+       dir=IOREQ_WRITE;
+       size=3;
+       vcpu_get_fpreg(vcpu,inst.M10.f2,&v);
+       data = v.u.bits[0]; /* Significand.  */
+       vcpu_get_gr_nat(vcpu,inst.M10.r3,&temp);
+       post_update = (inst.M10.i<<7)+inst.M10.imm7;
+       if(inst.M10.s)
+            temp -= post_update;
+       else
+            temp += post_update;
+       vcpu_set_gr(vcpu,inst.M10.r3,temp,0);
+    }
 //    else if(inst.M6.major==6&&inst.M6.m==0&&inst.M6.x==0&&inst.M6.x6==3){
 //        inst_type=SL_FLOATING;  //fp
 //        dir=IOREQ_READ;
 //        size=3;     //ldfd
 //    }
+    //  lfetch - do not perform accesses.
+    else if(inst.M15.major==7&&inst.M15.x6>=0x2c&&inst.M15.x6<=0x2f){
+       vcpu_get_gr_nat(vcpu,inst.M15.r3,&temp);
+       post_update = (inst.M15.i<<7)+inst.M15.imm7;
+       if(inst.M15.s)
+            temp -= post_update;
+       else
+            temp += post_update;
+       vcpu_set_gr(vcpu,inst.M15.r3,temp,0);
+
+       vmx_vcpu_increment_iip(vcpu);
+       return;
+    }
     else{
-        printf("This memory access instruction can't be emulated two: %lx\n 
",inst.inst);
-        while(1);
+        panic_domain
+         (NULL,"This memory access instr can't be emulated: %lx pc=%lx\n ",
+          inst.inst, regs->cr_iip);
     }
 
     size = 1 << size;
@@ -499,7 +550,7 @@ void emulate_io_inst(VCPU *vcpu, u64 pad
         if(inst_type==SL_INTEGER){       //gp
             vcpu_set_gr(vcpu,inst.M1.r1,data,0);
         }else{
-            panic("Don't support ldfd now !");
+            panic_domain(NULL, "Don't support ldfd now !");
 /*            switch(inst.M6.f1){
 
             case 6:
diff -r 2de95fd92e74 -r c3972d632ff6 xen/arch/ia64/xen/vcpu.c
--- a/xen/arch/ia64/xen/vcpu.c  Wed Apr 19 10:26:50 2006 -0600
+++ b/xen/arch/ia64/xen/vcpu.c  Wed Apr 19 10:32:36 2006 -0600
@@ -22,6 +22,8 @@
 /* FIXME: where these declarations should be there ? */
 extern void getreg(unsigned long regnum, unsigned long *val, int *nat, struct 
pt_regs *regs);
 extern void setreg(unsigned long regnum, unsigned long val, int nat, struct 
pt_regs *regs);
+extern void getfpreg (unsigned long regnum, struct ia64_fpreg *fpval, struct 
pt_regs *regs);
+
 extern void panic_domain(struct pt_regs *, const char *, ...);
 extern unsigned long translate_domain_pte(UINT64,UINT64,UINT64);
 extern unsigned long translate_domain_mpaddr(unsigned long);
@@ -104,6 +106,15 @@ vcpu_set_gr(VCPU *vcpu, unsigned long re
        setreg(reg,value,nat,regs);     // FIXME: handle NATs later
        return IA64_NO_FAULT;
 }
+
+IA64FAULT
+vcpu_get_fpreg(VCPU *vcpu, unsigned long reg, struct ia64_fpreg *val)
+{
+       REGS *regs = vcpu_regs(vcpu);
+       getfpreg(reg,val,regs); // FIXME: handle NATs later
+       return 0;
+}
+
 #else
 // returns:
 //   IA64_ILLOP_FAULT if the register would cause an Illegal Operation fault
diff -r 2de95fd92e74 -r c3972d632ff6 xen/include/asm-ia64/privop.h
--- a/xen/include/asm-ia64/privop.h     Wed Apr 19 10:26:50 2006 -0600
+++ b/xen/include/asm-ia64/privop.h     Wed Apr 19 10:32:36 2006 -0600
@@ -169,6 +169,21 @@ 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_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;
@@ -187,6 +202,9 @@ typedef union U_INST64 {
     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_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)
diff -r 2de95fd92e74 -r c3972d632ff6 xen/include/asm-ia64/vcpu.h
--- a/xen/include/asm-ia64/vcpu.h       Wed Apr 19 10:26:50 2006 -0600
+++ b/xen/include/asm-ia64/vcpu.h       Wed Apr 19 10:32:36 2006 -0600
@@ -40,6 +40,8 @@ extern UINT64 vcpu_get_gr(VCPU *vcpu, un
 extern UINT64 vcpu_get_gr(VCPU *vcpu, unsigned long reg);
 extern IA64FAULT vcpu_get_gr_nat(VCPU *vcpu, unsigned long reg, UINT64 *val);
 extern IA64FAULT vcpu_set_gr(VCPU *vcpu, unsigned long reg, UINT64 value, int 
nat);
+extern IA64FAULT vcpu_get_fpreg(VCPU *vcpu, unsigned long reg, struct 
ia64_fpreg *val);
+
 /* application registers */
 extern void vcpu_load_kernel_regs(VCPU *vcpu);
 extern IA64FAULT vcpu_set_ar(VCPU *vcpu, UINT64 reg, UINT64 val);

_______________________________________________
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®.