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

[Xen-changelog] Merged.



# HG changeset patch
# User emellor@xxxxxxxxxxxxxxxxxxxxxx
# Node ID a5195bf5671d383372005366ffe190c59276d801
# Parent  8e170309005301ab9a4149846806b5fbde7b3b25
# Parent  1470a9d40072546c390f0dfa89c7cb22d99018c8
Merged.

diff -r 8e1703090053 -r a5195bf5671d 
linux-2.6-xen-sparse/arch/ia64/xen-mkbuildtree-pre
--- a/linux-2.6-xen-sparse/arch/ia64/xen-mkbuildtree-pre        Tue Nov  8 
11:30:38 2005
+++ b/linux-2.6-xen-sparse/arch/ia64/xen-mkbuildtree-pre        Tue Nov  8 
11:31:43 2005
@@ -48,10 +48,10 @@
 cp arch/ia64/xen/drivers/motherboard.c drivers/acpi/motherboard.c
 
 #still a few x86-ism's in various drivers/xen files, patch them
-cd drivers/xen
-if [ ! -e ia64.patch.semaphore ]
-then
-       cat ../../arch/ia64/xen/drivers/patches/* | patch -p1 -b
-fi
-touch ia64.patch.semaphore
-cd ../..
+#cd drivers/xen
+#if [ ! -e ia64.patch.semaphore ]
+#then
+#      cat ../../arch/ia64/xen/drivers/patches/* | patch -p1 -b
+#fi
+#touch ia64.patch.semaphore
+#cd ../..
diff -r 8e1703090053 -r a5195bf5671d linux-2.6-xen-sparse/arch/ia64/xen/Makefile
--- a/linux-2.6-xen-sparse/arch/ia64/xen/Makefile       Tue Nov  8 11:30:38 2005
+++ b/linux-2.6-xen-sparse/arch/ia64/xen/Makefile       Tue Nov  8 11:31:43 2005
@@ -2,4 +2,4 @@
 # Makefile for Xen components
 #
 
-obj-y := hypercall.o xenivt.o xenentry.o xensetup.o xenpal.o xenhpski.o 
xenconsole.o
+obj-y := hypercall.o xenivt.o xenentry.o xensetup.o xenpal.o xenhpski.o 
xenconsole.o xen_ksyms.o
diff -r 8e1703090053 -r a5195bf5671d 
linux-2.6-xen-sparse/arch/ia64/xen/drivers/evtchn_ia64.c
--- a/linux-2.6-xen-sparse/arch/ia64/xen/drivers/evtchn_ia64.c  Tue Nov  8 
11:30:38 2005
+++ b/linux-2.6-xen-sparse/arch/ia64/xen/drivers/evtchn_ia64.c  Tue Nov  8 
11:31:43 2005
@@ -22,6 +22,7 @@
 
     op.cmd = EVTCHNOP_bind_virq;
     op.u.bind_virq.virq = virq;
+    op.u.bind_virq.vcpu = 0;
     if ( HYPERVISOR_event_channel_op(&op) != 0 )
         BUG();
 
diff -r 8e1703090053 -r a5195bf5671d 
linux-2.6-xen-sparse/arch/ia64/xen/drivers/patches/console.c.patch
--- a/linux-2.6-xen-sparse/arch/ia64/xen/drivers/patches/console.c.patch        
Tue Nov  8 11:30:38 2005
+++ b/linux-2.6-xen-sparse/arch/ia64/xen/drivers/patches/console.c.patch        
Tue Nov  8 11:31:43 2005
@@ -1,7 +1,6 @@
-diff -Naur xen/console/console.c xen.patched/console/console.c
---- xen/console/console.c      2005-09-23 10:54:50.000000000 -0600
-+++ xen.patched/console/console.c      2005-09-23 10:57:51.000000000 -0600
-@@ -768,9 +768,16 @@
+--- xen/console/console.c      2005-11-02 14:13:07.000000000 +0100
++++ xen.patched/console/console.c      2005-11-02 14:21:20.000000000 +0100
+@@ -768,9 +771,15 @@
  #endif
  
        if (xen_start_info->flags & SIF_INITDOMAIN) {
@@ -10,8 +9,7 @@
 +              bind_evtchn_to_irqhandler(xencons_priv_irq,
 +                              xencons_priv_interrupt, 0, "console", NULL);
 +#else
-+
-               xencons_priv_irq = bind_virq_to_irq(VIRQ_CONSOLE);
+               xencons_priv_irq = bind_virq_to_irq(VIRQ_CONSOLE, 0);
                (void)request_irq(xencons_priv_irq,
                                  xencons_priv_interrupt, 0, "console", NULL);
 +#endif
diff -r 8e1703090053 -r a5195bf5671d 
linux-2.6-xen-sparse/arch/ia64/xen/drivers/patches/devmem.c.patch
--- a/linux-2.6-xen-sparse/arch/ia64/xen/drivers/patches/devmem.c.patch Tue Nov 
 8 11:30:38 2005
+++ b/linux-2.6-xen-sparse/arch/ia64/xen/drivers/patches/devmem.c.patch Tue Nov 
 8 11:31:43 2005
@@ -1,13 +1,3 @@
 diff -Naur xen/core/devmem.c xen.patched/core/devmem.c
 --- xen/core/devmem.c  2005-09-23 10:54:50.000000000 -0600
 +++ xen.patched/core/devmem.c  2005-09-23 10:57:51.000000000 -0600
-@@ -93,6 +93,9 @@
-       if (uncached_access(file))
-               vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
- 
-+#ifdef __ia64__
-+#define       direct_remap_pfn_range(a,b,c,d,e,f)     
remap_pfn_range(a,b,c,d,e)
-+#endif
-       if (direct_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
-                                  vma->vm_end - vma->vm_start,
-                                  vma->vm_page_prot, DOMID_IO))
diff -r 8e1703090053 -r a5195bf5671d 
linux-2.6-xen-sparse/arch/ia64/xen/drivers/patches/gnttab.c.patch
--- a/linux-2.6-xen-sparse/arch/ia64/xen/drivers/patches/gnttab.c.patch Tue Nov 
 8 11:30:38 2005
+++ b/linux-2.6-xen-sparse/arch/ia64/xen/drivers/patches/gnttab.c.patch Tue Nov 
 8 11:31:43 2005
@@ -1,17 +1,6 @@
 diff -Naur xen/core/gnttab.c xen.patched/core/gnttab.c
 --- xen/core/gnttab.c  2005-09-23 10:54:50.000000000 -0600
 +++ xen.patched/core/gnttab.c  2005-09-23 10:57:51.000000000 -0600
-@@ -19,6 +19,10 @@
- #include <asm-xen/gnttab.h>
- #include <asm/synch_bitops.h>
- 
-+#ifdef __ia64__
-+#define synch_cmpxchg ia64_cmpxchg4_acq
-+#endif
-+
- #if 1
- #define ASSERT(_p)                                                          \
-       if ( !(_p) ) { printk(KERN_ALERT"Assertion '%s': line %d, file %s\n", \
 @@ -346,6 +350,10 @@
        if ( hypercall.op != __HYPERVISOR_grant_table_op )
                return -ENOSYS;
@@ -45,17 +34,6 @@
  
        return 0;
  }
-@@ -434,8 +448,10 @@
- {
-       int i;
- 
-+#ifndef __ia64__
-       for (i = 0; i < NR_GRANT_FRAMES; i++)
-               clear_fixmap(FIX_GNTTAB_END - i);
-+#endif
- 
-       return 0;
- }
 @@ -450,7 +466,9 @@
  
        BUG_ON(gnttab_resume());
diff -r 8e1703090053 -r a5195bf5671d 
linux-2.6-xen-sparse/arch/ia64/xen/drivers/patches/privcmd.c.patch
--- a/linux-2.6-xen-sparse/arch/ia64/xen/drivers/patches/privcmd.c.patch        
Tue Nov  8 11:30:38 2005
+++ b/linux-2.6-xen-sparse/arch/ia64/xen/drivers/patches/privcmd.c.patch        
Tue Nov  8 11:31:43 2005
@@ -1,49 +1,43 @@
 diff -Naur xen/privcmd/privcmd.c xen.patched/privcmd/privcmd.c
 --- xen/privcmd/privcmd.c      2005-09-23 10:54:50.000000000 -0600
 +++ xen.patched/privcmd/privcmd.c      2005-09-23 10:57:51.000000000 -0600
-@@ -134,6 +134,9 @@
-                                   > vma->vm_end )
-                                       return -EINVAL;
+@@ -180,6 +183,15 @@
+               for (i = 0; i < m.num; i++, addr += PAGE_SIZE, p++) {
+                       if (get_user(mfn, p))
+                               return -EFAULT;
++#ifdef __ia64__
++                      ret = remap_pfn_range(vma,
++                                            addr&PAGE_MASK,
++                                            mfn,
++                                            1<<PAGE_SHIFT,
++                                            vma->vm_page_prot);
++                      if (ret < 0)
++                          goto batch_err;
++#else
  
-+#ifdef __ia64__
-+#define       direct_remap_pfn_range(a,b,c,d,e,f) remap_pfn_range(a,b,c,d,e)
+                       ret = create_lookup_pte_addr(vma->vm_mm, addr, &ptep);
+                       if (ret)
+@@ -190,6 +202,7 @@
+ 
+                       if (HYPERVISOR_mmu_update(&u, 1, NULL, m.dom) < 0)
+                               put_user(0xF0000000 | mfn, p);
 +#endif
-                               if ((rc = direct_remap_pfn_range(
-                                       vma,
-                                       msg[j].va&PAGE_MASK, 
-@@ -148,6 +151,7 @@
-       }
-       break;
+               }
  
-+#ifndef __ia64__
-       case IOCTL_PRIVCMD_MMAPBATCH: {
-               mmu_update_t u;
-               privcmd_mmapbatch_t m;
-@@ -206,7 +210,9 @@
-       }
+               ret = 0;
+@@ -205,6 +218,7 @@
        break;
  #endif
-+#endif
  
 +#ifndef __ia64__
        case IOCTL_PRIVCMD_GET_MACH2PHYS_START_MFN: {
                unsigned long m2pv = (unsigned long)machine_to_phys_mapping;
                pgd_t *pgd = pgd_offset_k(m2pv);
-@@ -218,6 +224,7 @@
+@@ -216,6 +230,7 @@
                        -EFAULT: 0;
        }
        break;
 +#endif
  
-       case IOCTL_PRIVCMD_INITDOMAIN_STORE: {
-               extern int do_xenbus_probe(void*);
-@@ -241,6 +248,9 @@
- 
-               /* Initial connect. Setup channel and page. */
-               xen_start_info->store_evtchn = data;
-+#ifdef __ia64__
-+#define       pfn_to_mfn(x)   (x)
-+#endif
-               xen_start_info->store_mfn =
-                       pfn_to_mfn(virt_to_phys((void *)page) >>
-                                  PAGE_SHIFT);
+       default:
+               ret = -EINVAL;
diff -r 8e1703090053 -r a5195bf5671d 
linux-2.6-xen-sparse/arch/ia64/xen/xensetup.S
--- a/linux-2.6-xen-sparse/arch/ia64/xen/xensetup.S     Tue Nov  8 11:30:38 2005
+++ b/linux-2.6-xen-sparse/arch/ia64/xen/xensetup.S     Tue Nov  8 11:31:43 2005
@@ -25,3 +25,9 @@
 (p7)   mov cr.iva=r10
        br.ret.sptk.many rp;;
 END(xen_init)
