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] Some outstanding bug fixes found in VT merge

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] Some outstanding bug fixes found in VT merge
From: Xen patchbot -unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Sat, 29 Oct 2005 09:58:08 +0000
Delivery-date: Sat, 29 Oct 2005 09:55:57 +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 djm@xxxxxxxxxxxxxxx
# Node ID 760f5e85c706ed0cb1510fc483fb043923382c9c
# Parent  54b112b314fe22c2cf62c79cb4f10b0ab9265c14
Some outstanding bug fixes found in VT merge

- Consistence of region id mangling algrithm:
    - Metaphysical RID is not mangled, which may conflict with other
    domain's virtual RID
    - Sometimes rr0 is mangled, but sometimes not
    - Sometimes only rid value is saved to saved_rr0_metaphysical, but 
    sometimes the whole value.

- Nat bit comsumption happens but handled as priv_emulate to forward progress.
But this is definitely wrong. We found reason of nat consumption from fast_rfi,
which doesn't save unat again after spill guest states, and then use guest 
unat to fill guest states when return.

- In some corner case, timer interrupt handler won't update itm and then return
directly. When that happens, machine timer interrupt disappears until guest
timer interrupt sets v_itm actively. But vti domain depends on ac_timer while
the latter will stop when above condition happens. Then if current context is 
vti domain, context switch disappears and machine halt.

Also many compatibility issues to support non-vti and vti domain are solved,eg:
- Changing lazy PAL mapping switch to eager switch per domain switch, since 
vti domain always depends on pal call.
- evtchn_notify should also vcpu_wake target domain, since vti domain may block 
for io emulation. Xenolinux is free of this issue, since it's always runnable.

Signed-off-by Kevin Tian <kevin.tian@xxxxxxxxx>
Signed-off-by Anthony Xu <anthony.xu@xxxxxxxxx>

diff -r 54b112b314fe -r 760f5e85c706 xen/Rules.mk
--- a/xen/Rules.mk      Wed Oct 12 23:12:59 2005
+++ b/xen/Rules.mk      Thu Oct 13 20:24:45 2005
@@ -47,6 +47,7 @@
 
 include $(BASEDIR)/arch/$(TARGET_ARCH)/Rules.mk
 
+CFLAGS += -D__HYPERVISOR__
 ifneq ($(debug),y)
 CFLAGS += -DNDEBUG
 ifeq ($(verbose),y)
diff -r 54b112b314fe -r 760f5e85c706 xen/arch/ia64/Rules.mk
--- a/xen/arch/ia64/Rules.mk    Wed Oct 12 23:12:59 2005
+++ b/xen/arch/ia64/Rules.mk    Thu Oct 13 20:24:45 2005
@@ -24,7 +24,7 @@
           -I$(BASEDIR)/include/asm-ia64/linux-null                     \
            -I$(BASEDIR)/arch/ia64/linux -I$(BASEDIR)/arch/ia64/linux-xen
 CFLAGS  += -Wno-pointer-arith -Wredundant-decls
-CFLAGS  += -DIA64 -DXEN -DLINUX_2_6
+CFLAGS  += -DIA64 -DXEN -DLINUX_2_6 -DV_IOSAPIC_READY
 CFLAGS += -ffixed-r13 -mfixed-range=f12-f15,f32-f127
 CFLAGS += -w -g
 ifeq ($(VALIDATE_VT),y)
diff -r 54b112b314fe -r 760f5e85c706 xen/arch/ia64/asm-offsets.c
--- a/xen/arch/ia64/asm-offsets.c       Wed Oct 12 23:12:59 2005
+++ b/xen/arch/ia64/asm-offsets.c       Thu Oct 13 20:24:45 2005
@@ -59,6 +59,8 @@
        DEFINE(XSI_BANKNUM_OFS, offsetof(mapped_regs_t, banknum));
        DEFINE(XSI_BANK0_OFS, offsetof(mapped_regs_t, bank0_regs[0]));
        DEFINE(XSI_BANK1_OFS, offsetof(mapped_regs_t, bank1_regs[0]));
+       DEFINE(XSI_B0NATS_OFS, offsetof(mapped_regs_t, vbnat));
+       DEFINE(XSI_B1NATS_OFS, offsetof(mapped_regs_t, vnat));
        DEFINE(XSI_RR0_OFS, offsetof(mapped_regs_t, rrs[0]));
        DEFINE(XSI_METAPHYS_OFS, offsetof(mapped_regs_t, metaphysical_mode));
        DEFINE(XSI_PRECOVER_IFS_OFS, offsetof(mapped_regs_t, precover_ifs));
@@ -79,6 +81,7 @@
        //DEFINE(IA64_TASK_SIGHAND_OFFSET,offsetof (struct task_struct, 
sighand));
        //DEFINE(IA64_TASK_SIGNAL_OFFSET,offsetof (struct task_struct, signal));
        //DEFINE(IA64_TASK_TGID_OFFSET, offsetof (struct task_struct, tgid));
+       DEFINE(IA64_PGD, offsetof(struct domain, arch.mm));
        DEFINE(IA64_TASK_THREAD_KSP_OFFSET, offsetof (struct vcpu, 
arch._thread.ksp));
        DEFINE(IA64_TASK_THREAD_ON_USTACK_OFFSET, offsetof (struct vcpu, 
arch._thread.on_ustack));
 
diff -r 54b112b314fe -r 760f5e85c706 xen/arch/ia64/linux-xen/entry.S
--- a/xen/arch/ia64/linux-xen/entry.S   Wed Oct 12 23:12:59 2005
+++ b/xen/arch/ia64/linux-xen/entry.S   Thu Oct 13 20:24:45 2005
@@ -900,10 +900,17 @@
     adds r7 = PT(EML_UNAT)+16,r12
        ;;
     ld8 r7 = [r7]
+       ;;
+#if 0
+leave_kernel_self:
+    cmp.ne p8,p0 = r0, r7
+(p8) br.sptk.few leave_kernel_self
+       ;; 
+#endif
 (p6)   br.call.sptk.many b0=deliver_pending_interrupt
     ;;
        mov ar.pfs=loc0
