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] Final set of HV change to support multiple domains on VT

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] Final set of HV change to support multiple domains on VTI.
From: Xen patchbot -unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Wed, 03 Aug 2005 05:26:29 -0400
Delivery-date: Wed, 03 Aug 2005 09:28:43 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# 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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] Final set of HV change to support multiple domains on VTI., Xen patchbot -unstable <=