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] [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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [IA64] more mmio insn for VTi, Xen patchbot -unstable <=