-    mov ar.unat=r7  /* load eml_unat  */
+       mov ar.unat=r7  /* load eml_unat  */
        mov r31=r0
 
 
diff -r 54b112b314fe -r 760f5e85c706 xen/arch/ia64/vmx/vmx_entry.S
--- a/xen/arch/ia64/vmx/vmx_entry.S     Wed Oct 12 23:12:59 2005
+++ b/xen/arch/ia64/vmx/vmx_entry.S     Thu Oct 13 20:24:45 2005
@@ -720,11 +720,11 @@
 
    // re-pin mappings for guest_vhpt
 
-   mov r24=IA64_TR_VHPT
+   mov r24=IA64_TR_PERVP_VHPT
    movl r25=PAGE_KERNEL
    ;;
    or loc5 = r25,loc5          // construct PA | page properties
-   mov r23 = VCPU_TLB_SHIFT<<2
+   mov r23 = IA64_GRANULE_SHIFT <<2
    ;;
    ptr.d   in3,r23
    ;;
diff -r 54b112b314fe -r 760f5e85c706 xen/arch/ia64/vmx/vmx_init.c
--- a/xen/arch/ia64/vmx/vmx_init.c      Wed Oct 12 23:12:59 2005
+++ b/xen/arch/ia64/vmx/vmx_init.c      Thu Oct 13 20:24:45 2005
@@ -47,6 +47,7 @@
 #include <asm/processor.h>
 #include <asm/vmx.h>
 #include <xen/mm.h>
+#include <public/arch-ia64.h>
 
 /* Global flag to identify whether Intel vmx feature is on */
 u32 vmx_enabled = 0;
@@ -134,39 +135,6 @@
        /* Init stub for rr7 switch */
        vmx_init_double_mapping_stub();
 #endif 
-}
-
-void vmx_setup_platform(struct vcpu *v, struct vcpu_guest_context *c)
-{
-       struct domain *d = v->domain;
-       shared_iopage_t *sp;
-
-       ASSERT(d != dom0); /* only for non-privileged vti domain */
-       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;
-
-       /* One more step to enable interrupt assist */
-       set_bit(ARCH_VMX_INTR_ASSIST, &v->arch.arch_vmx.flags);
-       /* Only open one port for I/O and interrupt emulation */
-       if (v == d->vcpu[0]) {
-           memset(&d->shared_info->evtchn_mask[0], 0xff,
-               sizeof(d->shared_info->evtchn_mask));
-           clear_bit(iopacket_port(d), &d->shared_info->evtchn_mask[0]);
-       }
-
-       /* FIXME: only support PMT table continuously by far */
-//     d->arch.pmt = __va(c->pt_base);
-
-
-       vmx_final_setup_domain(d);
 }
 
 typedef union {
@@ -376,40 +344,6 @@
        /* Other vmx specific initialization work */
 }
 
-/*
- * Following stuff should really move to domain builder. However currently
- * XEN/IA64 doesn't export physical -> machine page table to domain builder,
- * instead only the copy. Also there's no hypercall to notify hypervisor
- * IO ranges by far. Let's enhance it later.
- */
-
-#define MEM_G   (1UL << 30)    
-#define MEM_M   (1UL << 20)    
-
-#define MMIO_START       (3 * MEM_G)
-#define MMIO_SIZE        (512 * MEM_M)
-
-#define VGA_IO_START     0xA0000UL
-#define VGA_IO_SIZE      0x20000
-
-#define LEGACY_IO_START  (MMIO_START + MMIO_SIZE)
-#define LEGACY_IO_SIZE   (64*MEM_M)  
-
-#define IO_PAGE_START (LEGACY_IO_START + LEGACY_IO_SIZE)
-#define IO_PAGE_SIZE  PAGE_SIZE
-
-#define STORE_PAGE_START (IO_PAGE_START + IO_PAGE_SIZE)
-#define STORE_PAGE_SIZE         PAGE_SIZE
-
-#define IO_SAPIC_START   0xfec00000UL
-#define IO_SAPIC_SIZE    0x100000
-
-#define PIB_START 0xfee00000UL
-#define PIB_SIZE 0x100000 
-
-#define GFW_START        (4*MEM_G -16*MEM_M)
-#define GFW_SIZE         (16*MEM_M)
-
 typedef struct io_range {
        unsigned long start;
        unsigned long size;
@@ -424,17 +358,25 @@
        {PIB_START, PIB_SIZE, GPFN_PIB},
 };
 
-#define VMX_SYS_PAGES  (2 + GFW_SIZE >> PAGE_SHIFT)
+#define VMX_SYS_PAGES  (2 + (GFW_SIZE >> PAGE_SHIFT))
 #define VMX_CONFIG_PAGES(d) ((d)->max_pages - VMX_SYS_PAGES)
 
 int vmx_alloc_contig_pages(struct domain *d)
 {
-       unsigned int order, i, j;
-       unsigned long start, end, pgnr, conf_nr;
+       unsigned int order;
+       unsigned long i, j, start, end, pgnr, conf_nr;
        struct pfn_info *page;
        struct vcpu *v = d->vcpu[0];
 
        ASSERT(!test_bit(ARCH_VMX_CONTIG_MEM, &v->arch.arch_vmx.flags));
+
+       /* Mark I/O ranges */
+       for (i = 0; i < (sizeof(io_ranges) / sizeof(io_range_t)); i++) {
+           for (j = io_ranges[i].start;
+                j < io_ranges[i].start + io_ranges[i].size;
+                j += PAGE_SIZE)
+               map_domain_page(d, j, io_ranges[i].type);
+       }
 
        conf_nr = VMX_CONFIG_PAGES(d);
        order = get_order_from_pages(conf_nr);
@@ -462,10 +404,20 @@
 
        d->arch.max_pfn = end >> PAGE_SHIFT;
 
-       order = get_order_from_pages(VMX_SYS_PAGES);
+       order = get_order_from_pages(GFW_SIZE >> PAGE_SHIFT);
        if (unlikely((page = alloc_domheap_pages(d, order, 0)) == NULL)) {
            printk("Could not allocate order=%d pages for vmx contig alloc\n",
                        order);
+           return -1;
+       }
+
+       /* Map guest firmware */
+       pgnr = page_to_pfn(page);
+       for (i = GFW_START; i < GFW_START + GFW_SIZE; i += PAGE_SIZE, pgnr++)
+           map_domain_page(d, i, pgnr << PAGE_SHIFT);
+
+       if (unlikely((page = alloc_domheap_pages(d, 1, 0)) == NULL)) {
+           printk("Could not allocate order=1 pages for vmx contig alloc\n");
            return -1;
        }
 
@@ -474,20 +426,42 @@
        map_domain_page(d, IO_PAGE_START, pgnr << PAGE_SHIFT);
        pgnr++;
        map_domain_page(d, STORE_PAGE_START, pgnr << PAGE_SHIFT);
-       pgnr++;
-
-       /* Map guest firmware */
-       for (i = GFW_START; i < GFW_START + GFW_SIZE; i += PAGE_SIZE, pgnr++)
-           map_domain_page(d, i, pgnr << PAGE_SHIFT);
-
-       /* Mark I/O ranges */
-       for (i = 0; i < (sizeof(io_ranges) / sizeof(io_range_t)); i++) {
-           for (j = io_ranges[i].start;
-                j < io_ranges[i].start + io_ranges[i].size;
-                j += PAGE_SIZE)
-               map_domain_page(d, j, io_ranges[i].type);
-       }
 
        set_bit(ARCH_VMX_CONTIG_MEM, &v->arch.arch_vmx.flags);
        return 0;
 }