+
+GLOBAL_ENTRY(is_running_on_xen)
+       movl r9=running_on_xen;;
+       ld4 r8=[r9];;
+       br.ret.sptk.many rp;;
+END(is_running_on_xen)
diff -r 8e1703090053 -r a5195bf5671d 
linux-2.6-xen-sparse/arch/xen/kernel/devmem.c
--- a/linux-2.6-xen-sparse/arch/xen/kernel/devmem.c     Tue Nov  8 11:30:38 2005
+++ b/linux-2.6-xen-sparse/arch/xen/kernel/devmem.c     Tue Nov  8 11:31:43 2005
@@ -26,6 +26,7 @@
 #include <asm/pgalloc.h>
 #include <asm/uaccess.h>
 #include <asm/io.h>
+#include <asm/hypervisor.h>
 
 static inline int uncached_access(struct file *file)
 {
diff -r 8e1703090053 -r a5195bf5671d 
linux-2.6-xen-sparse/arch/xen/kernel/gnttab.c
--- a/linux-2.6-xen-sparse/arch/xen/kernel/gnttab.c     Tue Nov  8 11:30:38 2005
+++ b/linux-2.6-xen-sparse/arch/xen/kernel/gnttab.c     Tue Nov  8 11:31:43 2005
@@ -337,49 +337,7 @@
 #ifdef CONFIG_PROC_FS
 
 static struct proc_dir_entry *grant_pde;
-
-static int
-grant_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
-           unsigned long data)
-{
-       int                     ret;
-       privcmd_hypercall_t     hypercall;
-
-       /*
-        * XXX Need safety checks here if using for anything other
-        *     than debugging.
-        */
-       return -ENOSYS;
-
-       if ( cmd != IOCTL_PRIVCMD_HYPERCALL )
-               return -ENOSYS;
-
-       if ( copy_from_user(&hypercall, (void *)data, sizeof(hypercall)) )
-               return -EFAULT;
-
-       if ( hypercall.op != __HYPERVISOR_grant_table_op )
-               return -ENOSYS;
-
-       /* hypercall-invoking asm taken from privcmd.c */
-       __asm__ __volatile__ (
-               "pushl %%ebx; pushl %%ecx; pushl %%edx; "
-               "pushl %%esi; pushl %%edi; "
-               "movl  4(%%eax),%%ebx ;"
-               "movl  8(%%eax),%%ecx ;"
-               "movl 12(%%eax),%%edx ;"
-               "movl 16(%%eax),%%esi ;"
-               "movl 20(%%eax),%%edi ;"
-               "movl   (%%eax),%%eax ;"
-               TRAP_INSTR "; "
-               "popl %%edi; popl %%esi; popl %%edx; popl %%ecx; popl %%ebx"
-               : "=a" (ret) : "0" (&hypercall) : "memory" );
-
-       return ret;
-}
-
-static struct file_operations grant_file_ops = {
-       ioctl:  grant_ioctl,
-};
+static struct file_operations grant_file_ops;
 
 static int
 grant_read(char *page, char **start, off_t off, int count, int *eof,
@@ -437,8 +395,13 @@
        BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_setup_table, &setup, 1));
        BUG_ON(setup.status != 0);
 
+#ifdef __ia64__
+       shared = __va(frames[0] << PAGE_SHIFT);
+       printk("grant table at %p\n", shared);
+#else
        for (i = 0; i < NR_GRANT_FRAMES; i++)
                set_fixmap(FIX_GNTTAB_END - i, frames[i] << PAGE_SHIFT);
+#endif
 
        return 0;
 }
@@ -464,7 +427,9 @@
 
        BUG_ON(gnttab_resume());
 
+#ifndef __ia64__
        shared = (grant_entry_t *)fix_to_virt(FIX_GNTTAB_END);
+#endif
 
        for (i = NR_RESERVED_ENTRIES; i < NR_GRANT_ENTRIES; i++)
                gnttab_list[i] = i + 1;
diff -r 8e1703090053 -r a5195bf5671d 
linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c
--- a/linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c        Tue Nov  8 
11:30:38 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c        Tue Nov  8 
11:31:43 2005
@@ -13,6 +13,7 @@
 
 #include <linux/spinlock.h>
 #include <asm-xen/balloon.h>
