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

[Xen-changelog] Final set of HV change to support multiple domains on VTI.



# HG changeset patch
# User fred@xxxxxxxxxxxxxxxxxxxxx
# Node ID 7e74ac6fdea913097d1eb3456d9089e3312de002
# Parent  b6803bdaa95ae98b0a5be63b28788f78b2b32072
Final set of HV change to support multiple domains on VTI.

Signed-off-by Anthony Xu <anthony.xu@xxxxxxxxx>
Signed-off-by Eddie Dong <eddie.dong@xxxxxxxxx>
Signed-off-by Fred Yang <fred.yang@xxxxxxxxx>
Signed-off-by Kevin Tian <kevin.tian@xxxxxxxxx>

diff -r b6803bdaa95a -r 7e74ac6fdea9 xen/arch/ia64/domain.c
--- a/xen/arch/ia64/domain.c    Tue Aug  2 10:09:24 2005
+++ b/xen/arch/ia64/domain.c    Tue Aug  2 10:11:41 2005
@@ -348,6 +348,7 @@
     struct domain *d = v->domain;
     int i, rc, ret;
     unsigned long progress = 0;
+    shared_iopage_t *sp;
 
     if ( test_bit(_VCPUF_initialised, &v->vcpu_flags) )
         return 0;
@@ -373,8 +374,17 @@
     /* FIXME: only support PMT table continuously by far */
     d->arch.pmt = __va(c->pt_base);
     d->arch.max_pfn = c->pt_max_pfn;