+
+void vmx_setup_platform(struct vcpu *v, struct vcpu_guest_context *c)
+{
+       struct domain *d = v->domain;
+       shared_iopage_t *sp;
+
+       ASSERT(d != dom0); /* only for non-privileged vti domain */
+       d->arch.vmx_platform.shared_page_va =
+               __va(__gpa_to_mpa(d, IO_PAGE_START));
+       sp = get_sp(d);
+       //memset((char *)sp,0,PAGE_SIZE);
+       //sp->sp_global.eport = 2;
+#ifdef V_IOSAPIC_READY
+       sp->vcpu_number = 1;
+#endif
+       /* TEMP */
+       d->arch.vmx_platform.pib_base = 0xfee00000UL;
+
+       /* One more step to enable interrupt assist */
+       set_bit(ARCH_VMX_INTR_ASSIST, &v->arch.arch_vmx.flags);
+       /* Only open one port for I/O and interrupt emulation */
+       if (v == d->vcpu[0]) {
+           memset(&d->shared_info->evtchn_mask[0], 0xff,
+               sizeof(d->shared_info->evtchn_mask));
+           clear_bit(iopacket_port(d), &d->shared_info->evtchn_mask[0]);
+       }
+
+       /* FIXME: only support PMT table continuously by far */
+//     d->arch.pmt = __va(c->pt_base);
+
+
+       vmx_final_setup_domain(d);
+}
+
+
diff -r 54b112b314fe -r 760f5e85c706 xen/arch/ia64/vmx/vmx_irq_ia64.c
--- a/xen/arch/ia64/vmx/vmx_irq_ia64.c  Wed Oct 12 23:12:59 2005
+++ b/xen/arch/ia64/vmx/vmx_irq_ia64.c  Thu Oct 13 20:24:45 2005
@@ -101,7 +101,10 @@
 
                if (vector != IA64_TIMER_VECTOR) {
                        /* FIXME: Leave IRQ re-route later */
-                       vmx_vcpu_pend_interrupt(dom0->vcpu[0],vector);
+                       if (!VMX_DOMAIN(dom0->vcpu[0]))
+                               vcpu_pend_interrupt(dom0->vcpu[0],vector);
+                       else
+                               vmx_vcpu_pend_interrupt(dom0->vcpu[0],vector);
                        wake_dom0 = 1;
                }
                else {  // FIXME: Handle Timer only now
diff -r 54b112b314fe -r 760f5e85c706 xen/arch/ia64/vmx/vmx_process.c
--- a/xen/arch/ia64/vmx/vmx_process.c   Wed Oct 12 23:12:59 2005
+++ b/xen/arch/ia64/vmx/vmx_process.c   Thu Oct 13 20:24:45 2005
@@ -271,7 +271,7 @@
 {
     IA64_PSR vpsr;
     CACHE_LINE_TYPE type;
-    u64 vhpt_adr;
+    u64 vhpt_adr, gppa;
     ISR misr;
     ia64_rr vrr;
     REGS *regs;
@@ -314,9 +314,9 @@
 //    prepare_if_physical_mode(v);
 
     if(data=vtlb_lookup_ex(vtlb, vrr.rid, vadr,type)){
-        if(v->domain!=dom0&&type==DSIDE_TLB && 
__gpfn_is_io(v->domain,data->ppn>>(PAGE_SHIFT-12))){
-            
vadr=(vadr&((1UL<<data->ps)-1))+(data->ppn>>(data->ps-12)<<data->ps);
-            emulate_io_inst(v, vadr, data->ma);
+       gppa = (vadr&((1UL<<data->ps)-1))+(data->ppn>>(data->ps-12)<<data->ps);
+        if(v->domain!=dom0&&type==DSIDE_TLB && 
__gpfn_is_io(v->domain,gppa>>PAGE_SHIFT)){
+            emulate_io_inst(v, gppa, data->ma);
             return IA64_FAULT;
         }
 
diff -r 54b112b314fe -r 760f5e85c706 xen/arch/ia64/vmx/vmx_support.c
--- a/xen/arch/ia64/vmx/vmx_support.c   Wed Oct 12 23:12:59 2005
+++ b/xen/arch/ia64/vmx/vmx_support.c   Thu Oct 13 20:24:45 2005
@@ -158,7 +158,7 @@
 #ifdef V_IOSAPIC_READY
     vlapic_update_ext_irq(v);
 #else
-    panic("IOSAPIC model is missed in qemu\n");
+    //panic("IOSAPIC model is missed in qemu\n");
 #endif
     return;
 }
diff -r 54b112b314fe -r 760f5e85c706 xen/arch/ia64/vmx/vtlb.c
--- a/xen/arch/ia64/vmx/vtlb.c  Wed Oct 12 23:12:59 2005
+++ b/xen/arch/ia64/vmx/vtlb.c  Thu Oct 13 20:24:45 2005
@@ -387,6 +387,15 @@
        thash_insert(hcb->ts->vhpt, entry, va);
         return;
     }
+
+#if 1
+    vrr=vmx_vcpu_rr(current, va);
+    if (vrr.ps != entry->ps) {
+       printk("not preferred ps with va: 0x%lx\n", va);
+       return;
+    }
+#endif 
+
     flag = 1;
     gppn = 
(POFFSET(va,entry->ps)|PAGEALIGN((entry->ppn<<12),entry->ps))>>PAGE_SHIFT;
     ppns = PAGEALIGN((entry->ppn<<12),entry->ps);
diff -r 54b112b314fe -r 760f5e85c706 xen/arch/ia64/xen/dom0_ops.c
--- a/xen/arch/ia64/xen/dom0_ops.c      Wed Oct 12 23:12:59 2005
+++ b/xen/arch/ia64/xen/dom0_ops.c      Thu Oct 13 20:24:45 2005
@@ -177,13 +177,8 @@
 
             for ( i = start_page; i < (start_page + nr_pages); i++ )
             {
-                page = map_new_domain_page(d, i << PAGE_SHIFT);
-                if ( page == NULL )
-                {
-                    ret = -ENOMEM;
-                    break;
-                }
-                pfn = page_to_pfn(page);
+               pfn = __gpfn_to_mfn_foreign(d, i);
+
                 if ( put_user(pfn, buffer) )
                 {
                     ret = -EFAULT;
diff -r 54b112b314fe -r 760f5e85c706 xen/arch/ia64/xen/dom_fw.c
--- a/xen/arch/ia64/xen/dom_fw.c        Wed Oct 12 23:12:59 2005
+++ b/xen/arch/ia64/xen/dom_fw.c        Thu Oct 13 20:24:45 2005
@@ -301,7 +301,7 @@
        // pal code must be mapped by a TR when pal is called, however
        // calls are rare enough that we will map it lazily rather than
        // at every context switch
-       efi_map_pal_code();
+       //efi_map_pal_code();
        switch (index) {
            case PAL_MEM_ATTRIB:
                status = ia64_pal_mem_attrib(&r9);
diff -r 54b112b314fe -r 760f5e85c706 xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c        Wed Oct 12 23:12:59 2005
+++ b/xen/arch/ia64/xen/domain.c        Thu Oct 13 20:24:45 2005
@@ -59,6 +59,7 @@
 
 // initialized by arch/ia64/setup.c:find_initrd()
 unsigned long initrd_start = 0, initrd_end = 0;
+extern unsigned long running_on_sim;
 
 #define IS_XEN_ADDRESS(d,a) ((a >= d->xen_vastart) && (a <= d->xen_vaend))
 
@@ -190,6 +191,9 @@
                while (1);
        }
        memset(d->shared_info, 0, PAGE_SIZE);
+       if (v == d->vcpu[0])
+           memset(&d->shared_info->evtchn_mask[0], 0xff,
+               sizeof(d->shared_info->evtchn_mask));
 #if 0
        d->vcpu[0].arch.privregs = 
                        alloc_xenheap_pages(get_order(sizeof(mapped_regs_t)));
@@ -271,6 +275,14 @@
        if ( test_bit(_VCPUF_initialised, &v->vcpu_flags) )
             return 0;
 
+       /* Sync d/i cache conservatively */
+       if (!running_on_sim) {
+           ret = ia64_pal_cache_flush(4, 0, &progress, NULL);
+           if (ret != PAL_STATUS_SUCCESS)
+               panic("PAL CACHE FLUSH failed for domain.\n");
+           printk("Sync i/d cache for dom0 image SUCC\n");
+       }
+
        if (c->flags & VGCF_VMX_GUEST) {
            if (!vmx_enabled) {
                printk("No VMX hardware feature for vmx domain.\n");
@@ -547,7 +559,8 @@
                                if (pte_present(*pte)) {
 //printk("lookup_domain_page: found mapping for %lx, 
pte=%lx\n",mpaddr,pte_val(*pte));
                                        return *(unsigned long *)pte;
-                               }
+                               } else if (VMX_DOMAIN(d->vcpu[0]))
+                                       return GPFN_INV_MASK;
                        }
                }
        }
@@ -799,7 +812,6 @@
        set_bit(_DOMF_physdev_access, &d->domain_flags);
 }
 
-extern unsigned long running_on_sim;
 unsigned int vmx_dom0 = 0;
 int construct_dom0(struct domain *d, 
                       unsigned long image_start, unsigned long image_len, 
diff -r 54b112b314fe -r 760f5e85c706 xen/arch/ia64/xen/hyperprivop.S
--- a/xen/arch/ia64/xen/hyperprivop.S   Wed Oct 12 23:12:59 2005
+++ b/xen/arch/ia64/xen/hyperprivop.S   Thu Oct 13 20:24:45 2005
@@ -807,8 +807,11 @@
        // OK, now all set to go except for switch to virtual bank1
        mov r22=1;; st4 [r20]=r22;
        mov r30=r2; mov r29=r3;;
+    adds r16=XSI_B1NATS_OFS-XSI_PSR_IC_OFS,r18
        adds r2=XSI_BANK1_OFS-XSI_PSR_IC_OFS,r18;
        adds r3=(XSI_BANK1_OFS+8)-XSI_PSR_IC_OFS,r18;;
+    ld8 r16=[r16];;
+    mov ar.unat=r16;;
        bsw.1;;
        // FIXME?: ar.unat is not really handled correctly,
        // but may not matter if the OS is NaT-clean
diff -r 54b112b314fe -r 760f5e85c706 xen/arch/ia64/xen/ivt.S
--- a/xen/arch/ia64/xen/ivt.S   Wed Oct 12 23:12:59 2005
+++ b/xen/arch/ia64/xen/ivt.S   Thu Oct 13 20:24:45 2005
@@ -1460,7 +1460,28 @@
 // 0x5500 Entry 25 (size 16 bundles) Disabled FP-Register (35)
 ENTRY(disabled_fp_reg)
 #ifdef XEN
+#if 0
+       mov r20=pr
+       movl r16=0x2000000000000000
+       movl r17=0x2000000000176b60
+       mov r18=cr.iip
+       mov r19=rr[r16]
+       movl r22=0xe95d0439
+       ;;
+       mov pr=r0,-1
+       ;;
+       cmp.eq p6,p7=r22,r19
+       ;;
+       (p6) cmp.eq p8,p9=r17,r18
+       (p8) br.sptk.few floating_panic
+       ;;
+       mov pr=r20,-1
+       ;;
+#endif
        REFLECT(25)
+//floating_panic:
+//     br.sptk.many floating_panic
+       ;;
 #endif
        DBG_FAULT(25)
        rsm psr.dfh             // ensure we can access fph
diff -r 54b112b314fe -r 760f5e85c706 xen/arch/ia64/xen/process.c
--- a/xen/arch/ia64/xen/process.c       Wed Oct 12 23:12:59 2005
+++ b/xen/arch/ia64/xen/process.c       Thu Oct 13 20:24:45 2005
@@ -745,6 +745,8 @@
            case 26:
 printf("*** NaT fault... attempting to handle as privop\n");
 printf("isr=%p, ifa=%p,iip=%p,ipsr=%p\n",isr,ifa,regs->cr_iip,psr);
+               regs->eml_unat = 0;
+               return;
                vector = priv_emulate(v,regs,isr);
                if (vector == IA64_NO_FAULT) {
 printf("*** Handled privop masquerading as NaT fault\n");
diff -r 54b112b314fe -r 760f5e85c706 xen/arch/ia64/xen/regionreg.c
--- a/xen/arch/ia64/xen/regionreg.c     Wed Oct 12 23:12:59 2005
+++ b/xen/arch/ia64/xen/regionreg.c     Thu Oct 13 20:24:45 2005
@@ -15,7 +15,8 @@
 #include <asm/regionreg.h>
 #include <asm/vhpt.h>
 #include <asm/vcpu.h>
-extern void ia64_new_rr7(unsigned long rid,void *shared_info, void 
*shared_arch_info);
+extern void ia64_new_rr7(unsigned long rid,void *shared_info, void 
*shared_arch_info, unsigned long p_vhpt, unsigned long v_pal);
+extern void *pal_vaddr;
 
 
 #define        IA64_MIN_IMPL_RID_BITS  (IA64_MIN_IMPL_RID_MSB+1)
@@ -66,9 +67,12 @@
 {
        ia64_rr rrv;
 
+       rrv.rrval = 0;  // Or else may see reserved bit fault
        rrv.rid = allocate_reserved_rid();
        rrv.ps = PAGE_SHIFT;
        rrv.ve = 0;
+       /* Mangle metaphysical rid */
+       rrv.rrval = vmMangleRID(rrv.rrval);
        return rrv.rrval;
 }
 
@@ -213,6 +217,7 @@
        unsigned long rreg = REGION_NUMBER(rr);
        ia64_rr rrv, newrrv, memrrv;
        unsigned long newrid;
+       extern unsigned long vhpt_paddr;
 
        if (val == -1) return 1;
 
@@ -250,9 +255,10 @@
        newrrv.rid = newrid;
        newrrv.ve = 1;  // VHPT now enabled for region 7!!
        newrrv.ps = PAGE_SHIFT;
-       if (rreg == 0) v->arch.metaphysical_saved_rr0 = newrrv.rrval;
+       if (rreg == 0) v->arch.metaphysical_saved_rr0 =
+               vmMangleRID(newrrv.rrval);
        if (rreg == 7) ia64_new_rr7(vmMangleRID(newrrv.rrval),v->vcpu_info,
-                               v->arch.privregs);
+                               v->arch.privregs, vhpt_paddr, pal_vaddr);
        else set_rr(rr,newrrv.rrval);
 #endif
        return 1;
@@ -265,7 +271,8 @@
        ia64_rr rrv;
        
 //     rrv.ve = 1;     FIXME: TURN ME BACK ON WHEN VHPT IS WORKING
-       set_rr(0,v->arch.metaphysical_rr0);
+       ia64_set_rr(0,v->arch.metaphysical_rr0);
+       ia64_srlz_d();
 }
 
 // validates/changes region registers 0-6 in the currently executing domain
@@ -290,7 +297,7 @@
        ia64_rr rrv;
 
        rrv.rrval = 0;
-       rrv.rrval = v->domain->arch.metaphysical_rr0;
+       //rrv.rrval = v->domain->arch.metaphysical_rr0;
        rrv.ps = PAGE_SHIFT;
        rrv.ve = 1;
 if (!v->vcpu_info) { printf("Stopping in init_all_rr\n"); dummy(); }
@@ -343,12 +350,16 @@
        if (VCPU(v,metaphysical_mode)) {
                ia64_rr rrv;
 
+#if 0
                rrv.rrval = 0;
                rrv.rid = v->domain->arch.metaphysical_rr0;
                rrv.ps = PAGE_SHIFT;
                rrv.ve = 1;
                rr0 = rrv.rrval;
                set_rr_no_srlz(0x0000000000000000L, rr0);
+#endif
+               rr0 = v->domain->arch.metaphysical_rr0;
+               ia64_set_rr(0x0000000000000000L, rr0);
                ia64_srlz_d();
        }
        else {
diff -r 54b112b314fe -r 760f5e85c706 xen/arch/ia64/xen/vcpu.c
--- a/xen/arch/ia64/xen/vcpu.c  Wed Oct 12 23:12:59 2005
+++ b/xen/arch/ia64/xen/vcpu.c  Thu Oct 13 20:24:45 2005
@@ -775,6 +775,7 @@
        }
 #ifdef HEARTBEAT_FREQ
        if (domid >= N_DOMS) domid = N_DOMS-1;
+#if 0
        if (vector == (PSCB(vcpu,itv) & 0xff)) {
            if (!(++count[domid] & ((HEARTBEAT_FREQ*1024)-1))) {
                printf("Dom%d heartbeat... ticks=%lx,nonticks=%lx\n",
@@ -783,6 +784,7 @@
                //dump_runq();
            }
        }
+#endif
        else nonclockcount[domid]++;
 #endif
        // now have an unmasked, pending, deliverable vector!
diff -r 54b112b314fe -r 760f5e85c706 xen/arch/ia64/xen/xenasm.S
--- a/xen/arch/ia64/xen/xenasm.S        Wed Oct 12 23:12:59 2005
+++ b/xen/arch/ia64/xen/xenasm.S        Thu Oct 13 20:24:45 2005
@@ -48,11 +48,11 @@
 // FIXME? Note that this turns off the DB bit (debug)
 #define PSR_BITS_TO_SET        IA64_PSR_BN
 
-//extern void ia64_new_rr7(unsigned long rid,void *shared_info, void 
*shared_arch_info);
+//extern void ia64_new_rr7(unsigned long rid,void *shared_info, void 
*shared_arch_info, unsigned long p_vhpt, unsigned long v_pal);
 GLOBAL_ENTRY(ia64_new_rr7)
        // not sure this unwind statement is correct...
        .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(1)