+#include <asm/hypervisor.h>
 #include "common.h"
 
 /*
@@ -30,10 +31,16 @@
 static unsigned long mmap_vstart;
 #define MMAP_PAGES                                             \
        (MAX_PENDING_REQS * BLKIF_MAX_SEGMENTS_PER_REQUEST)
+#ifdef __ia64__
+static void *pending_vaddrs[MMAP_PAGES];
+#define MMAP_VADDR(_idx, _i) \
+       (unsigned long)(pending_vaddrs[((_idx) * 
BLKIF_MAX_SEGMENTS_PER_REQUEST) + (_i)])
+#else
 #define MMAP_VADDR(_req,_seg)                                          \
        (mmap_vstart +                                                  \
         ((_req) * BLKIF_MAX_SEGMENTS_PER_REQUEST * PAGE_SIZE) +        \
         ((_seg) * PAGE_SIZE))
+#endif
 
 /*
  * Each outstanding request that we've passed to the lower device layers has a 
@@ -376,9 +383,13 @@
        for (i = 0; i < nseg; i++) {
                if (likely(map[i].handle >= 0)) {
                        pending_handle(pending_idx, i) = map[i].handle;
+#ifdef __ia64__
+                       MMAP_VADDR(pending_idx,i) = gnttab_map_vaddr(map[i]);
+#else
                        phys_to_machine_mapping[__pa(MMAP_VADDR(
                                pending_idx, i)) >> PAGE_SHIFT] =
                                FOREIGN_FRAME(map[i].dev_bus_addr>>PAGE_SHIFT);
+#endif
                        fas        = req->frame_and_sects[i];
                        seg[i].buf = map[i].dev_bus_addr | 
                                (blkif_first_sect(fas) << 9);
@@ -501,11 +512,27 @@
        for (i = 0; i < MMAP_PAGES; i++)
                pending_grant_handles[i] = BLKBACK_INVALID_HANDLE;
 
+       if (xen_init() < 0)
+               return -ENODEV;
+
        blkif_interface_init();
 
+#ifdef __ia64__
+    {
+       extern unsigned long alloc_empty_foreign_map_page_range(unsigned long 
pages);
+       int i;
+
+       mmap_vstart =  alloc_empty_foreign_map_page_range(MMAP_PAGES);
+       printk("Allocated mmap_vstart: 0x%lx\n", mmap_vstart);
+       for(i = 0; i < MMAP_PAGES; i++)
+           pending_vaddrs[i] = mmap_vstart + (i << PAGE_SHIFT);
+       BUG_ON(mmap_vstart == NULL);
+    }
+#else
        page = balloon_alloc_empty_page_range(MMAP_PAGES);
        BUG_ON(page == NULL);
        mmap_vstart = (unsigned long)pfn_to_kaddr(page_to_pfn(page));
+#endif
 
        pending_cons = 0;
        pending_prod = MAX_PENDING_REQS;
diff -r 8e1703090053 -r a5195bf5671d 
linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c
--- a/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c      Tue Nov  8 
11:30:38 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c      Tue Nov  8 
11:31:43 2005
@@ -49,6 +49,7 @@
 #include <asm-xen/xenbus.h>
 #include <asm-xen/xen-public/grant_table.h>
 #include <asm-xen/gnttab.h>
+#include <asm/hypervisor.h>
 
 #define BLKIF_STATE_DISCONNECTED 0
 #define BLKIF_STATE_CONNECTED    1
@@ -728,6 +729,9 @@
 
 static int __init xlblk_init(void)
 {
+       if (xen_init() < 0)
+               return -ENODEV;
+
        xenbus_register_driver(&blkfront);
        return 0;
 }
diff -r 8e1703090053 -r a5195bf5671d 
linux-2.6-xen-sparse/drivers/xen/console/console.c
--- a/linux-2.6-xen-sparse/drivers/xen/console/console.c        Tue Nov  8 
11:30:38 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/console/console.c        Tue Nov  8 
11:31:43 2005
@@ -196,6 +196,9 @@
 void xen_console_init(void)
 #endif
 {
+       if (xen_init() < 0)
+               return __RETCODE;
+
        if (xen_start_info->flags & SIF_INITDOMAIN) {
                if (xc_mode == XC_DEFAULT)
                        xc_mode = XC_SERIAL;
@@ -768,9 +771,15 @@
 #endif
 
        if (xen_start_info->flags & SIF_INITDOMAIN) {
+#ifdef __ia64__
+               xencons_priv_irq = bind_virq_to_evtchn(VIRQ_CONSOLE);
+               bind_evtchn_to_irqhandler(xencons_priv_irq,
+                               xencons_priv_interrupt, 0, "console", NULL);
+#else
                xencons_priv_irq = bind_virq_to_irq(VIRQ_CONSOLE, 0);
                (void)request_irq(xencons_priv_irq,
                                  xencons_priv_interrupt, 0, "console", NULL);
+#endif
        } else {
                xencons_ring_register_receiver(xencons_rx);
        }
diff -r 8e1703090053 -r a5195bf5671d 
linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c
--- a/linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c        Tue Nov  8 
11:30:38 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c        Tue Nov  8 
11:31:43 2005
@@ -20,6 +20,7 @@
 #include <linux/pagemap.h>
 #include <linux/seq_file.h>
 #include <linux/kthread.h>
+#include <asm/hypervisor.h>
 
 #include <asm/pgalloc.h>
 #include <asm/pgtable.h>
@@ -180,6 +181,15 @@
                for (i = 0; i < m.num; i++, addr += PAGE_SIZE, p++) {
                        if (get_user(mfn, p))
                                return -EFAULT;
+#ifdef __ia64__
+                       ret = remap_pfn_range(vma,
+                                             addr&PAGE_MASK,
+                                             mfn,
+                                             1<<PAGE_SHIFT,
+                                             vma->vm_page_prot);
+                       if (ret < 0)
+                           goto batch_err;
+#else
 
                        ret = create_lookup_pte_addr(vma->vm_mm, addr, &ptep);
                        if (ret)
@@ -190,6 +200,7 @@
 
                        if (HYPERVISOR_mmu_update(&u, 1, NULL, m.dom) < 0)
                                put_user(0xF0000000 | mfn, p);
+#endif
                }
 
                ret = 0;
@@ -205,6 +216,7 @@
        break;
 #endif
 
+#ifndef __ia64__
        case IOCTL_PRIVCMD_GET_MACH2PHYS_START_MFN: {
                unsigned long m2pv = (unsigned long)machine_to_phys_mapping;
                pgd_t *pgd = pgd_offset_k(m2pv);
@@ -216,6 +228,7 @@
                        -EFAULT: 0;
        }
        break;
+#endif
 
        default:
                ret = -EINVAL;
diff -r 8e1703090053 -r a5195bf5671d 
linux-2.6-xen-sparse/include/asm-ia64/xen/privop.h
--- a/linux-2.6-xen-sparse/include/asm-ia64/xen/privop.h        Tue Nov  8 
11:30:38 2005
+++ b/linux-2.6-xen-sparse/include/asm-ia64/xen/privop.h        Tue Nov  8 
11:31:43 2005
@@ -36,7 +36,12 @@
 #endif
 
 #ifndef __ASSEMBLY__
+#ifdef MODULE
+extern int is_running_on_xen(void);
+#define running_on_xen (is_running_on_xen())
+#else
 extern int running_on_xen;
+#endif
 
 #define        XEN_HYPER_SSM_I                 asm("break 0x7");
 #define        XEN_HYPER_GET_IVR               asm("break 0x8");
diff -r 8e1703090053 -r a5195bf5671d 
linux-2.6-xen-sparse/include/asm-xen/asm-ia64/fixmap.h
--- a/linux-2.6-xen-sparse/include/asm-xen/asm-ia64/fixmap.h    Tue Nov  8 
11:30:38 2005
+++ b/linux-2.6-xen-sparse/include/asm-xen/asm-ia64/fixmap.h    Tue Nov  8 
11:31:43 2005
@@ -1,1 +1,2 @@
-/* empty */
+#define clear_fixmap(x)        do {} while (0)
+#define        set_fixmap(x,y) do {} while (0)
diff -r 8e1703090053 -r a5195bf5671d 
linux-2.6-xen-sparse/include/asm-xen/asm-ia64/synch_bitops.h
--- a/linux-2.6-xen-sparse/include/asm-xen/asm-ia64/synch_bitops.h      Tue Nov 
 8 11:30:38 2005
+++ b/linux-2.6-xen-sparse/include/asm-xen/asm-ia64/synch_bitops.h      Tue Nov 
 8 11:31:43 2005
@@ -51,6 +51,8 @@
     return test_bit(nr, addr);
 }
 
