[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |