ia64/xen-unstable

changeset 9742:c3972d632ff6

[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@bull.net>
author awilliam@xenbuild.aw
date Wed Apr 19 10:32:36 2006 -0600 (2006-04-19)
parents 2de95fd92e74
children dc05c0ce9139
files xen/arch/ia64/Rules.mk xen/arch/ia64/linux-xen/unaligned.c xen/arch/ia64/vmx/mmio.c xen/arch/ia64/xen/vcpu.c xen/include/asm-ia64/privop.h xen/include/asm-ia64/vcpu.h
line diff
     1.1 --- a/xen/arch/ia64/Rules.mk	Wed Apr 19 10:26:50 2006 -0600
     1.2 +++ b/xen/arch/ia64/Rules.mk	Wed Apr 19 10:32:36 2006 -0600
     1.3 @@ -28,7 +28,7 @@ CFLAGS  += -I$(BASEDIR)/include/asm-ia64
     1.4             -I$(BASEDIR)/arch/ia64/linux -I$(BASEDIR)/arch/ia64/linux-xen
     1.5  #CFLAGS  += -Wno-pointer-arith -Wredundant-decls
     1.6  CFLAGS  += -DIA64 -DXEN -DLINUX_2_6 -DV_IOSAPIC_READY
     1.7 -CFLAGS	+= -ffixed-r13 -mfixed-range=f12-f15,f32-f127
     1.8 +CFLAGS	+= -ffixed-r13 -mfixed-range=f2-f5,f12-f127
     1.9  CFLAGS	+= -g
    1.10  #CFLAGS  += -DVTI_DEBUG
    1.11  ifeq ($(VALIDATE_VT),y)
     2.1 --- a/xen/arch/ia64/linux-xen/unaligned.c	Wed Apr 19 10:26:50 2006 -0600
     2.2 +++ b/xen/arch/ia64/linux-xen/unaligned.c	Wed Apr 19 10:32:36 2006 -0600
     2.3 @@ -750,6 +750,154 @@ getfpreg (unsigned long regnum, struct i
     2.4  		}
     2.5  	}
     2.6  }
     2.7 +#else
     2.8 +void
     2.9 +getfpreg (unsigned long regnum, struct ia64_fpreg *fpval, struct pt_regs *regs)
    2.10 +{
    2.11 +#define CASE_FIXED_FP(reg)			\
    2.12 +	case reg:				\
    2.13 +		ia64_stf_spill(fpval,reg);	\
    2.14 +		break
    2.15 +#define CASE_SAVED_FP(reg)					\
    2.16 +	case reg:						\
    2.17 +		fpval->u.bits[0] = regs->f##reg.u.bits[0];	\
    2.18 +		fpval->u.bits[1] = regs->f##reg.u.bits[1];	\
    2.19 +		break
    2.20 +	switch(regnum) {
    2.21 +		CASE_FIXED_FP(0);
    2.22 +		CASE_FIXED_FP(1);
    2.23 +		CASE_FIXED_FP(2);
    2.24 +		CASE_FIXED_FP(3);
    2.25 +		CASE_FIXED_FP(4);
    2.26 +		CASE_FIXED_FP(5);
    2.27 +
    2.28 +		CASE_SAVED_FP(6);
    2.29 +		CASE_SAVED_FP(7);
    2.30 +		CASE_SAVED_FP(8);
    2.31 +		CASE_SAVED_FP(9);
    2.32 +		CASE_SAVED_FP(10);
    2.33 +		CASE_SAVED_FP(11);
    2.34 +
    2.35 +		CASE_FIXED_FP(12);
    2.36 +		CASE_FIXED_FP(13);
    2.37 +		CASE_FIXED_FP(14);
    2.38 +		CASE_FIXED_FP(15);
    2.39 +		CASE_FIXED_FP(16);
    2.40 +		CASE_FIXED_FP(17);
    2.41 +		CASE_FIXED_FP(18);
    2.42 +		CASE_FIXED_FP(19);
    2.43 +		CASE_FIXED_FP(20);
    2.44 +		CASE_FIXED_FP(21);
    2.45 +		CASE_FIXED_FP(22);
    2.46 +		CASE_FIXED_FP(23);
    2.47 +		CASE_FIXED_FP(24);
    2.48 +		CASE_FIXED_FP(25);
    2.49 +		CASE_FIXED_FP(26);
    2.50 +		CASE_FIXED_FP(27);
    2.51 +		CASE_FIXED_FP(28);
    2.52 +		CASE_FIXED_FP(29);
    2.53 +		CASE_FIXED_FP(30);
    2.54 +		CASE_FIXED_FP(31);
    2.55 +		CASE_FIXED_FP(32);
    2.56 +		CASE_FIXED_FP(33);
    2.57 +		CASE_FIXED_FP(34);
    2.58 +		CASE_FIXED_FP(35);
    2.59 +		CASE_FIXED_FP(36);
    2.60 +		CASE_FIXED_FP(37);
    2.61 +		CASE_FIXED_FP(38);
    2.62 +		CASE_FIXED_FP(39);
    2.63 +		CASE_FIXED_FP(40);
    2.64 +		CASE_FIXED_FP(41);
    2.65 +		CASE_FIXED_FP(42);
    2.66 +		CASE_FIXED_FP(43);
    2.67 +		CASE_FIXED_FP(44);
    2.68 +		CASE_FIXED_FP(45);
    2.69 +		CASE_FIXED_FP(46);
    2.70 +		CASE_FIXED_FP(47);
    2.71 +		CASE_FIXED_FP(48);
    2.72 +		CASE_FIXED_FP(49);
    2.73 +		CASE_FIXED_FP(50);
    2.74 +		CASE_FIXED_FP(51);
    2.75 +		CASE_FIXED_FP(52);
    2.76 +		CASE_FIXED_FP(53);
    2.77 +		CASE_FIXED_FP(54);
    2.78 +		CASE_FIXED_FP(55);
    2.79 +		CASE_FIXED_FP(56);
    2.80 +		CASE_FIXED_FP(57);
    2.81 +		CASE_FIXED_FP(58);
    2.82 +		CASE_FIXED_FP(59);
    2.83 +		CASE_FIXED_FP(60);
    2.84 +		CASE_FIXED_FP(61);
    2.85 +		CASE_FIXED_FP(62);
    2.86 +		CASE_FIXED_FP(63);
    2.87 +		CASE_FIXED_FP(64);
    2.88 +		CASE_FIXED_FP(65);
    2.89 +		CASE_FIXED_FP(66);
    2.90 +		CASE_FIXED_FP(67);
    2.91 +		CASE_FIXED_FP(68);
    2.92 +		CASE_FIXED_FP(69);
    2.93 +		CASE_FIXED_FP(70);
    2.94 +		CASE_FIXED_FP(71);
    2.95 +		CASE_FIXED_FP(72);
    2.96 +		CASE_FIXED_FP(73);
    2.97 +		CASE_FIXED_FP(74);
    2.98 +		CASE_FIXED_FP(75);
    2.99 +		CASE_FIXED_FP(76);
   2.100 +		CASE_FIXED_FP(77);
   2.101 +		CASE_FIXED_FP(78);
   2.102 +		CASE_FIXED_FP(79);
   2.103 +		CASE_FIXED_FP(80);
   2.104 +		CASE_FIXED_FP(81);
   2.105 +		CASE_FIXED_FP(82);
   2.106 +		CASE_FIXED_FP(83);
   2.107 +		CASE_FIXED_FP(84);
   2.108 +		CASE_FIXED_FP(85);
   2.109 +		CASE_FIXED_FP(86);
   2.110 +		CASE_FIXED_FP(87);
   2.111 +		CASE_FIXED_FP(88);
   2.112 +		CASE_FIXED_FP(89);
   2.113 +		CASE_FIXED_FP(90);
   2.114 +		CASE_FIXED_FP(91);
   2.115 +		CASE_FIXED_FP(92);
   2.116 +		CASE_FIXED_FP(93);
   2.117 +		CASE_FIXED_FP(94);
   2.118 +		CASE_FIXED_FP(95);
   2.119 +		CASE_FIXED_FP(96);
   2.120 +		CASE_FIXED_FP(97);
   2.121 +		CASE_FIXED_FP(98);
   2.122 +		CASE_FIXED_FP(99);
   2.123 +		CASE_FIXED_FP(100);
   2.124 +		CASE_FIXED_FP(101);
   2.125 +		CASE_FIXED_FP(102);
   2.126 +		CASE_FIXED_FP(103);
   2.127 +		CASE_FIXED_FP(104);
   2.128 +		CASE_FIXED_FP(105);
   2.129 +		CASE_FIXED_FP(106);
   2.130 +		CASE_FIXED_FP(107);
   2.131 +		CASE_FIXED_FP(108);
   2.132 +		CASE_FIXED_FP(109);
   2.133 +		CASE_FIXED_FP(110);
   2.134 +		CASE_FIXED_FP(111);
   2.135 +		CASE_FIXED_FP(112);
   2.136 +		CASE_FIXED_FP(113);
   2.137 +		CASE_FIXED_FP(114);
   2.138 +		CASE_FIXED_FP(115);
   2.139 +		CASE_FIXED_FP(116);
   2.140 +		CASE_FIXED_FP(117);
   2.141 +		CASE_FIXED_FP(118);
   2.142 +		CASE_FIXED_FP(119);
   2.143 +		CASE_FIXED_FP(120);
   2.144 +		CASE_FIXED_FP(121);
   2.145 +		CASE_FIXED_FP(122);
   2.146 +		CASE_FIXED_FP(123);
   2.147 +		CASE_FIXED_FP(124);
   2.148 +		CASE_FIXED_FP(125);
   2.149 +		CASE_FIXED_FP(126);
   2.150 +		CASE_FIXED_FP(127);
   2.151 +	}
   2.152 +#undef CASE_FIXED_FP
   2.153 +#undef CASE_SAVED_FP
   2.154 +}
   2.155  #endif /* XEN */
   2.156  
   2.157  
     3.1 --- a/xen/arch/ia64/vmx/mmio.c	Wed Apr 19 10:26:50 2006 -0600
     3.2 +++ b/xen/arch/ia64/vmx/mmio.c	Wed Apr 19 10:32:36 2006 -0600
     3.3 @@ -57,20 +57,21 @@ static void pib_write(VCPU *vcpu, void *
     3.4  {
     3.5      switch (pib_off) {
     3.6      case PIB_OFST_INTA:
     3.7 -        panic("Undefined write on PIB INTA\n");
     3.8 +        panic_domain(NULL,"Undefined write on PIB INTA\n");
     3.9          break;
    3.10      case PIB_OFST_XTP:
    3.11          if ( s == 1 && ma == 4 /* UC */) {
    3.12              vmx_vcpu_get_plat(vcpu)->xtp = *(uint8_t *)src;
    3.13          }
    3.14          else {
    3.15 -            panic("Undefined write on PIB XTP\n");
    3.16 +            panic_domain(NULL,"Undefined write on PIB XTP\n");
    3.17          }
    3.18          break;
    3.19      default:
    3.20          if ( PIB_LOW_HALF(pib_off) ) {   // lower half
    3.21              if ( s != 8 || ma != 0x4 /* UC */ ) {
    3.22 -                panic("Undefined IPI-LHF write with s %ld, ma %d!\n", s, ma);
    3.23 +                panic_domain
    3.24 +		  (NULL,"Undefined IPI-LHF write with s %ld, ma %d!\n", s, ma);
    3.25              }
    3.26              else {
    3.27                  write_ipi(vcpu, pib_off, *(uint64_t *)src);
    3.28 @@ -79,7 +80,7 @@ static void pib_write(VCPU *vcpu, void *
    3.29          }
    3.30          else {      // upper half
    3.31              printf("IPI-UHF write %lx\n",pib_off);
    3.32 -            panic("Not support yet for SM-VP\n");
    3.33 +            panic_domain(NULL,"Not support yet for SM-VP\n");
    3.34          }
    3.35          break;
    3.36      }
    3.37 @@ -94,7 +95,7 @@ static void pib_read(VCPU *vcpu, uint64_
    3.38              // TODO: INTA read from IOSAPIC
    3.39          }
    3.40          else {
    3.41 -            panic("Undefined read on PIB INTA\n");
    3.42 +            panic_domain(NULL,"Undefined read on PIB INTA\n");
    3.43          }
    3.44          break;
    3.45      case PIB_OFST_XTP:
    3.46 @@ -102,13 +103,13 @@ static void pib_read(VCPU *vcpu, uint64_
    3.47              *((uint8_t*)dest) = vmx_vcpu_get_plat(vcpu)->xtp;
    3.48          }
    3.49          else {
    3.50 -            panic("Undefined read on PIB XTP\n");
    3.51 +            panic_domain(NULL,"Undefined read on PIB XTP\n");
    3.52          }
    3.53          break;
    3.54      default:
    3.55          if ( PIB_LOW_HALF(pib_off) ) {   // lower half
    3.56              if ( s != 8 || ma != 4 ) {
    3.57 -                panic("Undefined IPI-LHF read!\n");
    3.58 +                panic_domain(NULL,"Undefined IPI-LHF read!\n");
    3.59              }
    3.60              else {
    3.61  #ifdef  IPI_DEBUG
    3.62 @@ -119,7 +120,7 @@ static void pib_read(VCPU *vcpu, uint64_
    3.63          }
    3.64          else {      // upper half
    3.65              if ( s != 1 || ma != 4 ) {
    3.66 -                panic("Undefined PIB-UHF read!\n");
    3.67 +                panic_domain(NULL,"Undefined PIB-UHF read!\n");
    3.68              }
    3.69              else {
    3.70  #ifdef  IPI_DEBUG
    3.71 @@ -140,7 +141,7 @@ static void low_mmio_access(VCPU *vcpu, 
    3.72  
    3.73      vio = get_vio(v->domain, v->vcpu_id);
    3.74      if (vio == 0) {
    3.75 -        panic("bad shared page: %lx", (unsigned long)vio);
    3.76 +        panic_domain(NULL,"bad shared page: %lx", (unsigned long)vio);
    3.77      }
    3.78      p = &vio->vp_ioreq;
    3.79      p->addr = pa;
    3.80 @@ -172,7 +173,7 @@ static void legacy_io_access(VCPU *vcpu,
    3.81  
    3.82      vio = get_vio(v->domain, v->vcpu_id);
    3.83      if (vio == 0) {
    3.84 -        panic("bad shared page\n");
    3.85 +        panic_domain(NULL,"bad shared page\n");
    3.86      }
    3.87      p = &vio->vp_ioreq;
    3.88      p->addr = TO_LEGACY_IO(pa&0x3ffffffUL);
    3.89 @@ -237,7 +238,7 @@ static void mmio_access(VCPU *vcpu, u64 
    3.90          legacy_io_access(vcpu, src_pa, dest, s, dir);
    3.91          break;
    3.92      default:
    3.93 -        panic("Bad I/O access\n");
    3.94 +        panic_domain(NULL,"Bad I/O access\n");
    3.95          break;
    3.96      }
    3.97      return;
    3.98 @@ -285,7 +286,7 @@ memread_v(VCPU *vcpu, thash_data_t *vtlb
    3.99      uint64_t pa;
   3.100  
   3.101      if (!vtlb->nomap)
   3.102 -        panic("Normal memory write shouldn't go to this point!");
   3.103 +        panic_domain(NULL,"Normal memory write shouldn't go to this point!");
   3.104      pa = PPN_2_PA(vtlb->ppn);
   3.105      pa += POFFSET((u64)src, vtlb->ps);
   3.106  
   3.107 @@ -329,14 +330,14 @@ static void deliver_ipi (VCPU *vcpu, uin
   3.108          break;
   3.109      case 2:     // PMI
   3.110          // TODO -- inject guest PMI
   3.111 -        panic ("Inject guest PMI!\n");
   3.112 +        panic_domain (NULL, "Inject guest PMI!\n");
   3.113          break;
   3.114      case 4:     // NMI
   3.115          vmx_vcpu_pend_interrupt (vcpu, 2);
   3.116          break;
   3.117      case 5:     // INIT
   3.118          // TODO -- inject guest INIT
   3.119 -        panic ("Inject guest INIT!\n");
   3.120 +        panic_domain (NULL, "Inject guest INIT!\n");
   3.121          break;
   3.122      case 7:     // ExtINT
   3.123          vmx_vcpu_pend_interrupt (vcpu, 0);
   3.124 @@ -345,7 +346,7 @@ static void deliver_ipi (VCPU *vcpu, uin
   3.125      case 3:
   3.126      case 6:
   3.127      default:
   3.128 -        panic ("Deliver reserved IPI!\n");
   3.129 +        panic_domain (NULL, "Deliver reserved IPI!\n");
   3.130          break;
   3.131      }
   3.132  }
   3.133 @@ -379,7 +380,7 @@ static int write_ipi (VCPU *vcpu, uint64
   3.134   
   3.135      target_cpu = lid_2_vcpu(vcpu->domain, 
   3.136      				((ipi_a_t)addr).id, ((ipi_a_t)addr).eid);
   3.137 -    if ( target_cpu == NULL ) panic("Unknown IPI cpu\n");
   3.138 +    if ( target_cpu == NULL ) panic_domain (NULL,"Unknown IPI cpu\n");
   3.139      if ( target_cpu == vcpu ) {
   3.140      	// IPI to self
   3.141          deliver_ipi (vcpu, ((ipi_d_t)value).dm, 
   3.142 @@ -388,7 +389,7 @@ static int write_ipi (VCPU *vcpu, uint64
   3.143      }
   3.144      else {
   3.145      	// TODO: send Host IPI to inject guest SMP IPI interruption
   3.146 -        panic ("No SM-VP supported!\n");
   3.147 +        panic_domain (NULL, "No SM-VP supported!\n");
   3.148          return 0;
   3.149      }
   3.150  }
   3.151 @@ -473,15 +474,65 @@ void emulate_io_inst(VCPU *vcpu, u64 pad
   3.152  
   3.153          }
   3.154      }
   3.155 -    // Floating-point Load/Store
   3.156 +    // Floating-point spill + Imm update
   3.157 +    else if(inst.M10.major==7&&inst.M10.x6==0x3B){
   3.158 +        struct ia64_fpreg v;
   3.159 +	inst_type=SL_FLOATING;
   3.160 +	dir=IOREQ_WRITE;
   3.161 +	vcpu_get_fpreg(vcpu,inst.M10.f2,&v);
   3.162 +	vcpu_get_gr_nat(vcpu,inst.M10.r3,&temp);
   3.163 +	post_update = (inst.M10.i<<7)+inst.M10.imm7;
   3.164 +	if(inst.M10.s)
   3.165 +            temp -= post_update;
   3.166 +	else
   3.167 +            temp += post_update;
   3.168 +	vcpu_set_gr(vcpu,inst.M10.r3,temp,0);
   3.169 +
   3.170 +	/* Write high word.
   3.171 +	   FIXME: this is a kludge!  */
   3.172 +	v.u.bits[1] &= 0x3ffff;
   3.173 +	mmio_access(vcpu, padr + 8, &v.u.bits[1], 8, ma, IOREQ_WRITE);
   3.174 +	data = v.u.bits[0];
   3.175 +	size = 3;
   3.176 +    }
   3.177 +    // Floating-point stf8 + Imm update
   3.178 +    else if(inst.M10.major==7&&inst.M10.x6==0x31){
   3.179 +        struct ia64_fpreg v;
   3.180 +	inst_type=SL_FLOATING;
   3.181 +	dir=IOREQ_WRITE;
   3.182 +	size=3;
   3.183 +	vcpu_get_fpreg(vcpu,inst.M10.f2,&v);
   3.184 +	data = v.u.bits[0]; /* Significand.  */
   3.185 +	vcpu_get_gr_nat(vcpu,inst.M10.r3,&temp);
   3.186 +	post_update = (inst.M10.i<<7)+inst.M10.imm7;
   3.187 +	if(inst.M10.s)
   3.188 +            temp -= post_update;
   3.189 +	else
   3.190 +            temp += post_update;
   3.191 +	vcpu_set_gr(vcpu,inst.M10.r3,temp,0);
   3.192 +    }
   3.193  //    else if(inst.M6.major==6&&inst.M6.m==0&&inst.M6.x==0&&inst.M6.x6==3){
   3.194  //        inst_type=SL_FLOATING;  //fp
   3.195  //        dir=IOREQ_READ;
   3.196  //        size=3;     //ldfd
   3.197  //    }
   3.198 +    //  lfetch - do not perform accesses.
   3.199 +    else if(inst.M15.major==7&&inst.M15.x6>=0x2c&&inst.M15.x6<=0x2f){
   3.200 +	vcpu_get_gr_nat(vcpu,inst.M15.r3,&temp);
   3.201 +	post_update = (inst.M15.i<<7)+inst.M15.imm7;
   3.202 +	if(inst.M15.s)
   3.203 +            temp -= post_update;
   3.204 +	else
   3.205 +            temp += post_update;
   3.206 +	vcpu_set_gr(vcpu,inst.M15.r3,temp,0);
   3.207 +
   3.208 +	vmx_vcpu_increment_iip(vcpu);
   3.209 +	return;
   3.210 +    }
   3.211      else{
   3.212 -        printf("This memory access instruction can't be emulated two: %lx\n ",inst.inst);
   3.213 -        while(1);
   3.214 +        panic_domain
   3.215 +	  (NULL,"This memory access instr can't be emulated: %lx pc=%lx\n ",
   3.216 +	   inst.inst, regs->cr_iip);
   3.217      }
   3.218  
   3.219      size = 1 << size;
   3.220 @@ -499,7 +550,7 @@ void emulate_io_inst(VCPU *vcpu, u64 pad
   3.221          if(inst_type==SL_INTEGER){       //gp
   3.222              vcpu_set_gr(vcpu,inst.M1.r1,data,0);
   3.223          }else{
   3.224 -            panic("Don't support ldfd now !");
   3.225 +            panic_domain(NULL, "Don't support ldfd now !");
   3.226  /*            switch(inst.M6.f1){
   3.227  
   3.228              case 6:
     4.1 --- a/xen/arch/ia64/xen/vcpu.c	Wed Apr 19 10:26:50 2006 -0600
     4.2 +++ b/xen/arch/ia64/xen/vcpu.c	Wed Apr 19 10:32:36 2006 -0600
     4.3 @@ -22,6 +22,8 @@
     4.4  /* FIXME: where these declarations should be there ? */
     4.5  extern void getreg(unsigned long regnum, unsigned long *val, int *nat, struct pt_regs *regs);
     4.6  extern void setreg(unsigned long regnum, unsigned long val, int nat, struct pt_regs *regs);
     4.7 +extern void getfpreg (unsigned long regnum, struct ia64_fpreg *fpval, struct pt_regs *regs);
     4.8 +
     4.9  extern void panic_domain(struct pt_regs *, const char *, ...);
    4.10  extern unsigned long translate_domain_pte(UINT64,UINT64,UINT64);
    4.11  extern unsigned long translate_domain_mpaddr(unsigned long);
    4.12 @@ -104,6 +106,15 @@ vcpu_set_gr(VCPU *vcpu, unsigned long re
    4.13  	setreg(reg,value,nat,regs);	// FIXME: handle NATs later
    4.14  	return IA64_NO_FAULT;
    4.15  }
    4.16 +
    4.17 +IA64FAULT
    4.18 +vcpu_get_fpreg(VCPU *vcpu, unsigned long reg, struct ia64_fpreg *val)
    4.19 +{
    4.20 +	REGS *regs = vcpu_regs(vcpu);
    4.21 +	getfpreg(reg,val,regs);	// FIXME: handle NATs later
    4.22 +	return 0;
    4.23 +}
    4.24 +
    4.25  #else
    4.26  // returns:
    4.27  //   IA64_ILLOP_FAULT if the register would cause an Illegal Operation fault
     5.1 --- a/xen/include/asm-ia64/privop.h	Wed Apr 19 10:26:50 2006 -0600
     5.2 +++ b/xen/include/asm-ia64/privop.h	Wed Apr 19 10:32:36 2006 -0600
     5.3 @@ -170,6 +170,21 @@ typedef union U_INST64_M6 {
     5.4      struct { unsigned long qp:6, f1:7, un7:7, r3:7, x:1, hint:2, x6:6, m:1, major:4; };
     5.5  } INST64_M6;
     5.6  
     5.7 +typedef union U_INST64_M9 {
     5.8 +    IA64_INST inst;
     5.9 +    struct { unsigned long qp:6, :7, f2:7, r3:7, x:1, hint:2, x6:6, m:1, major:4; };
    5.10 +} INST64_M9;
    5.11 +
    5.12 +typedef union U_INST64_M10 {
    5.13 +    IA64_INST inst;
    5.14 +    struct { unsigned long qp:6, imm7:7, f2:7, r3:7, i:1, hint:2, x6:6, s:1, major:4; };
    5.15 +} INST64_M10;
    5.16 +
    5.17 +typedef union U_INST64_M15 {
    5.18 +    IA64_INST inst;
    5.19 +    struct { unsigned long qp:6, :7, imm7:7, r3:7, i:1, hint:2, x6:6, s:1, major:4; };
    5.20 +} INST64_M15;
    5.21 +
    5.22  typedef union U_INST64 {
    5.23      IA64_INST inst;
    5.24      struct { unsigned long :37, major:4; } generic;
    5.25 @@ -187,6 +202,9 @@ typedef union U_INST64 {
    5.26      INST64_M4  M4;	// st integer
    5.27      INST64_M5  M5;
    5.28      INST64_M6  M6;	// ldfd floating pointer
    5.29 +    INST64_M9  M9;	// stfd floating pointer
    5.30 +    INST64_M10 M10;	// stfd floating pointer
    5.31 +    INST64_M15 M15;	// lfetch + imm update
    5.32      INST64_M28 M28;	// purge translation cache entry
    5.33      INST64_M29 M29;	// mov register to ar (M unit)
    5.34      INST64_M30 M30;	// mov immediate to ar (M unit)
     6.1 --- a/xen/include/asm-ia64/vcpu.h	Wed Apr 19 10:26:50 2006 -0600
     6.2 +++ b/xen/include/asm-ia64/vcpu.h	Wed Apr 19 10:32:36 2006 -0600
     6.3 @@ -40,6 +40,8 @@ struct privop_addr_count {
     6.4  extern UINT64 vcpu_get_gr(VCPU *vcpu, unsigned long reg);
     6.5  extern IA64FAULT vcpu_get_gr_nat(VCPU *vcpu, unsigned long reg, UINT64 *val);
     6.6  extern IA64FAULT vcpu_set_gr(VCPU *vcpu, unsigned long reg, UINT64 value, int nat);
     6.7 +extern IA64FAULT vcpu_get_fpreg(VCPU *vcpu, unsigned long reg, struct ia64_fpreg *val);
     6.8 +
     6.9  /* application registers */
    6.10  extern void vcpu_load_kernel_regs(VCPU *vcpu);
    6.11  extern IA64FAULT vcpu_set_ar(VCPU *vcpu, UINT64 reg, UINT64 val);