+#define synch_cmpxchg  ia64_cmpxchg4_acq
+
 #define synch_test_bit(nr,addr) \
 (__builtin_constant_p(nr) ? \
  synch_const_test_bit((nr),(addr)) : \
diff -r 8e1703090053 -r a5195bf5671d tools/examples/Makefile
--- a/tools/examples/Makefile   Tue Nov  8 11:30:38 2005
+++ b/tools/examples/Makefile   Tue Nov  8 11:31:43 2005
@@ -26,14 +26,14 @@
 XEN_SCRIPTS += network-nat vif-nat
 XEN_SCRIPTS += block
 XEN_SCRIPTS += block-enbd block-nbd
-XEN_SCRIPTS += xen-script-common.sh
-XEN_SCRIPTS += xen-hotplug-common.sh xen-network-common.sh vif-common.sh
-XEN_SCRIPTS += block-common.sh
+XEN_SCRIPT_DATA = xen-script-common.sh
+XEN_SCRIPT_DATA += xen-hotplug-common.sh xen-network-common.sh vif-common.sh
+XEN_SCRIPT_DATA += block-common.sh
 
 XEN_HOTPLUG_DIR = /etc/hotplug
 XEN_HOTPLUG_SCRIPTS = xen-backend.agent
 
-UDEV_RULES_DIR = /etc/udev/rules.d
+UDEV_RULES_DIR = /etc/udev
 UDEV_RULES = xen-backend.rules
 
 DI = $(shell readlink -f $(DISTDIR))
@@ -77,6 +77,10 @@
            do \
            $(INSTALL_PROG) $$i $(DESTDIR)$(XEN_SCRIPT_DIR); \
        done
+       for i in $(XEN_SCRIPT_DATA); \
+           do \
+           $(INSTALL_DATA) $$i $(DESTDIR)$(XEN_SCRIPT_DIR); \
+       done
 
 install-hotplug:
        [ -d $(DESTDIR)$(XEN_HOTPLUG_DIR) ] || \
@@ -88,10 +92,12 @@
 
 install-udev:
        [ -d $(DESTDIR)$(UDEV_RULES_DIR) ] || \
-               $(INSTALL_DIR) $(DESTDIR)$(UDEV_RULES_DIR)
+               $(INSTALL_DIR) $(DESTDIR)$(UDEV_RULES_DIR)/rules.d
        for i in $(UDEV_RULES); \
            do \
-           $(INSTALL_PROG) $$i $(DESTDIR)$(UDEV_RULES_DIR); \
+           $(INSTALL_DATA) $$i $(DESTDIR)$(UDEV_RULES_DIR); \
+           ( cd $(DESTDIR)$(UDEV_RULES_DIR)/rules.d ; \
+               ln -sf ../$$i . ) \
        done
 
 clean:
diff -r 8e1703090053 -r a5195bf5671d tools/examples/README
--- a/tools/examples/README     Tue Nov  8 11:30:38 2005
+++ b/tools/examples/README     Tue Nov  8 11:31:43 2005
@@ -9,20 +9,29 @@
 send it (preferably with a little summary to go in this file) to
 <xen-devel@xxxxxxxxxxxxxxxxxxxxx> so we can add it to this directory.
 
+block               - called by xen-backend.agent to bind/unbind dev  
+block-common.sh     - sourced by block, block-*
 block-enbd          - binds/unbinds network block devices
-block-file          - binds/unbinds file to loopback device
-mem-map.sxp         - memory map xend configuration file.
-network             - default network setup script called by xend at startup.
-network-route       - default xen network start/stop script.
-network-nat         - default xen network start/stop script when using NAT.
-vif-bridge          - default virtual network interface setup script.
-vif-route           - default xen virtual network start/stop script
-vif-nat             - configures vif in routed-nat mode.
-xend-config.sxp     - default xend configuration file.
-xmexample1          - example configuration script for 'xm create'.
-xmexample2          - a more complex configuration script for 'xm create'.
+block-nbd           - binds/unbinds network block devices
+network-bridge      - xen network start/stop script when using bridging
+network-nat         - xen network start/stop script when using NAT
+network-route       - xen network start/stop script when using routing
+vif-bridge          - virtual network start/stop script in bridged mode
+vif-common.sh       - sourced by vif-bridge 
+vif-nat             - xen virtual network start/stop script in NAT mode 
+vif-route           - xen virtual network start/stop script in routed mode
+xen-backend.agent   - calls block, vif-* scripts to add, remove, hotplug 
+                      devices  
+xen-backend.rules   - hotplug script rules
+xend-config.sxp     - default xend configuration file
+xen-hotplug-common.sh - sourced by vif-common.sh
+xen-network-common.sh - sourced by vif-common.sh
+xen-script-common.sh  - sourced by network-bridge, xen-hotplug-common.sh
+xmexample1          - example configuration script for 'xm create'
+xmexample2          - a more complex configuration script for 'xm create'
 xmexample3          - an advanced configuration script for 'xm create' 
-                      that utilizes the vmid.
+                      that utilizes the vmid
+xmexample.nbd       - configuration script that uses NBD filesystems
 xmexample.vmx       - a configuration script for creating a vmx domain with
-                      'xm create'.
-
+                      'xm create'
+xmexample.vti       - a configuration script for creating a domain on vti
diff -r 8e1703090053 -r a5195bf5671d tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py    Tue Nov  8 11:30:38 2005
+++ b/tools/python/xen/xend/image.py    Tue Nov  8 11:31:43 2005
@@ -24,6 +24,7 @@
 from xen.xend import sxp
 from xen.xend.XendError import VmError
 from xen.xend.XendLogging import log
+from xen.xend.server.netif import randomMAC
 
 
 xc = xen.lowlevel.xc.new()
@@ -276,6 +277,8 @@
                ret.append("%s" % vbdparam)
             if name == 'vif':
                mac = sxp.child_value(info, 'mac')
+               if mac == None:
+                   mac = randomMAC()
                ret.append("-macaddr")
                ret.append("%s" % mac)
             if name == 'vtpm':
diff -r 8e1703090053 -r a5195bf5671d tools/xenstore/Makefile
--- a/tools/xenstore/Makefile   Tue Nov  8 11:30:38 2005
+++ b/tools/xenstore/Makefile   Tue Nov  8 11:31:43 2005
@@ -77,7 +77,7 @@
 clean: testsuite-clean
        rm -f *.o *.opic *.so
        rm -f xenstored xs_random xs_stress xs_crashme
-       rm -f xs_test xenstored_test xs_tdb_dump
+       rm -f xs_test xenstored_test xs_tdb_dump xsls $(CLIENTS)
        $(RM) $(PROG_DEP)
 
 print-dir:
diff -r 8e1703090053 -r a5195bf5671d xen/arch/ia64/linux-xen/efi.c
--- a/xen/arch/ia64/linux-xen/efi.c     Tue Nov  8 11:30:38 2005
+++ b/xen/arch/ia64/linux-xen/efi.c     Tue Nov  8 11:31:43 2005
@@ -24,7 +24,6 @@
 #include <linux/init.h>
 #include <linux/types.h>
 #include <linux/time.h>
-#include <linux/efi.h>
 
 #include <asm/io.h>
 #include <asm/kregs.h>
@@ -32,6 +31,8 @@
 #include <asm/pgtable.h>
 #include <asm/processor.h>
 #include <asm/mca.h>
+
+#include <linux/efi.h>
 
 #define EFI_DEBUG      0
 
diff -r 8e1703090053 -r a5195bf5671d xen/arch/ia64/linux-xen/mm_contig.c
--- a/xen/arch/ia64/linux-xen/mm_contig.c       Tue Nov  8 11:30:38 2005
+++ b/xen/arch/ia64/linux-xen/mm_contig.c       Tue Nov  8 11:31:43 2005
@@ -16,7 +16,6 @@
  */
 #include <linux/config.h>
 #include <linux/bootmem.h>
-#include <linux/efi.h>
 #include <linux/mm.h>
 #include <linux/swap.h>
 
@@ -26,6 +25,7 @@
 #include <asm/sections.h>
 #include <asm/mca.h>
 
+#include <linux/efi.h>
 #ifdef CONFIG_VIRTUAL_MEM_MAP
 static unsigned long num_dma_physpages;
 #endif
diff -r 8e1703090053 -r a5195bf5671d xen/arch/ia64/xen/hypercall.c
--- a/xen/arch/ia64/xen/hypercall.c     Tue Nov  8 11:30:38 2005
+++ b/xen/arch/ia64/xen/hypercall.c     Tue Nov  8 11:31:43 2005
@@ -187,6 +187,10 @@
                regs->r8 = do_console_io(regs->r14, regs->r15, regs->r16);
                break;
 
+           case __HYPERVISOR_xen_version:
+               regs->r8 = do_xen_version(regs->r14, regs->r15);
+               break;
+
            default:
                printf("unknown hypercall %x\n", regs->r2);
                regs->r8 = (unsigned long)-1;
diff -r 8e1703090053 -r a5195bf5671d xen/arch/ia64/xen/hyperprivop.S
--- a/xen/arch/ia64/xen/hyperprivop.S   Tue Nov  8 11:30:38 2005
+++ b/xen/arch/ia64/xen/hyperprivop.S   Tue Nov  8 11:31:43 2005
@@ -14,6 +14,7 @@
 #include <asm/system.h>
 #include <public/arch-ia64.h>
 
+
 #define        _PAGE_PPN_MASK  0x0003fffffffff000 //asm/pgtable.h doesn't do 
assembly
 #define PAGE_PHYS      0x0010000000000761 
//__pgprot(__DIRTY_BITS|_PAGE_PL_2|_PAGE_AR_RWX)
 #define _PAGE_PL_2     (2<<7)
@@ -22,13 +23,14 @@
 #define FAST_HYPERPRIVOPS
 #define FAST_HYPERPRIVOP_CNT
 #define FAST_REFLECT_CNT
-//#define FAST_TICK
+//#define FAST_TICK // mostly working (unat problems) but default off for now
+//#define FAST_TLB_MISS_REFLECT        // mostly working but default off for 
now
+//#define FAST_ITC     // working but default off for now
 #define FAST_BREAK
 #define FAST_ACCESS_REFLECT
 #define FAST_RFI
 #define FAST_SSM_I
 #define FAST_PTC_GA
-#undef FAST_ITC        // working but default off for now
 #undef RFI_TO_INTERRUPT // not working yet
 #endif
 
@@ -57,7 +59,7 @@
 #endif
 
 // FIXME: turn off for now... but NaTs may crash Xen so re-enable soon!
-//#define HANDLE_AR_UNAT
+#define HANDLE_AR_UNAT
 
 // FIXME: This is defined in include/asm-ia64/hw_irq.h but this
 // doesn't appear to be include'able from assembly?
@@ -495,19 +497,29 @@
        .mem.offset 0,0; st8.spill [r2]=r30,16;
        .mem.offset 8,0; st8.spill [r3]=r31,16 ;;
 #ifdef HANDLE_AR_UNAT
-       // bank0 regs have no NaT bit, so ensure they are NaT clean
-       mov r16=r0; mov r17=r0; mov r18=r0; mov r19=r0;
-       mov r20=r0; mov r21=r0; mov r22=r0; mov r23=r0;
-       mov r24=r0; mov r25=r0; mov r26=r0; mov r27=r0;
-       mov r28=r0; mov r29=r0; mov r30=r0; movl r31=XSI_IPSR;;
-#endif
-       bsw.0 ;;
-       mov r2=r30; mov r3=r29;;
+       // r16~r23 are preserved regsin bank0 regs, we need to restore them,
+    // r24~r31 are scratch regs, we don't need to handle NaT bit,
+    // because OS handler must assign it before access it
+    ld8 r16=[r2],16;
+    ld8 r17=[r3],16;;
+    ld8 r18=[r2],16;
+    ld8 r19=[r3],16;;
+    ld8 r20=[r2],16;
+    ld8 r21=[r3],16;;
+    ld8 r22=[r2],16;
+    ld8 r23=[r3],16;;
+#endif
+    movl r31=XSI_IPSR;;
+    bsw.0 ;;
+    mov r24=ar.unat;
+    mov r2=r30; mov r3=r29;;
 #ifdef HANDLE_AR_UNAT
-       mov ar.unat=r28;
-#endif
-       adds r20=XSI_BANKNUM_OFS-XSI_PSR_IC_OFS,r18 ;;
-       st4 [r20]=r0 ;;
+    mov ar.unat=r28;
+#endif
+    adds r25=XSI_B1NATS_OFS-XSI_PSR_IC_OFS,r18 ;
+    adds r20=XSI_BANKNUM_OFS-XSI_PSR_IC_OFS,r18 ;;
+    st8 [r25]=r24;
+    st4 [r20]=r0 ;;
 fast_tick_reflect_done:
        mov pr=r31,-1 ;;
        rfi
@@ -649,19 +661,28 @@
        .mem.offset 0,0; st8.spill [r2]=r30,16;
        .mem.offset 8,0; st8.spill [r3]=r31,16 ;;
 #ifdef HANDLE_AR_UNAT
-       // bank0 regs have no NaT bit, so ensure they are NaT clean
-       mov r16=r0; mov r17=r0; mov r18=r0; mov r19=r0;
-       mov r20=r0; mov r21=r0; mov r22=r0; mov r23=r0;
-       mov r24=r0; mov r25=r0; mov r26=r0; mov r27=r0;
-       mov r28=r0; mov r29=r0; mov r30=r0; movl r31=XSI_IPSR;;
+       // r16~r23 are preserved regsin bank0 regs, we need to restore them,
+    // r24~r31 are scratch regs, we don't need to handle NaT bit,
+    // because OS handler must assign it before access it
+       ld8 r16=[r2],16;
+    ld8 r17=[r3],16;;
+    ld8 r18=[r2],16;
+    ld8 r19=[r3],16;;
+       ld8 r20=[r2],16;
+    ld8 r21=[r3],16;;
+    ld8 r22=[r2],16;
+    ld8 r23=[r3],16;;
 #endif
        movl r31=XSI_IPSR;;
        bsw.0 ;;
+    mov r24=ar.unat;
        mov r2=r30; mov r3=r29;;
 #ifdef HANDLE_AR_UNAT
        mov ar.unat=r28;
 #endif
+    adds r25=XSI_B1NATS_OFS-XSI_PSR_IC_OFS,r18 ;
        adds r20=XSI_BANKNUM_OFS-XSI_PSR_IC_OFS,r18 ;;
+    st8 [r25]=r24;
        st4 [r20]=r0 ;;
        mov pr=r31,-1 ;;
        rfi
@@ -705,6 +726,251 @@
        st8 [r23]=r22;;
        br.cond.sptk.many fast_reflect;;
 
+// when we get to here, VHPT_CCHAIN_LOOKUP has failed and everything
+// is as it was at the time of original miss.  We want to preserve that
+// so if we get a nested fault, we can just branch to page_fault
+GLOBAL_ENTRY(fast_tlb_miss_reflect)
+#ifndef FAST_TLB_MISS_REFLECT // see beginning of file
+       br.spnt.few page_fault ;;
+#endif
+       mov r31=pr
+       mov r30=cr.ipsr
+       mov r29=cr.iip
+       mov r16=cr.isr
+       mov r17=cr.ifa;;
+       // for now, always take slow path for region 0 (e.g. metaphys mode)
+       extr.u r21=r17,61,3;;
+       cmp.eq p7,p0=r0,r21
+(p7)   br.spnt.few page_fault ;;
+       // always take slow path for PL0 (e.g. __copy_from_user)
+       extr.u r21=r30,IA64_PSR_CPL0_BIT,2 ;;
+       cmp.eq p7,p0=r21,r0
+(p7)   br.spnt.few page_fault ;;
+       // slow path if strange ipsr or isr bits set
+       extr.u r21=r30,IA64_PSR_BE_BIT,1 ;;
+       cmp.ne p7,p0=r21,r0
+(p7)   br.spnt.few page_fault ;;
+       extr.u r21=r30,IA64_PSR_PP_BIT,1 ;;
+       cmp.ne p7,p0=r21,r0
+(p7)   br.spnt.few page_fault ;;
+       movl r21=IA64_ISR_IR|IA64_ISR_SP|IA64_ISR_NA ;;
+       and r21=r16,r21;;
+       cmp.ne p7,p0=r0,r21
+(p7)   br.spnt.few page_fault ;;
+       // also take slow path if virtual psr.ic=0
+       movl r18=XSI_PSR_IC;;
+       ld4 r21=[r18];;
+       cmp.eq p7,p0=r0,r21
+(p7)   br.spnt.few page_fault ;;
+       // OK, if we get to here, we are doing a fast vcpu_translate.  Need to:
+       // 1) look in the virtual TR's (pinned), if not there
+       // 2) look in the 1-entry TLB (pinned), if not there
+       // 3) check the domain VHPT (NOT pinned, accesses domain memory!)
+       // If we find it in any of these places, we need to effectively do
+       // a hyper_itc_i/d
+
+       // short-term hack for now, if in region 5-7, take slow path
+       // since all Linux TRs are in region 5 or 7, we need not check TRs
+       extr.u r21=r17,61,3;;
+       cmp.le p7,p0=5,r21
+(p7)   br.spnt.few page_fault ;;
+fast_tlb_no_tr_match:
+       movl r27=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;;
+       ld8 r27=[r27];;
+       tbit.nz p6,p7=r16,IA64_ISR_X_BIT;;
+(p6)   adds r25=IA64_VCPU_ITLB_OFFSET,r27;;
+(p7)   adds r25=IA64_VCPU_DTLB_OFFSET,r27;;
+       ld8 r20=[r25],8;;
+       tbit.z p7,p0=r20,0;;    // present?
+(p7)   br.cond.spnt.few 1f;;
+       // if ifa is in range of tlb, don't bother to check rid, go slow path
+       ld8 r21=[r25],8;;
+       mov r23=1
+       extr.u r21=r21,2,6;;
+       shl r22=r23,r21
+       ld8 r21=[r25],8;;
+       cmp.ltu p7,p0=r17,r21
+(p7)   br.cond.sptk.many 1f;
+       add r21=r22,r21;;
+       cmp.ltu p7,p0=r17,r21
+(p7)   br.cond.spnt.few page_fault;;
+       
+1:     // check the guest VHPT
+       adds r19 = XSI_PTA_OFS-XSI_PSR_IC_OFS, r18;;
+       ld8 r19=[r19];;
+       tbit.nz p7,p0=r19,IA64_PTA_VF_BIT;;     // long format VHPT
+(p7)   br.cond.spnt.few page_fault;;
+       // if (!rr.ve || !(pta & IA64_PTA_VE)) take slow way for now
+       // FIXME: later, we deliver an alt_d/i vector after thash and itir
+       tbit.z p7,p0=r19,IA64_PTA_VE_BIT;;      // 
+(p7)   br.cond.spnt.few page_fault;;
+       extr.u r25=r17,61,3;;
+       adds r21=XSI_RR0_OFS-XSI_PSR_IC_OFS,r18 ;;
+       shl r25=r25,3;;
+       add r21=r21,r25;;
+       ld8 r22=[r21];;
+       tbit.z p7,p0=r22,0
+(p7)   br.cond.spnt.few page_fault;;
+
+       // compute and save away itir (r22 & RR_PS_MASK)
+       movl r21=0xfc;;
+       and r22=r22,r21;;
+       adds r21=XSI_ITIR_OFS-XSI_PSR_IC_OFS,r18 ;;
+       st8 [r21]=r22;;
+       
+       // save away ifa
+       adds r21=XSI_IFA_OFS-XSI_PSR_IC_OFS,r18 ;;
+       st8 [r21]=r17;;
+       // see vcpu_thash to save away iha
+       shr.u r20 = r17, 61
+       addl r25 = 1, r0
+       movl r30 = 0xe000000000000000
+       ;;
+       and r21 = r30, r17              // VHPT_Addr1
+       ;;
+       shladd r28 = r20, 3, r18
+       adds r19 = XSI_PTA_OFS-XSI_PSR_IC_OFS, r18
+       ;;
+       adds r27 = XSI_RR0_OFS-XSI_PSR_IC_OFS, r28
+       addl r28 = 32767, r0
+       ld8 r24 = [r19]                 // pta
+       ;;
+       ld8 r23 = [r27]                 // rrs[vadr>>61]
+       extr.u r26 = r24, 2, 6
+       ;;
+       extr.u r22 = r23, 2, 6
+       shl r30 = r25, r26
+       ;;
+       shr.u r19 = r17, r22
+       shr.u r29 = r24, 15
+       ;;
+       adds r30 = -1, r30
+       ;;
+       shladd r27 = r19, 3, r0
+       extr.u r26 = r30, 15, 46
+       ;;
+       andcm r24 = r29, r26
+       and r19 = r28, r27
+       shr.u r25 = r27, 15
+       ;;
+       and r23 = r26, r25
+       ;;
+       or r22 = r24, r23
+       ;;
+       dep.z r20 = r22, 15, 46
+       ;;
+       or r30 = r20, r21
+       ;;
+       //or r8 = r19, r30
+       or r19 = r19, r30
+       ;;
+       adds r23=XSI_IHA_OFS-XSI_PSR_IC_OFS,r18 ;;
+       st8 [r23]=r19;;
+       // done with thash, check guest VHPT
+
+       adds r20 = XSI_PTA_OFS-XSI_PSR_IC_OFS, r18;;
+       ld8 r24 = [r20];;                       // pta
+       // avoid recursively walking the VHPT
+       // if (((r17=address ^ r24=pta) & ((itir_mask(pta) << 3) >> 3)) != 0) {
+       mov r20=-8
+       xor r21=r17,r24
+       extr.u r24=r24,2,6;;
+       shl r20=r20,r24;;
+       shr.u r20=r20,3;;
+       and r21=r20,r21;;
+       cmp.eq p7,p0=r21,r0
+(p7)   br.cond.spnt.few 1f;;
+       // __copy_from_user(&pte, r19=(void *)(*iha), sizeof(pte)=8)
+       // prepare for possible nested dtlb fault
+       mov r29=b0
+       movl r30=guest_vhpt_miss;;
+       // now go fetch the entry from the guest VHPT
+       ld8 r20=[r19];;
+       // if we wind up here, we successfully loaded the VHPT entry
+
+       // this VHPT walker aborts on non-present pages instead
+       // of inserting a not-present translation, this allows
+       // vectoring directly to the miss handler
+       tbit.z p7,p0=r20,0
+(p7)   br.cond.spnt.few page_not_present;;
+
+#ifdef FAST_REFLECT_CNT
+       movl r21=fast_vhpt_translate_count;;
+       ld8 r22=[r21];;
+       adds r22=1,r22;;
+       st8 [r21]=r22;;
+#endif
+
+// prepare for fast_insert(PSCB(ifa),PSCB(itir),r16=pte)
+//     r16 == pte
+//     r17 == bit0: 1=inst, 0=data; bit1: 1=itc, 0=vcpu_translate
+//     r18 == XSI_PSR_IC_OFS
+//     r24 == ps
+//     r29 == saved value of b0 in case of recovery
+//     r30 == recovery ip if failure occurs
+//     r31 == pr
+       tbit.nz p6,p7=r16,IA64_ISR_X_BIT;;
+(p6)   mov r17=1;;
+(p7)   mov r17=0;;
+       mov r16=r20
+       mov r29=b0 ;;
+       movl r30=recover_and_page_fault ;;
+       adds r21=XSI_ITIR_OFS-XSI_PSR_IC_OFS,r18 ;;
+       ld8 r24=[r21];;
+       extr.u r24=r24,2,6;;
+       // IFA already in PSCB
+       br.cond.sptk.many fast_insert;;
+
+// we get here if fast_insert fails (e.g. due to metaphysical lookup)
+ENTRY(recover_and_page_fault)
+#ifdef FAST_REFLECT_CNT
+       movl r21=recover_to_page_fault_count;;
+       ld8 r22=[r21];;
+       adds r22=1,r22;;
+       st8 [r21]=r22;;
+#endif
+       mov b0=r29;;
+       br.cond.sptk.many page_fault;;
+
+// if we wind up here, we missed in guest VHPT so recover
+// from nested dtlb fault and reflect a tlb fault to the guest
+guest_vhpt_miss:
+       mov b0=r29;;
+       // fault = IA64_VHPT_FAULT
+       mov r20=r0
+       br.cond.sptk.many 1f;
+
+       // if we get to here, we are ready to reflect
+       // need to set up virtual ifa, iha, itir (fast_reflect handles
+       // virtual isr, iip, ipsr, ifs
+       // see vcpu_get_itir_on_fault: get ps,rid,(FIXME key) from rr[ifa]
+page_not_present:
+       tbit.nz p6,p7=r16,IA64_ISR_X_BIT;;
+(p6)   movl r20=0x400;;
+(p7)   movl r20=0x800;;
+
+1:     extr.u r25=r17,61,3;;
+       adds r21=XSI_RR0_OFS-XSI_PSR_IC_OFS,r18 ;;
+       shl r25=r25,3;;
+       add r21=r21,r25;;
+       ld8 r22=[r21];;
+       extr.u r22=r22,2,30;;
+       dep.z r22=r22,2,30;;
+       adds r23=XSI_ITIR_OFS-XSI_PSR_IC_OFS,r18 ;;
+       st8 [r23]=r22;;
+
+       // fast reflect expects
+       //      r16 == cr.isr
+       //      r18 == XSI_PSR_IC
+       //      r20 == offset into ivt
+       //      r29 == iip
+       //      r30 == ipsr
+       //      r31 == pr
+       //mov r16=cr.isr
+       mov r29=cr.iip
+       mov r30=cr.ipsr
+       br.sptk.many fast_reflect;;
+END(fast_tlb_miss_reflect)
 
 // ensure that, if giving up, registers at entry to fast_hyperprivop unchanged
 ENTRY(hyper_rfi)
@@ -807,6 +1073,7 @@
        // OK, now all set to go except for switch to virtual bank1
        mov r22=1;; st4 [r20]=r22;
        mov r30=r2; mov r29=r3;;
+    mov r17=ar.unat;;
     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;;
@@ -832,6 +1099,7 @@
        .mem.offset 8,0; ld8.fill r30=[r2],16 ;
        .mem.offset 8,0; ld8.fill r31=[r3],16 ;;
        bsw.0 ;;
+    mov ar.unat=r17;;
        mov r2=r30; mov r3=r29;;
 1:     mov pr=r31,-1
        ;;
@@ -1485,7 +1753,7 @@
        adds r21=XSI_KR0_OFS-XSI_PSR_IC_OFS,r18 ;;
        shl r20=r8,3;;
        add r22=r20,r21;;
-       st8 [r21]=r9;;
+       st8 [r22]=r9;;
        cmp.eq p7,p0=r8,r0
        adds r8=-1,r8;;
 (p7)   mov ar0=r9;;
@@ -1671,6 +1939,17 @@
        ;;
 END(hyper_ptc_ga)
 
+// recovery block for hyper_itc metaphysical memory lookup
+ENTRY(recover_and_dispatch_break_fault)
+#ifdef FAST_REFLECT_CNT
+       movl r21=recover_to_break_fault_count;;
+       ld8 r22=[r21];;
+       adds r22=1,r22;;
+       st8 [r21]=r22;;
+#endif
+       mov b0=r29 ;;
+       br.sptk.many dispatch_break_fault;;
+
 //  Registers at entry
 //     r17 = break immediate (XEN_HYPER_ITC_D or I)
 //     r18 == XSI_PSR_IC_OFS
@@ -1680,24 +1959,14 @@
        // fall through, hyper_itc_d handles both i and d
 ENTRY(hyper_itc_d)
 #ifndef FAST_ITC
-       br.spnt.many dispatch_break_fault ;;
-#endif
+       br.sptk.many dispatch_break_fault ;;
+#endif
+       // ensure itir.ps >= xen's pagesize
        adds r23=XSI_ITIR_OFS-XSI_PSR_IC_OFS,r18 ;;
        ld8 r23=[r23];;
        extr.u r24=r23,2,6;;            // r24==logps
        cmp.gt p7,p0=PAGE_SHIFT,r24
 (p7)   br.spnt.many dispatch_break_fault ;;
-       // translate_domain_pte(r8=pteval,PSCB(ifa)=address,r24=itir)
-       mov r19=1;;
-       shl r20=r19,r24;;
-       adds r20=-1,r20;;       // r20 == mask
-       movl r19=_PAGE_PPN_MASK;;
-       and r22=r8,r19;;        // r22 == pteval & _PAGE_PPN_MASK
-       andcm r19=r22,r20;;
-       adds r21=XSI_IFA_OFS-XSI_PSR_IC_OFS,r18 ;;
-       ld8 r21=[r21];;
-       and r20=r21,r20;;
-       or r19=r19,r20;;        // r19 == mpaddr
        movl r27=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;;
        ld8 r27=[r27];;
        adds r27=IA64_VCPU_DOMAIN_OFFSET,r27;;
@@ -1708,7 +1977,6 @@
 // FIXME: for now, only handle dom0 (see lookup_domain_mpa below)
        cmp.ne p7,p0=r27,r28
 (p7)   br.spnt.many dispatch_break_fault ;;
-       // if region 6, go slow way
 #ifdef FAST_HYPERPRIVOP_CNT
        cmp.eq p6,p7=XEN_HYPER_ITC_D,r17;;
 (p6)   movl r20=fast_hyperpriv_cnt+(8*XEN_HYPER_ITC_D);;
@@ -1717,19 +1985,47 @@
        adds r21=1,r21;;
        st8 [r20]=r21;;
 #endif
+(p6)   mov r17=2;;
+(p7)   mov r17=3;;
+       mov r29=b0 ;;
+       movl r30=recover_and_dispatch_break_fault ;;
+       mov r16=r8;;
+       // fall through
+
+
+// fast_insert(PSCB(ifa),r24=ps,r16=pte)
+//     r16 == pte
+//     r17 == bit0: 1=inst, 0=data; bit1: 1=itc, 0=vcpu_translate
+//     r18 == XSI_PSR_IC_OFS
+//     r24 == ps
+//     r29 == saved value of b0 in case of recovery
+//     r30 == recovery ip if failure occurs
+//     r31 == pr
+GLOBAL_ENTRY(fast_insert)
+       // translate_domain_pte(r16=pteval,PSCB(ifa)=address,r24=itir)
+       mov r19=1;;
+       shl r20=r19,r24;;
+       adds r20=-1,r20;;       // r20 == mask
+       movl r19=_PAGE_PPN_MASK;;
+       and r22=r16,r19;;       // r22 == pteval & _PAGE_PPN_MASK
+       andcm r19=r22,r20;;
+       adds r21=XSI_IFA_OFS-XSI_PSR_IC_OFS,r18 ;;
+       ld8 r21=[r21];;
+       and r20=r21,r20;;
+       or r19=r19,r20;;        // r19 == mpaddr
 // FIXME: for now, just do domain0 and skip mpaddr range checks
        dep r20=r0,r19,0,PAGE_SHIFT
        movl r21=PAGE_PHYS ;;
        or r20=r20,r21 ;;       // r20==return value from lookup_domain_mpa
-       // r8=pteval,r20=pteval2
+       // r16=pteval,r20=pteval2
        movl r19=_PAGE_PPN_MASK
        movl r21=_PAGE_PL_2;;
-       andcm r25=r8,r19;;      // r25==pteval & ~_PAGE_PPN_MASK
+       andcm r25=r16,r19;;     // r25==pteval & ~_PAGE_PPN_MASK
        and r22=r20,r19;;
        or r22=r22,r21;;
        or r22=r22,r25;;        // r22==return value from translate_domain_pte
        // done with translate_domain_pte
-       // now do vcpu_itc_no_srlz(vcpu,IorD,ifa,r22=pte,r8=mppte,r24=logps)
+       // now do vcpu_itc_no_srlz(vcpu,IorD,ifa,r22=pte,r16=mppte,r24=logps)
 // FIXME: for now, just domain0 and skip range check
        // psr.ic already cleared
        // NOTE: r24 still contains ps (from above)
@@ -1738,7 +2034,7 @@
        adds r23=XSI_IFA_OFS-XSI_PSR_IC_OFS,r18 ;;
        ld8 r23=[r23];;
        mov cr.ifa=r23;;
-       cmp.eq p6,p7=XEN_HYPER_ITC_D,r17;;
+       tbit.z p6,p7=r17,0;;
 (p6)   itc.d r22;;
 (p7)   itc.i r22;;
        dv_serialize_data
@@ -1755,7 +2051,7 @@
        st8 [r20]=r21;;
        // vcpu_set_tr_entry(trp,r22=pte|1,r24=itir,r23=ifa)
        // TR_ENTRY = {page_flags,itir,addr,rid}
-       cmp.eq p6,p7=XEN_HYPER_ITC_D,r17
+       tbit.z p6,p7=r17,0;;
        movl r27=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;;
        ld8 r27=[r27];;
        adds r28=IA64_VCPU_STARTING_RID_OFFSET,r27
@@ -1766,7 +2062,6 @@
        mov r19=-4096;;
        and r23=r23,r19;;
        st8 [r27]=r23,8;;       // ifa & ~0xfff
-// ?? is virtualize_rid(v,get_rr(ifa))==vcpu_get_rr(ifa)?? YES!!
        adds r29 = XSI_RR0_OFS-XSI_PSR_IC_OFS,r18
        extr.u r25=r23,61,3;;
        shladd r29=r25,3,r29;;
@@ -1804,13 +2099,16 @@
        //PSCBX(vcpu,i/dtlb_pte) = mp_pte
        movl r27=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;;
        ld8 r27=[r27];;
-       cmp.eq p6,p7=XEN_HYPER_ITC_D,r17;;
+       tbit.z p6,p7=r17,0;;
 (p6)   adds r27=IA64_VCPU_DTLB_PTE_OFFSET,r27
 (p7)   adds r27=IA64_VCPU_ITLB_PTE_OFFSET,r27;;
-       st8 [r27]=r8;;
+       st8 [r27]=r16;;
        // done with vcpu_itc_no_srlz
 
-       // done, increment to point to next instruction
+       // if hyper_itc, increment to point to next instruction
+       tbit.z p7,p0=r17,1
+(p7)   br.cond.sptk.few no_inc_iip;;
+
        mov r29=cr.ipsr
        mov r30=cr.iip;;
        extr.u r26=r29,41,2 ;;
@@ -1822,8 +2120,11 @@
        dep r29=r26,r29,41,2
        ;;
        mov cr.ipsr=r29
-       mov cr.iip=r30
+       mov cr.iip=r30;;
+
+no_inc_iip:
        mov pr=r31,-1 ;;
        rfi
        ;;
-END(hyper_itc_d)
+END(fast_insert)
+
diff -r 8e1703090053 -r a5195bf5671d xen/arch/ia64/xen/ivt.S
--- a/xen/arch/ia64/xen/ivt.S   Tue Nov  8 11:30:38 2005
+++ b/xen/arch/ia64/xen/ivt.S   Tue Nov  8 11:31:43 2005
@@ -246,7 +246,8 @@
 #ifdef XEN
        VHPT_CCHAIN_LOOKUP(itlb_miss,i)
 #ifdef VHPT_GLOBAL
-       br.cond.sptk page_fault
+//     br.cond.sptk page_fault
+       br.cond.sptk fast_tlb_miss_reflect
        ;;
 #endif
 #endif
@@ -297,7 +298,8 @@
 #ifdef XEN
        VHPT_CCHAIN_LOOKUP(dtlb_miss,d)
 #ifdef VHPT_GLOBAL
-       br.cond.sptk page_fault
+//     br.cond.sptk page_fault
+       br.cond.sptk fast_tlb_miss_reflect
        ;;
 #endif
 #endif
@@ -485,6 +487,11 @@
 // 0x1400 Entry 5 (size 64 bundles) Data nested TLB (6,45)
 ENTRY(nested_dtlb_miss)
        DBG_FAULT(5)
+#ifdef XEN
+       mov b0=r30
+       br.sptk.many b0                         // return to continuation point
+       ;;
+#endif
        /*
         * In the absence of kernel bugs, we get here when the virtually mapped 
linear
         * page table is accessed non-speculatively (e.g., in the Dirty-bit, 
Instruction
@@ -562,7 +569,11 @@
 
        
//-----------------------------------------------------------------------------------
        // call do_page_fault (predicates are in r31, psr.dt may be off, r16 is 
faulting address)
+#ifdef XEN
+GLOBAL_ENTRY(page_fault)
+#else
 ENTRY(page_fault)
+#endif
        ssm psr.dt
        ;;
        srlz.i
diff -r 8e1703090053 -r a5195bf5671d xen/arch/ia64/xen/privop.c
--- a/xen/arch/ia64/xen/privop.c        Tue Nov  8 11:30:38 2005
+++ b/xen/arch/ia64/xen/privop.c        Tue Nov  8 11:31:43 2005
@@ -1040,6 +1040,9 @@
 extern unsigned long tr_translate_count;
 extern unsigned long phys_translate_count;
 extern unsigned long vhpt_translate_count;
+extern unsigned long fast_vhpt_translate_count;
+extern unsigned long recover_to_page_fault_count;
+extern unsigned long recover_to_break_fault_count;
 extern unsigned long lazy_cover_count;
 extern unsigned long idle_when_pending;
 extern unsigned long pal_halt_light_count;
@@ -1049,9 +1052,12 @@
 {
        char *s = buf;
        s += sprintf(s,"Virtual TR translations: %d\n",tr_translate_count);
-       s += sprintf(s,"Virtual VHPT translations: %d\n",vhpt_translate_count);
+       s += sprintf(s,"Virtual VHPT slow translations: 
%d\n",vhpt_translate_count);
+       s += sprintf(s,"Virtual VHPT fast translations: 
%d\n",fast_vhpt_translate_count);
        s += sprintf(s,"Virtual DTLB translations: %d\n",dtlb_translate_count);
        s += sprintf(s,"Physical translations: %d\n",phys_translate_count);
+       s += sprintf(s,"Recoveries to page fault: 
%d\n",recover_to_page_fault_count);
+       s += sprintf(s,"Recoveries to break fault: 
%d\n",recover_to_break_fault_count);
        s += sprintf(s,"Idle when pending: %d\n",idle_when_pending);
        s += sprintf(s,"PAL_HALT_LIGHT (no pending): 
%d\n",pal_halt_light_count);
        s += sprintf(s,"context switches: %d\n",context_switch_count);
@@ -1065,6 +1071,9 @@
        tr_translate_count = 0;
        phys_translate_count = 0;
        vhpt_translate_count = 0;
+       fast_vhpt_translate_count = 0;
+       recover_to_page_fault_count = 0;
+       recover_to_break_fault_count = 0;
        lazy_cover_count = 0;
        pal_halt_light_count = 0;
        idle_when_pending = 0;
diff -r 8e1703090053 -r a5195bf5671d xen/arch/ia64/xen/process.c
--- a/xen/arch/ia64/xen/process.c       Tue Nov  8 11:30:38 2005
+++ b/xen/arch/ia64/xen/process.c       Tue Nov  8 11:31:43 2005
@@ -83,9 +83,8 @@
     if(VMX_DOMAIN(current)){
        vmx_load_all_rr(current);
     }else{
-           if (rr7 = load_region_regs(current)) {
-                   printk("schedule_tail: change to rr7 not yet 
implemented\n");
-       }
+           load_region_regs(current);
+            vcpu_load_kernel_regs(current);
     }
 }
 
@@ -185,6 +184,7 @@
        if (!(PSCB(v,ipsr) & IA64_PSR_DT)) {
                panic_domain(regs,"psr.dt off, trying to deliver nested 
dtlb!\n");
        }
+       vector &= ~0xf;
        if (vector != IA64_DATA_TLB_VECTOR &&
                vector != IA64_ALT_DATA_TLB_VECTOR &&
                vector != IA64_VHPT_TRANS_VECTOR) {
diff -r 8e1703090053 -r a5195bf5671d xen/arch/ia64/xen/regionreg.c
--- a/xen/arch/ia64/xen/regionreg.c     Tue Nov  8 11:30:38 2005
+++ b/xen/arch/ia64/xen/regionreg.c     Tue Nov  8 11:31:43 2005
@@ -341,23 +341,13 @@
 // rr7 (because we have to to assembly and physical mode
 // to change rr7).  If no change to rr7 is required, returns 0.
 //
-unsigned long load_region_regs(struct vcpu *v)
+void load_region_regs(struct vcpu *v)
 {
        unsigned long rr0, rr1,rr2, rr3, rr4, rr5, rr6, rr7;
        // TODO: These probably should be validated
        unsigned long bad = 0;
 
        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();
@@ -383,5 +373,4 @@
        if (bad) {
                panic_domain(0,"load_region_regs: can't set! bad=%lx\n",bad);
        }
-       return 0;
-}
+}
diff -r 8e1703090053 -r a5195bf5671d xen/arch/ia64/xen/vcpu.c
--- a/xen/arch/ia64/xen/vcpu.c  Tue Nov  8 11:30:38 2005
+++ b/xen/arch/ia64/xen/vcpu.c  Tue Nov  8 11:31:43 2005
@@ -134,6 +134,18 @@
 /**************************************************************************
  VCPU privileged application register access routines
 **************************************************************************/
+
+void vcpu_load_kernel_regs(VCPU *vcpu)
+{
+       ia64_set_kr(0, VCPU(vcpu, krs[0]));
+       ia64_set_kr(1, VCPU(vcpu, krs[1]));
+       ia64_set_kr(2, VCPU(vcpu, krs[2]));
+       ia64_set_kr(3, VCPU(vcpu, krs[3]));
+       ia64_set_kr(4, VCPU(vcpu, krs[4]));
+       ia64_set_kr(5, VCPU(vcpu, krs[5]));
+       ia64_set_kr(6, VCPU(vcpu, krs[6]));
+       ia64_set_kr(7, VCPU(vcpu, krs[7]));
+}
 
 IA64FAULT vcpu_set_ar(VCPU *vcpu, UINT64 reg, UINT64 val)
 {
@@ -1271,6 +1283,9 @@
 #define itir_mask(itir) (~((1UL << itir_ps(itir)) - 1))
 
 unsigned long vhpt_translate_count = 0;
+unsigned long fast_vhpt_translate_count = 0;
+unsigned long recover_to_page_fault_count = 0;
+unsigned long recover_to_break_fault_count = 0;
 
 IA64FAULT vcpu_translate(VCPU *vcpu, UINT64 address, BOOLEAN is_data, UINT64 
*pteval, UINT64 *itir, UINT64 *iha)
 {
@@ -1872,4 +1887,3 @@
        // don't forget to recompute itr_regions
        return (IA64_ILLOP_FAULT);
 }
-
diff -r 8e1703090053 -r a5195bf5671d xen/arch/ia64/xen/xenmisc.c
--- a/xen/arch/ia64/xen/xenmisc.c       Tue Nov  8 11:30:38 2005
+++ b/xen/arch/ia64/xen/xenmisc.c       Tue Nov  8 11:31:43 2005
@@ -290,8 +290,8 @@
 
//prev->domain->domain_id,(long)prev&0xffffff,next->domain->domain_id,(long)next&0xffffff);
 //if (prev->domain->domain_id == 1 && next->domain->domain_id == 0) cs10foo();
 //if (prev->domain->domain_id == 0 && next->domain->domain_id == 1) cs01foo();
-printk("@@sw%d/%x %d->%d\n",smp_processor_id(), hard_smp_processor_id (),
-       prev->domain->domain_id,next->domain->domain_id);
+//printk("@@sw%d/%x %d->%d\n",smp_processor_id(), hard_smp_processor_id (),
+//       prev->domain->domain_id,next->domain->domain_id);
     if(VMX_DOMAIN(prev)){
        vtm_domain_out(prev);
     }
@@ -320,6 +320,7 @@
                VHPT_ENABLED);
        if (!is_idle_task(current->domain)) {
                load_region_regs(current);
+               vcpu_load_kernel_regs(current);
                    if (vcpu_timer_expired(current)) vcpu_pend_timer(current);
        }
            if (vcpu_timer_expired(current)) vcpu_pend_timer(current);
diff -r 8e1703090053 -r a5195bf5671d xen/include/asm-ia64/time.h
--- a/xen/include/asm-ia64/time.h       Tue Nov  8 11:30:38 2005
+++ b/xen/include/asm-ia64/time.h       Tue Nov  8 11:31:43 2005
@@ -1,1 +1,2 @@
 #include <asm/linux/time.h>
+#include <asm/timex.h>
diff -r 8e1703090053 -r a5195bf5671d 
linux-2.6-xen-sparse/arch/ia64/xen/xen_ksyms.c
--- /dev/null   Tue Nov  8 11:30:38 2005
+++ b/linux-2.6-xen-sparse/arch/ia64/xen/xen_ksyms.c    Tue Nov  8 11:31:43 2005
@@ -0,0 +1,12 @@
+/*
+ * Architecture-specific kernel symbols
+ *
+ * Don't put any exports here unless it's defined in an assembler file.
+ * All other exports should be put directly after the definition.
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+
+extern int is_running_on_xen(void);
+EXPORT_SYMBOL(is_running_on_xen);

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