-       alloc loc1 = ar.pfs, 3, 8, 0, 0
+       alloc loc1 = ar.pfs, 5, 9, 0, 0
 1:     {
          mov r28  = in0                // copy procedure index
          mov r8   = ip                 // save ip to compute branch
@@ -63,10 +63,12 @@
        ;;
        tpa loc2=loc2                   // grab this BEFORE changing rr7
        ;;
+       dep loc8=0,in4,60,4
+       ;;
 #if VHPT_ENABLED
-       movl loc6=VHPT_ADDR
-       ;;
-       tpa loc6=loc6                   // grab this BEFORE changing rr7
+       mov loc6=in3
+       ;;
+       //tpa loc6=loc6                 // grab this BEFORE changing rr7
        ;;
 #endif
        mov loc5=in1
@@ -229,6 +231,21 @@
        mov r25=IA64_TR_ARCH_INFO
        ;;
        itr.d dtr[r25]=r23              // wire in new mapping...
+       ;;
+
+       //Purge/insert PAL TR
+       mov r24=IA64_TR_PALCODE
+       movl r25=PAGE_KERNEL
+       ;;
+       or loc8=r25,loc8
+       mov r23=IA64_GRANULE_SHIFT<<2
+       ;;
+       ptr.i   in4,r23
+       ;;
+       mov cr.itir=r23
+       mov cr.ifa=in4
+       ;;
+       itr.i itr[r24]=loc8
        ;;
 
        // done, switch back to virtual and return
diff -r 54b112b314fe -r 760f5e85c706 xen/arch/ia64/xen/xenmisc.c
--- a/xen/arch/ia64/xen/xenmisc.c       Wed Oct 12 23:12:59 2005
+++ b/xen/arch/ia64/xen/xenmisc.c       Thu Oct 13 20:24:45 2005
@@ -17,6 +17,7 @@
 #include <asm/io.h>
 #include <xen/softirq.h>
 #include <public/sched.h>
+#include <asm/vhpt.h>
 
 efi_memory_desc_t ia64_efi_io_md;
 EXPORT_SYMBOL(ia64_efi_io_md);
@@ -310,9 +311,13 @@
 if (!i--) { printk("+",id); i = 1000000; }
 }
 
-       if (VMX_DOMAIN(current)){
+    if (VMX_DOMAIN(current)){
                vmx_load_all_rr(current);
     }else{
+       extern char ia64_ivt;
+       ia64_set_iva(&ia64_ivt);
+       ia64_set_pta(VHPT_ADDR | (1 << 8) | (VHPT_SIZE_LOG2 << 2) |
+               VHPT_ENABLED);
        if (!is_idle_task(current->domain)) {
                load_region_regs(current);
                    if (vcpu_timer_expired(current)) vcpu_pend_timer(current);
diff -r 54b112b314fe -r 760f5e85c706 xen/arch/ia64/xen/xentime.c
--- a/xen/arch/ia64/xen/xentime.c       Wed Oct 12 23:12:59 2005
+++ b/xen/arch/ia64/xen/xentime.c       Thu Oct 13 20:24:45 2005
@@ -99,6 +99,7 @@
 {
        unsigned long new_itm, old_itc;
 
+#if 0
 #define HEARTBEAT_FREQ 16      // period in seconds
 #ifdef HEARTBEAT_FREQ
        static long count = 0;
@@ -110,6 +111,7 @@
                count = 0;
        }
 #endif
+#endif
        if (current->domain == dom0) {
                // FIXME: there's gotta be a better way of doing this...
                // We have to ensure that domain0 is launched before we
@@ -117,12 +119,14 @@
                //domain0_ready = 1; // moved to xensetup.c
                VCPU(current,pending_interruption) = 1;
        }
-       if (domain0_ready && vcpu_timer_expired(dom0->vcpu[0])) {
-               vcpu_pend_timer(dom0->vcpu[0]);
-               //vcpu_set_next_timer(dom0->vcpu[0]);
-               vcpu_wake(dom0->vcpu[0]);
-       }
-       if (!is_idle_task(current->domain) && current->domain != dom0) {
+       if (domain0_ready && current->domain != dom0) {
+               if(vcpu_timer_expired(dom0->vcpu[0])) {
+                       vcpu_pend_timer(dom0->vcpu[0]);
+                       //vcpu_set_next_timer(dom0->vcpu[0]);
+                       vcpu_wake(dom0->vcpu[0]);
+               }
+       }
+       if (!is_idle_task(current->domain))  {
                if (vcpu_timer_expired(current)) {
                        vcpu_pend_timer(current);
                        // ensure another timer interrupt happens even if 
domain doesn't
@@ -132,8 +136,11 @@
        }
        new_itm = local_cpu_data->itm_next;
 
-       if (!time_after(ia64_get_itc(), new_itm))
+       if (!VMX_DOMAIN(current) && !time_after(ia64_get_itc(), new_itm))
                return;
+
+       if (VMX_DOMAIN(current))
+               vcpu_wake(current);
 
        while (1) {
                new_itm += local_cpu_data->itm_delta;
diff -r 54b112b314fe -r 760f5e85c706 xen/include/asm-ia64/config.h
--- a/xen/include/asm-ia64/config.h     Wed Oct 12 23:12:59 2005
+++ b/xen/include/asm-ia64/config.h     Thu Oct 13 20:24:45 2005
@@ -102,7 +102,7 @@
 #endif
 
 // xen/include/asm/config.h
-#define HZ 100
+//#define HZ 1000
 // FIXME SMP: leave SMP for a later time
 #define barrier() __asm__ __volatile__("": : :"memory")
 
diff -r 54b112b314fe -r 760f5e85c706 xen/include/asm-ia64/event.h
--- a/xen/include/asm-ia64/event.h      Wed Oct 12 23:12:59 2005
+++ b/xen/include/asm-ia64/event.h      Thu Oct 13 20:24:45 2005
@@ -14,6 +14,21 @@
 
 static inline void evtchn_notify(struct vcpu *v)
 {
+    /*
+     * NB1. 'vcpu_flags' and 'processor' must be checked /after/ update of
+     * pending flag. These values may fluctuate (after all, we hold no
+     * locks) but the key insight is that each change will cause
+     * evtchn_upcall_pending to be polled.
+     * 
+     * NB2. We save VCPUF_running across the unblock to avoid a needless
+     * IPI for domains that we IPI'd to unblock.
+     */
+    int running = test_bit(_VCPUF_running, &v->vcpu_flags);
+    vcpu_unblock(v);
+    if ( running )
+        smp_send_event_check_cpu(v->processor);
+
+    if(!VMX_DOMAIN(v))
        vcpu_pend_interrupt(v, v->vcpu_info->arch.evtchn_vector);
 }
 
diff -r 54b112b314fe -r 760f5e85c706 xen/include/asm-ia64/mm.h
--- a/xen/include/asm-ia64/mm.h Wed Oct 12 23:12:59 2005
+++ b/xen/include/asm-ia64/mm.h Thu Oct 13 20:24:45 2005
@@ -405,6 +405,7 @@
 extern int nr_swap_pages;
 
 extern unsigned long *mpt_table;
+extern unsigned long lookup_domain_mpa(struct domain *d, unsigned long mpaddr);
 #undef machine_to_phys_mapping
 #define machine_to_phys_mapping        mpt_table
 
@@ -433,10 +434,10 @@
 
 #define __gpfn_is_mem(_d, gpfn)                                \
        (__gpfn_valid(_d, gpfn) ?                       \
-       (lookup_domain_mpa((_d), ((gpfn)<<PAGE_SHIFT) & GPFN_IO_MASK) == 
GPFN_MEM) : 0)
-
-
-//#define __gpa_to_mpa(_d, gpa)   \
-//    ((__gpfn_to_mfn((_d),(gpa)>>PAGE_SHIFT)<<PAGE_SHIFT)|((gpa)&~PAGE_MASK))
+       ((lookup_domain_mpa((_d), ((gpfn)<<PAGE_SHIFT)) & GPFN_IO_MASK) == 
GPFN_MEM) : 0)
+
+
+#define __gpa_to_mpa(_d, gpa)   \
+    ((__gpfn_to_mfn((_d),(gpa)>>PAGE_SHIFT)<<PAGE_SHIFT)|((gpa)&~PAGE_MASK))
 
 #endif /* __ASM_IA64_MM_H__ */
diff -r 54b112b314fe -r 760f5e85c706 xen/include/asm-ia64/vmx.h
--- a/xen/include/asm-ia64/vmx.h        Wed Oct 12 23:12:59 2005
+++ b/xen/include/asm-ia64/vmx.h        Thu Oct 13 20:24:45 2005
@@ -24,6 +24,7 @@
 
 #define RR7_SWITCH_SHIFT       12      /* 4k enough */
 #include <public/io/ioreq.h>
+
 
 extern void identify_vmx_feature(void);
 extern unsigned int vmx_enabled;
diff -r 54b112b314fe -r 760f5e85c706 xen/include/asm-ia64/xenkregs.h
--- a/xen/include/asm-ia64/xenkregs.h   Wed Oct 12 23:12:59 2005
+++ b/xen/include/asm-ia64/xenkregs.h   Thu Oct 13 20:24:45 2005
@@ -6,7 +6,8 @@
  */
 #define IA64_TR_SHARED_INFO    3       /* dtr3: page shared with domain */
 #define        IA64_TR_VHPT            4       /* dtr4: vhpt */
-#define IA64_TR_ARCH_INFO      5
+#define IA64_TR_ARCH_INFO      5
+#define IA64_TR_PERVP_VHPT     6
 
 /* Processor status register bits: */
 #define IA64_PSR_VM_BIT                46
diff -r 54b112b314fe -r 760f5e85c706 xen/include/public/arch-ia64.h
--- a/xen/include/public/arch-ia64.h    Wed Oct 12 23:12:59 2005
+++ b/xen/include/public/arch-ia64.h    Thu Oct 13 20:24:45 2005
@@ -37,6 +37,33 @@
 #define GPFN_INV_MASK          (31UL << 59)    /* Guest pfn is invalid */
 
 #define INVALID_MFN              (~0UL)
+
+#define MEM_G   (1UL << 30)    
+#define MEM_M   (1UL << 20)    
+
+#define MMIO_START       (3 * MEM_G)
+#define MMIO_SIZE        (512 * MEM_M)
+
+#define VGA_IO_START     0xA0000UL
+#define VGA_IO_SIZE      0x20000
+
+#define LEGACY_IO_START  (MMIO_START + MMIO_SIZE)
+#define LEGACY_IO_SIZE   (64*MEM_M)  
+
+#define IO_PAGE_START (LEGACY_IO_START + LEGACY_IO_SIZE)
+#define IO_PAGE_SIZE  PAGE_SIZE
+
+#define STORE_PAGE_START (IO_PAGE_START + IO_PAGE_SIZE)
+#define STORE_PAGE_SIZE         PAGE_SIZE
+
+#define IO_SAPIC_START   0xfec00000UL
+#define IO_SAPIC_SIZE    0x100000
+
+#define PIB_START 0xfee00000UL
+#define PIB_SIZE 0x100000 
+
+#define GFW_START        (4*MEM_G -16*MEM_M)
+#define GFW_SIZE         (16*MEM_M)
 
 /*
  * NB. This may become a 64-bit count with no shift. If this happens then the 
diff -r 54b112b314fe -r 760f5e85c706 xen/include/public/io/ioreq.h
--- a/xen/include/public/io/ioreq.h     Wed Oct 12 23:12:59 2005
+++ b/xen/include/public/io/ioreq.h     Thu Oct 13 20:24:45 2005
@@ -35,6 +35,13 @@
 #define IOREQ_TYPE_OR          3
 #define IOREQ_TYPE_XOR         4
 
+#ifdef __HYPERVISOR__
+#include <public/io/vmx_vlapic.h>
+#else
+#include <xen/io/vmx_vlapic.h>
+#endif
+
+
 /*
  * VMExit dispatcher should cooperate with instruction decoder to
  * prepare this structure and notify service OS and DM by sending
@@ -55,10 +62,6 @@
     u8      type;              /* I/O type                     */
 } ioreq_t;
 
-#define MAX_VECTOR    256
-#define BITS_PER_BYTE   8
-#define INTR_LEN        (MAX_VECTOR/(BITS_PER_BYTE * sizeof(u64)))
-
 typedef struct {
     u64   pic_intr[INTR_LEN];
     u64   pic_mask[INTR_LEN];
@@ -67,10 +70,11 @@
 
 typedef struct {
     ioreq_t         vp_ioreq;
-    unsigned long   vp_intr[INTR_LEN];
+    vl_apic_info    apic_intr;
 } vcpu_iodata_t;
 
 typedef struct {
+    int vcpu_number;
     global_iodata_t     sp_global;
     vcpu_iodata_t       vcpu_iodata[1];
 } shared_iopage_t;
diff -r 54b112b314fe -r 760f5e85c706 xen/include/public/io/vmx_vlapic.h
--- a/xen/include/public/io/vmx_vlapic.h        Wed Oct 12 23:12:59 2005
+++ b/xen/include/public/io/vmx_vlapic.h        Thu Oct 13 20:24:45 2005
@@ -1,57 +1,29 @@
 #ifndef _VMX_VLAPIC_H
 #define _VMX_VLAPIC_H
 
-/*
-   We extended one bit for PIC type
- */
 #define VLAPIC_DELIV_MODE_FIXED          0x0
 #define VLAPIC_DELIV_MODE_LPRI           0x1
 #define VLAPIC_DELIV_MODE_SMI            0x2
+#define VLAPIC_DELIV_MODE_PMI            0x2
 #define VLAPIC_DELIV_MODE_NMI            0x4
 #define VLAPIC_DELIV_MODE_INIT           0x5
 #define VLAPIC_DELIV_MODE_STARTUP        0x6
 #define VLAPIC_DELIV_MODE_EXT            0x7
 #define VLAPIC_DELIV_MODE_MASK            0x8
 
-#define VLAPIC_MSG_LEVEL                4
-
-#define INTR_EXT   0
-#define INTR_APIC   1
-#define INTR_LAPIC  2
-
-#define VL_STATE_EOI    1
-#define VL_STATE_EXT_LOCK   2
-#define VL_STATE_MSG_LOCK   3
-#define VL_STATE_EOI_LOCK   3
-
-#define VLOCAL_APIC_MAX_INTS             256
-#define VLAPIC_INT_COUNT                (VLOCAL_APIC_MAX_INTS/(BITS_PER_BYTE * 
sizeof(u64)))
-#define VLAPIC_INT_COUNT_32             (VLOCAL_APIC_MAX_INTS/(BITS_PER_BYTE * 
sizeof(u32)))
-
-struct vapic_bus_message{
-   u8   deliv_mode:4;   /* deliver mode, including fixed, LPRI, etc */
-   u8   level:1;        /* level or edge */
-   u8   trig_mod:1;    /* assert or disassert */
-   u8   reserved:2;
-   u8   vector;
-};
+#define MAX_VECTOR    256
+#define BITS_PER_BYTE   8
+#define INTR_LEN        (MAX_VECTOR/(BITS_PER_BYTE * sizeof(u64)))
+#define INTR_LEN_32        (MAX_VECTOR/(BITS_PER_BYTE * sizeof(u32)))
 
 typedef struct {
-    /* interrupt for PIC and ext type IOAPIC interrupt */
-    u64   vl_ext_intr[VLAPIC_INT_COUNT];
-    u64   vl_ext_intr_mask[VLAPIC_INT_COUNT];
-    u64   vl_apic_intr[VLAPIC_INT_COUNT];
-    u64   vl_apic_tmr[VLAPIC_INT_COUNT];
-    u64   vl_eoi[VLAPIC_INT_COUNT];
     u32   vl_lapic_id;
-    u32   direct_intr;
     u32   vl_apr;
     u32   vl_logical_dest;
     u32   vl_dest_format;
     u32   vl_arb_id;
-    u32   vl_state;
-    u32   apic_msg_count;
-    struct vapic_bus_message  vl_apic_msg[24];
-} vlapic_info;
+    u64   irr[INTR_LEN];
+    u64   tmr[INTR_LEN];
+}vl_apic_info;
 
 #endif /* _VMX_VLAPIC_H_ */

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] Some outstanding bug fixes found in VT merge, Xen patchbot -unstable <=