-    v->arch.arch_vmx.vmx_platform.shared_page_va = __va(c->share_io_pg);
-    memset((char *)__va(c->share_io_pg),0,PAGE_SIZE);
+    d->arch.vmx_platform.shared_page_va = __va(c->share_io_pg);
+    sp = get_sp(d);
+    memset((char *)sp,0,PAGE_SIZE);
+    /* FIXME: temp due to old CP */
+    sp->sp_global.eport = 2;
+#ifdef V_IOSAPIC_READY
+    sp->vcpu_number = 1;
+#endif
+    /* TEMP */
+    d->arch.vmx_platform.pib_base = 0xfee00000UL;
+    
 
     if (c->flags & VGCF_VMX_GUEST) {
        if (!vmx_enabled)
@@ -393,7 +403,7 @@
     if (v == d->vcpu[0]) {
        memset(&d->shared_info->evtchn_mask[0], 0xff,
                sizeof(d->shared_info->evtchn_mask));
-       clear_bit(IOPACKET_PORT, &d->shared_info->evtchn_mask[0]);
+       clear_bit(iopacket_port(d), &d->shared_info->evtchn_mask[0]);
     }
     /* Setup domain context. Actually IA-64 is a bit different with
      * x86, with almost all system resources better managed by HV
diff -r b6803bdaa95a -r 7e74ac6fdea9 xen/arch/ia64/mmio.c
--- a/xen/arch/ia64/mmio.c      Tue Aug  2 10:09:24 2005
+++ b/xen/arch/ia64/mmio.c      Tue Aug  2 10:11:41 2005
@@ -66,7 +66,7 @@
     default:
         if ( PIB_LOW_HALF(pib_off) ) {   // lower half
             if ( s != 8 || ma != 0x4 /* UC */ ) {
-                panic("Undefined IPI-LHF write!\n");
+                panic("Undefined IPI-LHF write with s %d, ma %d!\n", s, ma);
             }
             else {
                 write_ipi(vcpu, pib_off, *(uint64_t *)src);
@@ -135,13 +135,13 @@
     ioreq_t *p;
     unsigned long addr;
 
-    vio = (vcpu_iodata_t *) v->arch.arch_vmx.vmx_platform.shared_page_va;
+    vio = get_vio(v->domain, v->vcpu_id);
     if (vio == 0) {
         panic("bad shared page: %lx", (unsigned long)vio);
     }
     p = &vio->vp_ioreq;
     p->addr = pa;
-    p->size = 1<<s;
+    p->size = s;
     p->count = 1;
     p->dir = dir;
     if(dir==IOREQ_WRITE)     //write;
@@ -152,9 +152,9 @@
 
     set_bit(ARCH_VMX_IO_WAIT, &v->arch.arch_vmx.flags);
     p->state = STATE_IOREQ_READY;
-    evtchn_send(IOPACKET_PORT);
+    evtchn_send(iopacket_port(v->domain));
     vmx_wait_io();
-    if(dir){ //read
+    if(dir==IOREQ_READ){ //read
         *val=p->u.data;
     }
     return;
@@ -168,13 +168,13 @@
     ioreq_t *p;
     unsigned long addr;
 
-    vio = (vcpu_iodata_t *) v->arch.arch_vmx.vmx_platform.shared_page_va;
+    vio = get_vio(v->domain, v->vcpu_id);
     if (vio == 0) {
         panic("bad shared page: %lx");
     }
     p = &vio->vp_ioreq;
     p->addr = TO_LEGACY_IO(pa&0x3ffffffUL);
-    p->size = 1<<s;
+    p->size = s;
     p->count = 1;
     p->dir = dir;
     if(dir==IOREQ_WRITE)     //write;
@@ -185,11 +185,20 @@
 
     set_bit(ARCH_VMX_IO_WAIT, &v->arch.arch_vmx.flags);
     p->state = STATE_IOREQ_READY;
-    evtchn_send(IOPACKET_PORT);
+    evtchn_send(iopacket_port(v->domain));
+
     vmx_wait_io();
-    if(dir){ //read
+    if(dir==IOREQ_READ){ //read
         *val=p->u.data;
     }
+#ifdef DEBUG_PCI
+    if(dir==IOREQ_WRITE)
+        if(p->addr == 0xcf8UL)
+            printk("Write 0xcf8, with val [0x%lx]\n", p->u.data);
+    else
+        if(p->addr == 0xcfcUL)
+            printk("Read 0xcfc, with val [0x%lx]\n", p->u.data);
+#endif //DEBUG_PCI
     return;
 }
 
@@ -204,12 +213,13 @@
     switch (iot) {
     case GPFN_PIB:
         if(!dir)
-            pib_write(vcpu, src_pa - v_plat->pib_base, dest, s, ma);
+            pib_write(vcpu, dest, src_pa - v_plat->pib_base, s, ma);
         else
             pib_read(vcpu, src_pa - v_plat->pib_base, dest, s, ma);
         break;
     case GPFN_GFW:
         break;
+    case GPFN_IOSAPIC:
     case GPFN_FRAME_BUFFER:
     case GPFN_LOW_MMIO:
         low_mmio_access(vcpu, src_pa, dest, s, dir);
@@ -217,7 +227,6 @@
     case GPFN_LEGACY_IO:
         legacy_io_access(vcpu, src_pa, dest, s, dir);
         break;
-    case GPFN_IOSAPIC:
     default:
         panic("Bad I/O access\n");
         break;
@@ -342,6 +351,8 @@
        LID       lid;
        for (i=0; i<MAX_VIRT_CPUS; i++) {
                vcpu = d->vcpu[i];
+               if (!vcpu)
+                       continue;
                lid.val = VPD_CR(vcpu, lid);
                if ( lid.id == id && lid.eid == eid ) {
                    return vcpu;
@@ -379,15 +390,16 @@
     inst_type 0:integer 1:floating point
  */
 extern IA64_BUNDLE __vmx_get_domain_bundle(u64 iip);
-
+#define SL_INTEGER  0        // store/load interger
+#define SL_FLOATING    1       // store/load floating
 
 void emulate_io_inst(VCPU *vcpu, u64 padr, u64 ma)
 {
     REGS *regs;
     IA64_BUNDLE bundle;
-    int slot, dir, inst_type=0;
+    int slot, dir, inst_type;
     size_t size;
-    u64 data, value, slot1a, slot1b;
+    u64 data, value,post_update, slot1a, slot1b, temp;
     INST64 inst;
     regs=vcpu_regs(vcpu);
     bundle = __vmx_get_domain_bundle(regs->cr_iip);
@@ -400,28 +412,70 @@
     }
     else if (slot == 2) inst.inst = bundle.slot2;
 
+
+    // Integer Load/Store
     if(inst.M1.major==4&&inst.M1.m==0&&inst.M1.x==0){
-        inst_type=0;  //fp
+        inst_type = SL_INTEGER;  //
         size=(inst.M1.x6&0x3);
         if((inst.M1.x6>>2)>0xb){      // write
+            dir=IOREQ_WRITE;     //write
             vmx_vcpu_get_gr(vcpu,inst.M4.r2,&data);
+        }else if((inst.M1.x6>>2)<0xb){   //  read
+            dir=IOREQ_READ;
+            vmx_vcpu_get_gr(vcpu,inst.M1.r1,&value);
+        }
+    }
+    // Integer Load + Reg update
+    else if(inst.M2.major==4&&inst.M2.m==1&&inst.M2.x==0){
+        inst_type = SL_INTEGER;
+        dir = IOREQ_READ;     //write
+        size = (inst.M2.x6&0x3);
+        vmx_vcpu_get_gr(vcpu,inst.M2.r1,&value);
+        vmx_vcpu_get_gr(vcpu,inst.M2.r3,&temp);
+        vmx_vcpu_get_gr(vcpu,inst.M2.r2,&post_update);
+        temp += post_update;
+        vmx_vcpu_set_gr(vcpu,inst.M2.r3,temp,0);
+    }
+    // Integer Load/Store + Imm update
+    else if(inst.M3.major==5){
+        inst_type = SL_INTEGER;  //
+        size=(inst.M3.x6&0x3);
+        if((inst.M5.x6>>2)>0xb){      // write
             dir=IOREQ_WRITE;     //write
-        }else if((inst.M1.x6>>2)<0xb){   //  read
-            vmx_vcpu_get_gr(vcpu,inst.M1.r1,&value);
+            vmx_vcpu_get_gr(vcpu,inst.M5.r2,&data);
+            vmx_vcpu_get_gr(vcpu,inst.M5.r3,&temp);
+            post_update = (inst.M5.i<<7)+inst.M5.imm7;
+            if(inst.M5.s)
+                temp -= post_update;
+            else
+                temp += post_update;
+            vmx_vcpu_set_gr(vcpu,inst.M5.r3,temp,0);
+
+        }else if((inst.M3.x6>>2)<0xb){   //  read
             dir=IOREQ_READ;
-        }else{
-            printf("This memory access instruction can't be emulated one : 
%lx\n",inst.inst);
-            while(1);
-        }
-    }else if(inst.M6.major==6&&inst.M6.m==0&&inst.M6.x==0&&inst.M6.x6==3){
-        inst_type=1;  //fp
-        dir=IOREQ_READ;
-        size=3;     //ldfd
-    }else{
+            vmx_vcpu_get_gr(vcpu,inst.M3.r1,&value);
+            vmx_vcpu_get_gr(vcpu,inst.M3.r3,&temp);
+            post_update = (inst.M3.i<<7)+inst.M3.imm7;
+            if(inst.M3.s)
+                temp -= post_update;
+            else
+                temp += post_update;
+            vmx_vcpu_set_gr(vcpu,inst.M3.r3,temp,0);
+
+        }
+    }
+    // Floating-point Load/Store
+//    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
+//    }
+    else{
         printf("This memory access instruction can't be emulated two: %lx\n 
",inst.inst);
         while(1);
     }
 
+    size = 1 << size;
     if(dir==IOREQ_WRITE){
         mmio_access(vcpu, padr, &data, size, ma, dir);
     }else{
@@ -433,7 +487,7 @@
         else if(size==2)
             data = (value & 0xffffffff00000000U) | (data & 0xffffffffU);
 
-        if(inst_type==0){       //gp
+        if(inst_type==SL_INTEGER){       //gp
             vmx_vcpu_set_gr(vcpu,inst.M1.r1,data,0);
         }else{
             panic("Don't support ldfd now !");
diff -r b6803bdaa95a -r 7e74ac6fdea9 xen/arch/ia64/vlsapic.c
--- a/xen/arch/ia64/vlsapic.c   Tue Aug  2 10:09:24 2005
+++ b/xen/arch/ia64/vlsapic.c   Tue Aug  2 10:11:41 2005
@@ -38,6 +38,14 @@
 #include <asm/vmx_pal_vsa.h>
 #include <asm/kregs.h>
 
+#define  SHARED_VLAPIC_INF
+#ifdef V_IOSAPIC_READY
+static inline vl_apic_info* get_psapic(VCPU *vcpu)
+{
+    shared_iopage_t  *sp = get_sp(vcpu->domain);
+    return &(sp->vcpu_iodata[vcpu->vcpu_id].apic_intr);
+}
+#endif
 //u64  fire_itc;
 //u64  fire_itc2;
 //u64  fire_itm;
@@ -216,7 +224,8 @@
  */
 void vtm_domain_out(VCPU *vcpu)
 {
-    rem_ac_timer(&vcpu->arch.arch_vmx.vtm.vtm_timer);
+    if(!is_idle_task(vcpu->domain))
+       rem_ac_timer(&vcpu->arch.arch_vmx.vtm.vtm_timer);
 }
 
 /*
@@ -226,9 +235,11 @@
 void vtm_domain_in(VCPU *vcpu)
 {
     vtime_t     *vtm;
-    
-    vtm=&(vcpu->arch.arch_vmx.vtm);
-    vtm_interruption_update(vcpu, vtm);
+
+    if(!is_idle_task(vcpu->domain)) {
+       vtm=&(vcpu->arch.arch_vmx.vtm);
+       vtm_interruption_update(vcpu, vtm);
+    }
 }
 
 /*
@@ -262,10 +273,50 @@
     }
 }
 
+#ifdef V_IOSAPIC_READY
+void vlapic_update_shared_info(VCPU *vcpu)
+{
+    //int      i;
+    
+    vl_apic_info *ps;
+
+    if (vcpu->domain == dom0)
+       return;
+
+    ps = get_psapic(vcpu);
+    ps->vl_lapic_id = ((VPD_CR(vcpu, lid) >> 16) & 0xffff) << 16; 
+    printf("vl_lapic_id = %x\n", ps->vl_lapic_id);
+    ps->vl_apr = 0;
+    // skip ps->vl_logical_dest && ps->vl_dest_format
+    // IPF support physical destination mode only
+    ps->vl_arb_id = 0;
+    /*
+    for ( i=0; i<4; i++ ) {
+       ps->tmr[i] = 0;         // edge trigger 
+    }
+    */
+}
+
+void vlapic_update_ext_irq(VCPU *vcpu)
+{
+    int  vec;
+    
+    vl_apic_info *ps = get_psapic(vcpu);
+    while ( (vec = highest_bits(ps->irr)) != NULL_VECTOR ) {
+       clear_bit (vec, ps->irr);
+        vmx_vcpu_pend_interrupt(vcpu, vec);
+    }
+}
+#endif
+
 void vlsapic_reset(VCPU *vcpu)
 {
     int     i;
-    VPD_CR(vcpu, lid) = 0;
+#ifdef V_IOSAPIC_READY
+    vl_apic_info  *psapic;     // shared lapic inf.
+#endif
+    
+    VPD_CR(vcpu, lid) = ia64_getreg(_IA64_REG_CR_LID);
     VPD_CR(vcpu, ivr) = 0;
     VPD_CR(vcpu,tpr) = 0x10000;
     VPD_CR(vcpu, eoi) = 0;
@@ -281,6 +332,10 @@
     for ( i=0; i<4; i++) {
         VLSAPIC_INSVC(vcpu,i) = 0;
     }
+#ifdef V_IOSAPIC_READY
+    vlapic_update_shared_info(vcpu);
+    //vlapic_update_shared_irr(vcpu);
+#endif
     DPRINTK("VLSAPIC inservice base=%lp\n", &VLSAPIC_INSVC(vcpu,0) );
 }
 
@@ -414,6 +469,7 @@
     }
     local_irq_save(spsr);
     VPD_CR(vcpu,irr[vector>>6]) |= 1UL<<(vector&63);
+    //vlapic_update_shared_irr(vcpu);
     local_irq_restore(spsr);
     vcpu->arch.irq_new_pending = 1;
 }
@@ -432,6 +488,7 @@
     for (i=0 ; i<4; i++ ) {
         VPD_CR(vcpu,irr[i]) |= pend_irr[i];
     }
+    //vlapic_update_shared_irr(vcpu);
     local_irq_restore(spsr);
     vcpu->arch.irq_new_pending = 1;
 }
@@ -518,6 +575,7 @@
     VLSAPIC_INSVC(vcpu,vec>>6) |= (1UL <<(vec&63));
     VPD_CR(vcpu, irr[vec>>6]) &= ~(1UL <<(vec&63));
     update_vhpi(vcpu, NULL_VECTOR);     // clear VHPI till EOI or IRR write
+    //vlapic_update_shared_irr(vcpu);
     local_irq_restore(spsr);
     return (uint64_t)vec;
 }
diff -r b6803bdaa95a -r 7e74ac6fdea9 xen/arch/ia64/vmx_ivt.S
--- a/xen/arch/ia64/vmx_ivt.S   Tue Aug  2 10:09:24 2005
+++ b/xen/arch/ia64/vmx_ivt.S   Tue Aug  2 10:11:41 2005
@@ -560,6 +560,21 @@
        VMX_DBG_FAULT(19)
        VMX_FAULT(19)
 
+    .org vmx_ia64_ivt+0x5000
+/////////////////////////////////////////////////////////////////////////////////////////
+// 0x5000 Entry 20 (size 16 bundles) Page Not Present
+ENTRY(vmx_page_not_present)
+       VMX_REFLECT(20)
+END(vmx_page_not_present)
+
+    .org vmx_ia64_ivt+0x5100
+/////////////////////////////////////////////////////////////////////////////////////////
+// 0x5100 Entry 21 (size 16 bundles) Key Permission vector
+ENTRY(vmx_key_permission)
+       VMX_REFLECT(21)
+END(vmx_key_permission)
+
+    .org vmx_ia64_ivt+0x5200
 
/////////////////////////////////////////////////////////////////////////////////////////
 // 0x5200 Entry 22 (size 16 bundles) Instruction Access Rights (26)
 ENTRY(vmx_iaccess_rights)
diff -r b6803bdaa95a -r 7e74ac6fdea9 xen/arch/ia64/vmx_support.c
--- a/xen/arch/ia64/vmx_support.c       Tue Aug  2 10:09:24 2005
+++ b/xen/arch/ia64/vmx_support.c       Tue Aug  2 10:11:41 2005
@@ -37,18 +37,19 @@
     struct vcpu *v = current;
     struct domain *d = v->domain;
     extern void do_block();
+    int port = iopacket_port(d);
 
     do {
-       if (!test_bit(IOPACKET_PORT,
+       if (!test_bit(port,
                &d->shared_info->evtchn_pending[0]))
            do_block();
 
        /* Unblocked when some event is coming. Clear pending indication
         * immediately if deciding to go for io assist
          */
-       if (test_and_clear_bit(IOPACKET_PORT,
+       if (test_and_clear_bit(port,
                &d->shared_info->evtchn_pending[0])) {
-           clear_bit(IOPACKET_PORT>>5, &v->vcpu_info->evtchn_pending_sel);
+           clear_bit(port>>5, &v->vcpu_info->evtchn_pending_sel);
            clear_bit(0, &v->vcpu_info->evtchn_upcall_pending);
            vmx_io_assist(v);
        }
@@ -66,7 +67,7 @@
             * nothing losed. Next loop will check I/O channel to fix this
             * window.
             */
-           clear_bit(IOPACKET_PORT>>5, &v->vcpu_info->evtchn_pending_sel);
+           clear_bit(port>>5, &v->vcpu_info->evtchn_pending_sel);
        }
        else
            break;
@@ -88,7 +89,7 @@
      * This shared page contains I/O request between emulation code
      * and device model.
      */
-    vio = (vcpu_iodata_t *)v->arch.arch_vmx.vmx_platform.shared_page_va;
+    vio = get_vio(v->domain, v->vcpu_id);
     if (!vio)
        panic("Corruption: bad shared page: %lx\n", (unsigned long)vio);
 
@@ -127,6 +128,7 @@
     struct domain *d = v->domain;
     extern void vmx_vcpu_pend_batch_interrupt(VCPU *vcpu,
                                        unsigned long *pend_irr);
+    int port = iopacket_port(d);
 
     /* I/O emulation is atomic, so it's impossible to see execution flow
      * out of vmx_wait_io, when guest is still waiting for response.
@@ -135,10 +137,10 @@
        panic("!!!Bad resume to guest before I/O emulation is done.\n");
 
     /* Clear indicator specific to interrupt delivered from DM */
-    if (test_and_clear_bit(IOPACKET_PORT,
+    if (test_and_clear_bit(port,
                &d->shared_info->evtchn_pending[0])) {
-       if (!d->shared_info->evtchn_pending[IOPACKET_PORT >> 5])
-           clear_bit(IOPACKET_PORT>>5, &v->vcpu_info->evtchn_pending_sel);
+       if (!d->shared_info->evtchn_pending[port >> 5])
+           clear_bit(port>>5, &v->vcpu_info->evtchn_pending_sel);
 
        if (!v->vcpu_info->evtchn_pending_sel)
            clear_bit(0, &v->vcpu_info->evtchn_upcall_pending);
@@ -149,11 +151,14 @@
      * shares same event channel as I/O emulation, with corresponding
      * indicator possibly cleared when vmx_wait_io().
      */
-    vio = (vcpu_iodata_t *)v->arch.arch_vmx.vmx_platform.shared_page_va;
+    vio = get_vio(v->domain, v->vcpu_id);
     if (!vio)
        panic("Corruption: bad shared page: %lx\n", (unsigned long)vio);
 
-    vmx_vcpu_pend_batch_interrupt(v, &vio->vp_intr[0]); 
-    memset(&vio->vp_intr[0], 0, sizeof(vio->vp_intr));
+#ifdef V_IOSAPIC_READY
+    vlapic_update_ext_irq(v);
+#else
+    panic("IOSAPIC model is missed in qemu\n");
+#endif
     return;
 }
diff -r b6803bdaa95a -r 7e74ac6fdea9 xen/arch/ia64/vmx_vcpu.c
--- a/xen/arch/ia64/vmx_vcpu.c  Tue Aug  2 10:09:24 2005
+++ b/xen/arch/ia64/vmx_vcpu.c  Tue Aug  2 10:11:41 2005
@@ -23,7 +23,7 @@
  *  Xuefei Xu (Anthony Xu) (Anthony.xu@xxxxxxxxx)
  */
 
-#include <linux/sched.h>
+#include <xen/sched.h>
 #include <public/arch-ia64.h>
 #include <asm/ia64_int.h>
 #include <asm/vmx_vcpu.h>
@@ -201,7 +201,7 @@
 struct virutal_platform_def *
 vmx_vcpu_get_plat(VCPU *vcpu)
 {
-    return &(vcpu->arch.arch_vmx.vmx_platform);
+    return &(vcpu->domain->arch.vmx_platform);
 }
 
 
@@ -375,7 +375,7 @@
 vmx_vcpu_get_gr(VCPU *vcpu, unsigned reg, UINT64 * val)
 {
     REGS *regs=vcpu_regs(vcpu);
-    u64 nat;
+    int nat;
     //TODO, Eddie
     if (!regs) return 0;
     if (reg >= 16 && reg < 32) {
diff -r b6803bdaa95a -r 7e74ac6fdea9 xen/arch/ia64/vmx_virt.c
--- a/xen/arch/ia64/vmx_virt.c  Tue Aug  2 10:09:24 2005
+++ b/xen/arch/ia64/vmx_virt.c  Tue Aug  2 10:11:41 2005
@@ -1193,7 +1193,8 @@
         case 23:return vmx_vcpu_set_ifs(vcpu,r2);
         case 24:return vmx_vcpu_set_iim(vcpu,r2);
         case 25:return vmx_vcpu_set_iha(vcpu,r2);
-        case 64:return vmx_vcpu_set_lid(vcpu,r2);
+        case 64:printk("SET LID to 0x%lx\n", r2);
+               return vmx_vcpu_set_lid(vcpu,r2);
         case 65:return IA64_NO_FAULT;
         case 66:return vmx_vcpu_set_tpr(vcpu,r2);
         case 67:return vmx_vcpu_set_eoi(vcpu,r2);
@@ -1253,9 +1254,9 @@
         case 23:return cr_get(ifs);
         case 24:return cr_get(iim);
         case 25:return cr_get(iha);
-       case 64:val = ia64_getreg(_IA64_REG_CR_LID);
-            return vmx_vcpu_set_gr(vcpu,tgt,val,0);
-//        case 64:return cr_get(lid);
+//     case 64:val = ia64_getreg(_IA64_REG_CR_LID);
+//          return vmx_vcpu_set_gr(vcpu,tgt,val,0);
+        case 64:return cr_get(lid);
         case 65:
              vmx_vcpu_get_ivr(vcpu,&val);
              return vmx_vcpu_set_gr(vcpu,tgt,val,0);
diff -r b6803bdaa95a -r 7e74ac6fdea9 xen/arch/ia64/vtlb.c
--- a/xen/arch/ia64/vtlb.c      Tue Aug  2 10:09:24 2005
+++ b/xen/arch/ia64/vtlb.c      Tue Aug  2 10:11:41 2005
@@ -23,6 +23,7 @@
 
 #include <linux/sched.h>
 #include <asm/tlb.h>
+#include <asm/mm.h>
 #include <asm/vmx_mm_def.h>
 #include <asm/gcc_intrin.h>
 #include <xen/interrupt.h>
@@ -359,7 +360,10 @@
 void vtlb_insert(thash_cb_t *hcb, thash_data_t *entry, u64 va)
 {
     thash_data_t    *hash_table, *cch;
+    int flag;
     rr_t  vrr;
+    u64 gppn;
+    u64 ppns, ppne;
     
     hash_table = (hcb->hash_func)(hcb->pta,
                         va, entry->rid, entry->ps);
@@ -375,7 +379,18 @@
         *hash_table = *entry;
         hash_table->next = cch;
     }
-    thash_insert (hcb->ts->vhpt, entry, va);
+    if(hcb->vcpu->domain->domain_id==0){
+       thash_insert(hcb->ts->vhpt, entry, va);
+        return;
+    }
+    flag = 1;
+    gppn = 
(POFFSET(va,entry->ps)|PAGEALIGN((entry->ppn<<12),entry->ps))>>PAGE_SHIFT;
+    ppns = PAGEALIGN((entry->ppn<<12),entry->ps);
+    ppne = ppns + PSIZE(entry->ps);
+    if(((ppns<=0xa0000)&&(ppne>0xa0000))||((ppne>0xc0000)&&(ppns<=0xc0000)))
+        flag = 0;
+    if((__gpfn_is_mem(hcb->vcpu->domain, gppn)&&flag))
+       thash_insert(hcb->ts->vhpt, entry, va);
     return ;
 }
 
@@ -427,18 +442,22 @@
     thash_data_t    *hash_table, *p, *q;
     thash_internal_t *priv = &hcb->priv;
     int idx;
-    
+
     hash_table = priv->hash_base;
     if ( hash_table == entry ) {
-        __rem_hash_head (hcb, entry);
+//        if ( PURGABLE_ENTRY(hcb, entry) ) {
+            __rem_hash_head (hcb, entry);
+//        }
         return ;
     }
     // remove from collision chain
     p = hash_table;
     for ( q=p->next; q; q = p->next ) {
-        if ( q == entry ) {
-            p->next = q->next;
-            __rem_chain(hcb, entry);
+        if ( q == entry ){
+//            if ( PURGABLE_ENTRY(hcb,q ) ) {
+                p->next = q->next;
+                __rem_chain(hcb, entry);
+//            }
             return ;
         }
         p = q;
diff -r b6803bdaa95a -r 7e74ac6fdea9 xen/include/asm-ia64/domain.h
--- a/xen/include/asm-ia64/domain.h     Tue Aug  2 10:09:24 2005
+++ b/xen/include/asm-ia64/domain.h     Tue Aug  2 10:11:41 2005
@@ -8,6 +8,7 @@
 #include <asm/vmmu.h>
 #include <asm/regionreg.h>
 #include <public/arch-ia64.h>
+#include <asm/vmx_platform.h>
 #endif // CONFIG_VTI
 #include <xen/list.h>
 
@@ -42,6 +43,7 @@
      * max_pages in domain struct, which indicates maximum memory size
      */
     unsigned long max_pfn;
+    struct virutal_platform_def     vmx_platform;
 #endif  //CONFIG_VTI
     u64 xen_vastart;
     u64 xen_vaend;
diff -r b6803bdaa95a -r 7e74ac6fdea9 xen/include/asm-ia64/ia64_int.h
--- a/xen/include/asm-ia64/ia64_int.h   Tue Aug  2 10:09:24 2005
+++ b/xen/include/asm-ia64/ia64_int.h   Tue Aug  2 10:11:41 2005
@@ -37,7 +37,9 @@
 #define        IA64_RFI_IN_PROGRESS    0x0002
 #define IA64_RETRY              0x0003
 #ifdef  CONFIG_VTI
-#define IA64_FAULT             0x0002
+#undef  IA64_NO_FAULT
+#define        IA64_NO_FAULT           0x0000
+#define IA64_FAULT             0x0001
 #endif      //CONFIG_VTI
 #define IA64_FORCED_IFA         0x0004
 #define        IA64_ILLOP_FAULT        (IA64_GENEX_VECTOR | 0x00)
diff -r b6803bdaa95a -r 7e74ac6fdea9 xen/include/asm-ia64/privop.h
--- a/xen/include/asm-ia64/privop.h     Tue Aug  2 10:09:24 2005
+++ b/xen/include/asm-ia64/privop.h     Tue Aug  2 10:11:41 2005
@@ -138,14 +138,32 @@
     IA64_INST inst;
     struct { unsigned long qp:6, un14:14, r3:7, x6:6, x3:3, un1:1, major:4; };
 } INST64_M47;
+
 typedef union U_INST64_M1{
     IA64_INST inst;
     struct { unsigned long qp:6, r1:7, un7:7, r3:7, x:1, hint:2, x6:6, m:1, 
major:4; };
 } INST64_M1;
+
+typedef union U_INST64_M2{
+    IA64_INST inst;
+    struct { unsigned long qp:6, r1:7, r2:7, r3:7, x:1, hint:2, x6:6, m:1, 
major:4; };
+} INST64_M2;
+
+typedef union U_INST64_M3{
+    IA64_INST inst;
+    struct { unsigned long qp:6, r1:7, imm7:7, r3:7, i:1, hint:2, x6:6, s:1, 
major:4; };
+} INST64_M3;
+
 typedef union U_INST64_M4 {
     IA64_INST inst;
     struct { unsigned long qp:6, un7:7, r2:7, r3:7, x:1, hint:2, x6:6, m:1, 
major:4; };
 } INST64_M4;
+
+typedef union U_INST64_M5 {
+    IA64_INST inst;
+    struct { unsigned long qp:6, imm7:7, r2:7, r3:7, i:1, hint:2, x6:6, s:1, 
major:4; };
+} INST64_M5;
+
 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; };
@@ -166,7 +184,10 @@
     INST64_I28 I28;    // mov from ar (I unit)
 #ifdef CONFIG_VTI
     INST64_M1  M1;  // ld integer
+    INST64_M2  M2;
+    INST64_M3  M3;
     INST64_M4  M4;  // st integer
+    INST64_M5  M5;
     INST64_M6  M6;  // ldfd floating pointer
 #endif // CONFIG_VTI
     INST64_M28 M28;    // purge translation cache entry
diff -r b6803bdaa95a -r 7e74ac6fdea9 xen/include/asm-ia64/vmx.h
--- a/xen/include/asm-ia64/vmx.h        Tue Aug  2 10:09:24 2005
+++ b/xen/include/asm-ia64/vmx.h        Tue Aug  2 10:11:41 2005
@@ -23,6 +23,7 @@
 #define _ASM_IA64_VT_H
 
 #define RR7_SWITCH_SHIFT       12      /* 4k enough */
+#include <public/io/ioreq.h>
 
 extern void identify_vmx_feature(void);
 extern unsigned int vmx_enabled;
@@ -38,4 +39,19 @@
 
 extern void vmx_wait_io(void);
 extern void vmx_io_assist(struct vcpu *v);
+
+static inline vcpu_iodata_t *get_vio(struct domain *d, unsigned long cpu)
+{
+    return &((shared_iopage_t 
*)d->arch.vmx_platform.shared_page_va)->vcpu_iodata[cpu];
+}
+
+static inline int iopacket_port(struct domain *d)
+{
+    return ((shared_iopage_t 
*)d->arch.vmx_platform.shared_page_va)->sp_global.eport;
+}
+
+static inline shared_iopage_t *get_sp(struct domain *d)
+{
+    return (shared_iopage_t *)d->arch.vmx_platform.shared_page_va;
+}
 #endif /* _ASM_IA64_VT_H */
diff -r b6803bdaa95a -r 7e74ac6fdea9 xen/include/asm-ia64/vmx_uaccess.h
--- a/xen/include/asm-ia64/vmx_uaccess.h        Tue Aug  2 10:09:24 2005
+++ b/xen/include/asm-ia64/vmx_uaccess.h        Tue Aug  2 10:11:41 2005
@@ -40,6 +40,8 @@
  */
 asm (".section \"__ex_table\", \"a\"\n\t.previous");
 
+/* VT-i reserves bit 60 for the VMM; guest addresses have bit 60 = bit 59 */
+#define IS_VMM_ADDRESS(addr) ((((addr) >> 60) ^ ((addr) >> 59)) & 1)
 /* For back compatibility */
 #define __access_ok(addr, size, segment)       1
 #define access_ok(addr, size, segment) __access_ok((addr), (size), (segment))
diff -r b6803bdaa95a -r 7e74ac6fdea9 xen/include/asm-ia64/vmx_vcpu.h
--- a/xen/include/asm-ia64/vmx_vcpu.h   Tue Aug  2 10:09:24 2005
+++ b/xen/include/asm-ia64/vmx_vcpu.h   Tue Aug  2 10:11:41 2005
@@ -105,6 +105,10 @@
 extern void vtm_interruption_update(VCPU *vcpu, vtime_t* vtm);
 extern void vtm_domain_out(VCPU *vcpu);
 extern void vtm_domain_in(VCPU *vcpu);
+#ifdef V_IOSAPIC_READY
+extern void vlapic_update_ext_irq(VCPU *vcpu);
+extern void vlapic_update_shared_info(VCPU *vcpu);
+#endif
 extern void vlsapic_reset(VCPU *vcpu);
 extern int vmx_check_pending_irq(VCPU *vcpu);
 extern void guest_write_eoi(VCPU *vcpu);
@@ -399,6 +403,9 @@
 vmx_vcpu_set_lid(VCPU *vcpu, u64 val)
 {
     VPD_CR(vcpu,lid)=val;
+#ifdef V_IOSAPIC_READY
+    vlapic_update_shared_info(vcpu);
+#endif
     return IA64_NO_FAULT;
 }
 extern IA64FAULT vmx_vcpu_set_tpr(VCPU *vcpu, u64 val);
diff -r b6803bdaa95a -r 7e74ac6fdea9 xen/include/asm-ia64/vmx_vpd.h
--- a/xen/include/asm-ia64/vmx_vpd.h    Tue Aug  2 10:09:24 2005
+++ b/xen/include/asm-ia64/vmx_vpd.h    Tue Aug  2 10:11:41 2005
@@ -25,7 +25,6 @@
 #ifndef __ASSEMBLY__
 
 #include <asm/vtm.h>
-#include <asm/vmx_platform.h>
 #include <public/arch-ia64.h>
 
 #define VPD_SHIFT      17      /* 128K requirement */
@@ -84,7 +83,6 @@
     unsigned long   rfi_ipsr;
     unsigned long   rfi_ifs;
        unsigned long   in_service[4];  // vLsapic inservice IRQ bits
-       struct virutal_platform_def     vmx_platform;
        unsigned long   flags;
 };
 
@@ -126,7 +124,6 @@
 
 #endif //__ASSEMBLY__
 
-
 // VPD field offset
 #define VPD_VAC_START_OFFSET           0
 #define VPD_VDC_START_OFFSET           8

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