[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Manual merge.
# HG changeset patch # User smh22@xxxxxxxxxxxxxxxxxxxx # Node ID 0db6a59abb955be772d94ba32fe1a34a26db86da # Parent 6a83d157a391d246dfb8bae6a936f6f8266a5818 # Parent 90f2b122fc43c72d1e4005e9278b26ba18bf1df0 Manual merge. diff -r 6a83d157a391 -r 0db6a59abb95 linux-2.4-xen-sparse/arch/xen/kernel/time.c --- a/linux-2.4-xen-sparse/arch/xen/kernel/time.c Mon Aug 1 10:45:07 2005 +++ b/linux-2.4-xen-sparse/arch/xen/kernel/time.c Mon Aug 1 10:48:24 2005 @@ -225,21 +225,30 @@ */ static void __get_time_values_from_xen(void) { - do { - shadow_time_version = HYPERVISOR_shared_info->time_version2; - rmb(); - shadow_tv.tv_sec = HYPERVISOR_shared_info->wc_sec; - shadow_tv.tv_usec = HYPERVISOR_shared_info->wc_usec; - shadow_tsc_stamp = - (u32)(HYPERVISOR_shared_info->tsc_timestamp >> rdtsc_bitshift); - shadow_system_time = HYPERVISOR_shared_info->system_time; - rmb(); - } - while ( shadow_time_version != HYPERVISOR_shared_info->time_version1 ); -} - -#define TIME_VALUES_UP_TO_DATE \ - ({ rmb(); (shadow_time_version == HYPERVISOR_shared_info->time_version2); }) + shared_info_t *s = HYPERVISOR_shared_info; + struct vcpu_time_info *src; + struct shadow_time_info *dst; + + src = &s->vcpu_time[smp_processor_id()]; + dst = &per_cpu(shadow_time, smp_processor_id()); + + do { + dst->version = src->time_version2; + rmb(); + dst->tsc_timestamp = src->tsc_timestamp; + dst->system_timestamp = src->system_time; + dst->tsc_to_nsec_mul = src->tsc_to_system_mul; + dst->tsc_shift = src->tsc_shift; + rmb(); + } + while (dst->version != src->time_version1); + + dst->tsc_to_usec_mul = dst->tsc_to_nsec_mul / 1000; + + if ((shadow_tv.tv_sec != s->wc_sec) || + (shadow_tv.tv_usec != s->wc_usec)) + update_wallclock(); +} /* @@ -263,6 +272,17 @@ return (unsigned long)delta; } +static inline int time_values_up_to_date() +{ + struct vcpu_time_info *src; + struct shadow_time_info *dst; + + src = &HYPERVISOR_shared_info->vcpu_time[smp_processor_id()]; + dst = &per_cpu(shadow_time, smp_processor_id()); + + return (dst->version == src->time_version2); +} + /* * Returns the current time-of-day in UTC timeval format. @@ -286,7 +306,7 @@ __normalize_time(&_tv.tv_sec, &nsec); _tv.tv_usec += (long)nsec / 1000L; - if ( unlikely(!TIME_VALUES_UP_TO_DATE) ) + if ( unlikely(!time_values_up_to_date()) ) { /* * We may have blocked for a long time, rendering our calculations diff -r 6a83d157a391 -r 0db6a59abb95 linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_32 --- a/linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_32 Mon Aug 1 10:45:07 2005 +++ b/linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_32 Mon Aug 1 10:48:24 2005 @@ -18,8 +18,8 @@ CONFIG_XEN_NETDEV_BACKEND=y CONFIG_XEN_BLKDEV_FRONTEND=y CONFIG_XEN_NETDEV_FRONTEND=y -# CONFIG_XEN_NETDEV_GRANT_TX is not set -# CONFIG_XEN_NETDEV_GRANT_RX is not set +CONFIG_XEN_NETDEV_GRANT_TX=y + CONFIG_XEN_NETDEV_GRANT_RX=y # CONFIG_XEN_NETDEV_FRONTEND_PIPELINED_TRANSMITTER is not set # CONFIG_XEN_BLKDEV_TAP is not set # CONFIG_XEN_SHADOW_MODE is not set diff -r 6a83d157a391 -r 0db6a59abb95 linux-2.6-xen-sparse/arch/xen/configs/xenU_defconfig_x86_32 --- a/linux-2.6-xen-sparse/arch/xen/configs/xenU_defconfig_x86_32 Mon Aug 1 10:45:07 2005 +++ b/linux-2.6-xen-sparse/arch/xen/configs/xenU_defconfig_x86_32 Mon Aug 1 10:48:24 2005 @@ -15,8 +15,8 @@ CONFIG_XEN_BLKDEV_GRANT=y CONFIG_XEN_BLKDEV_FRONTEND=y CONFIG_XEN_NETDEV_FRONTEND=y -# CONFIG_XEN_NETDEV_GRANT_TX is not set -# CONFIG_XEN_NETDEV_GRANT_RX is not set +CONFIG_XEN_NETDEV_GRANT_TX=y +CONFIG_XEN_NETDEV_GRANT_RX=y # CONFIG_XEN_NETDEV_FRONTEND_PIPELINED_TRANSMITTER is not set # CONFIG_XEN_BLKDEV_TAP is not set # CONFIG_XEN_SHADOW_MODE is not set diff -r 6a83d157a391 -r 0db6a59abb95 linux-2.6-xen-sparse/arch/xen/i386/kernel/traps.c --- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/traps.c Mon Aug 1 10:45:07 2005 +++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/traps.c Mon Aug 1 10:48:24 2005 @@ -90,9 +90,7 @@ static int kstack_depth_to_print = 24; struct notifier_block *i386die_chain; -DEFINE_SPINLOCK(die_notifier_lock); -EXPORT_SYMBOL(die_notifier_lock); -EXPORT_SYMBOL(i386die_chain); +static DEFINE_SPINLOCK(die_notifier_lock); int register_die_notifier(struct notifier_block *nb) { diff -r 6a83d157a391 -r 0db6a59abb95 tools/debugger/pdb/Makefile --- a/tools/debugger/pdb/Makefile Mon Aug 1 10:45:07 2005 +++ b/tools/debugger/pdb/Makefile Mon Aug 1 10:48:24 2005 @@ -33,7 +33,7 @@ LIBS += unix str # bc = byte-code, dc = debug byte-code -all : dc +all : patches dc SOURCES += pdb_caml_xc.c SOURCES += pdb_caml_domain.c pdb_caml_process.c @@ -50,3 +50,6 @@ include $(OCAMLMAKEFILE) +PATCHDIR = ./linux-2.6-patches +patches : + make -C $(PATCHDIR) patches diff -r 6a83d157a391 -r 0db6a59abb95 tools/debugger/pdb/linux-2.6-module/module.c --- a/tools/debugger/pdb/linux-2.6-module/module.c Mon Aug 1 10:45:07 2005 +++ b/tools/debugger/pdb/linux-2.6-module/module.c Mon Aug 1 10:48:24 2005 @@ -278,14 +278,10 @@ return err; } -extern struct notifier_block *i386die_chain; -extern spinlock_t die_notifier_lock; - static void __exit pdb_terminate(void) { int err = 0; - unsigned long flags; printk("pdb cleanup\n"); @@ -305,9 +301,8 @@ pdb_send_connection_status(PDB_CONNECTION_STATUS_DOWN, 0); - spin_lock_irqsave(&die_notifier_lock, flags); - err = notifier_chain_unregister(&i386die_chain, &pdb_exceptions_nb); - spin_unlock_irqrestore(&die_notifier_lock, flags); + /* handler for int1 & int3 */ + err = unregister_die_notifier(&pdb_exceptions_nb); return; } diff -r 6a83d157a391 -r 0db6a59abb95 tools/debugger/pdb/linux-2.6-patches/Makefile --- /dev/null Mon Aug 1 10:45:07 2005 +++ b/tools/debugger/pdb/linux-2.6-patches/Makefile Mon Aug 1 10:48:24 2005 @@ -0,0 +1,10 @@ +XEN_ROOT = ../../../.. +LINUX_DIR = linux-2.6.12-xenU +KDIR = $(XEN_ROOT)/$(LINUX_DIR) +PATCH_DIR = $(CURDIR) + +patches : patches-done + +patches-done : + ( for i in *.patch ; do ( cd $(KDIR) ; patch -p1 < $(PATCH_DIR)/$$i || exit 1 ) ; done ) + touch $@ diff -r 6a83d157a391 -r 0db6a59abb95 tools/debugger/pdb/linux-2.6-patches/i386_ksyms.patch --- /dev/null Mon Aug 1 10:45:07 2005 +++ b/tools/debugger/pdb/linux-2.6-patches/i386_ksyms.patch Mon Aug 1 10:48:24 2005 @@ -0,0 +1,11 @@ +diff -u linux-2.6.12/arch/xen/i386/kernel/i386_ksyms.c linux-2.6.12-pdb/arch/xen/i386/kernel/i386_ksyms.c +--- linux-2.6.12/arch/xen/i386/kernel/i386_ksyms.c 2005-07-31 22:36:50.000000000 +0100 ++++ linux-2.6.12-pdb/arch/xen/i386/kernel/i386_ksyms.c 2005-08-01 10:57:31.000000000 +0100 +@@ -172,6 +172,7 @@ + EXPORT_SYMBOL_GPL(unset_nmi_callback); + + EXPORT_SYMBOL(register_die_notifier); ++EXPORT_SYMBOL(unregister_die_notifier); + #ifdef CONFIG_HAVE_DEC_LOCK + EXPORT_SYMBOL(_atomic_dec_and_lock); + #endif diff -r 6a83d157a391 -r 0db6a59abb95 tools/debugger/pdb/linux-2.6-patches/kdebug.patch --- /dev/null Mon Aug 1 10:45:07 2005 +++ b/tools/debugger/pdb/linux-2.6-patches/kdebug.patch Mon Aug 1 10:48:24 2005 @@ -0,0 +1,11 @@ +diff -u linux-2.6.12/include/asm-i386/kdebug.h linux-2.6.12-pdb/include/asm-i386/kdebug.h +--- linux-2.6.12/include/asm-i386/kdebug.h 2005-06-17 20:48:29.000000000 +0100 ++++ linux-2.6.12-pdb/include/asm-i386/kdebug.h 2005-08-01 11:11:53.000000000 +0100 +@@ -21,6 +21,7 @@ + If you really want to do it first unregister - then synchronize_kernel - then free. + */ + int register_die_notifier(struct notifier_block *nb); ++int unregister_die_notifier(struct notifier_block *nb); + extern struct notifier_block *i386die_chain; + + diff -r 6a83d157a391 -r 0db6a59abb95 tools/debugger/pdb/linux-2.6-patches/makefile.patch --- /dev/null Mon Aug 1 10:45:07 2005 +++ b/tools/debugger/pdb/linux-2.6-patches/makefile.patch Mon Aug 1 10:48:24 2005 @@ -0,0 +1,12 @@ +diff -Naur linux-2.6.12/Makefile linux-2.6.12-pdb/Makefile +--- linux-2.6.12/Makefile 2005-08-01 01:21:21.000000000 +0100 ++++ linux-2.6.12-pdb/Makefile 2005-08-01 10:28:10.000000000 +0100 +@@ -508,7 +508,7 @@ + ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE + CFLAGS += -Os + else +-CFLAGS += -O2 ++CFLAGS += -O + endif + + #Add align options if CONFIG_CC_* is not equal to 0 diff -r 6a83d157a391 -r 0db6a59abb95 tools/debugger/pdb/linux-2.6-patches/ptrace.patch --- /dev/null Mon Aug 1 10:45:07 2005 +++ b/tools/debugger/pdb/linux-2.6-patches/ptrace.patch Mon Aug 1 10:48:24 2005 @@ -0,0 +1,11 @@ +diff -u linux-2.6.12/kernel/ptrace.c linux-2.6.12-pdb/kernel/ptrace.c +--- linux-2.6.12/kernel/ptrace.c 2005-06-17 20:48:29.000000000 +0100 ++++ linux-2.6.12-pdb/kernel/ptrace.c 2005-07-22 13:23:16.000000000 +0100 +@@ -239,6 +239,7 @@ + + return buf - old_buf; + } ++EXPORT_SYMBOL(access_process_vm); + + int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst, int len) + { diff -r 6a83d157a391 -r 0db6a59abb95 tools/debugger/pdb/linux-2.6-patches/traps.patch --- /dev/null Mon Aug 1 10:45:07 2005 +++ b/tools/debugger/pdb/linux-2.6-patches/traps.patch Mon Aug 1 10:48:24 2005 @@ -0,0 +1,20 @@ +diff -u linux-2.6.12/arch/xen/i386/kernel/traps.c linux-2.6.12-pdb/arch/xen/i386/kernel/traps.c +--- linux-2.6.12/arch/xen/i386/kernel/traps.c 2005-07-31 22:47:00.000000000 +0100 ++++ linux-2.6.12-pdb/arch/xen/i386/kernel/traps.c 2005-07-31 22:47:32.000000000 +0100 +@@ -102,6 +102,16 @@ + return err; + } + ++int unregister_die_notifier(struct notifier_block *nb) ++{ ++ int err = 0; ++ unsigned long flags; ++ spin_lock_irqsave(&die_notifier_lock, flags); ++ err = notifier_chain_unregister(&i386die_chain, nb); ++ spin_unlock_irqrestore(&die_notifier_lock, flags); ++ return err; ++} ++ + static inline int valid_stack_ptr(struct thread_info *tinfo, void *p) + { + return p > (void *)tinfo && diff -r 6a83d157a391 -r 0db6a59abb95 linux-2.6-xen-sparse/kernel/ptrace.c --- a/linux-2.6-xen-sparse/kernel/ptrace.c Mon Aug 1 10:45:07 2005 +++ /dev/null Mon Aug 1 10:48:24 2005 @@ -1,391 +0,0 @@ -/* - * linux/kernel/ptrace.c - * - * (C) Copyright 1999 Linus Torvalds - * - * Common interfaces for "ptrace()" which we do not want - * to continually duplicate across every architecture. - */ - -#include <linux/module.h> -#include <linux/sched.h> -#include <linux/errno.h> -#include <linux/mm.h> -#include <linux/highmem.h> -#include <linux/pagemap.h> -#include <linux/smp_lock.h> -#include <linux/ptrace.h> -#include <linux/security.h> -#include <linux/signal.h> - -#include <asm/pgtable.h> -#include <asm/uaccess.h> - -/* - * ptrace a task: make the debugger its new parent and - * move it to the ptrace list. - * - * Must be called with the tasklist lock write-held. - */ -void __ptrace_link(task_t *child, task_t *new_parent) -{ - if (!list_empty(&child->ptrace_list)) - BUG(); - if (child->parent == new_parent) - return; - list_add(&child->ptrace_list, &child->parent->ptrace_children); - REMOVE_LINKS(child); - child->parent = new_parent; - SET_LINKS(child); -} - -/* - * Turn a tracing stop into a normal stop now, since with no tracer there - * would be no way to wake it up with SIGCONT or SIGKILL. If there was a - * signal sent that would resume the child, but didn't because it was in - * TASK_TRACED, resume it now. - * Requires that irqs be disabled. - */ -void ptrace_untrace(task_t *child) -{ - spin_lock(&child->sighand->siglock); - if (child->state == TASK_TRACED) { - if (child->signal->flags & SIGNAL_STOP_STOPPED) { - child->state = TASK_STOPPED; - } else { - signal_wake_up(child, 1); - } - } - spin_unlock(&child->sighand->siglock); -} - -/* - * unptrace a task: move it back to its original parent and - * remove it from the ptrace list. - * - * Must be called with the tasklist lock write-held. - */ -void __ptrace_unlink(task_t *child) -{ - if (!child->ptrace) - BUG(); - child->ptrace = 0; - if (!list_empty(&child->ptrace_list)) { - list_del_init(&child->ptrace_list); - REMOVE_LINKS(child); - child->parent = child->real_parent; - SET_LINKS(child); - } - - if (child->state == TASK_TRACED) - ptrace_untrace(child); -} - -/* - * Check that we have indeed attached to the thing.. - */ -int ptrace_check_attach(struct task_struct *child, int kill) -{ - int ret = -ESRCH; - - /* - * We take the read lock around doing both checks to close a - * possible race where someone else was tracing our child and - * detached between these two checks. After this locked check, - * we are sure that this is our traced child and that can only - * be changed by us so it's not changing right after this. - */ - read_lock(&tasklist_lock); - if ((child->ptrace & PT_PTRACED) && child->parent == current && - (!(child->ptrace & PT_ATTACHED) || child->real_parent != current) - && child->signal != NULL) { - ret = 0; - spin_lock_irq(&child->sighand->siglock); - if (child->state == TASK_STOPPED) { - child->state = TASK_TRACED; - } else if (child->state != TASK_TRACED && !kill) { - ret = -ESRCH; - } - spin_unlock_irq(&child->sighand->siglock); - } - read_unlock(&tasklist_lock); - - if (!ret && !kill) { - wait_task_inactive(child); - } - - /* All systems go.. */ - return ret; -} - -int ptrace_attach(struct task_struct *task) -{ - int retval; - task_lock(task); - retval = -EPERM; - if (task->pid <= 1) - goto bad; - if (task == current) - goto bad; - if (!task->mm) - goto bad; - if(((current->uid != task->euid) || - (current->uid != task->suid) || - (current->uid != task->uid) || - (current->gid != task->egid) || - (current->gid != task->sgid) || - (current->gid != task->gid)) && !capable(CAP_SYS_PTRACE)) - goto bad; - smp_rmb(); - if (!task->mm->dumpable && !capable(CAP_SYS_PTRACE)) - goto bad; - /* the same process cannot be attached many times */ - if (task->ptrace & PT_PTRACED) - goto bad; - retval = security_ptrace(current, task); - if (retval) - goto bad; - - /* Go */ - task->ptrace |= PT_PTRACED | ((task->real_parent != current) - ? PT_ATTACHED : 0); - if (capable(CAP_SYS_PTRACE)) - task->ptrace |= PT_PTRACE_CAP; - task_unlock(task); - - write_lock_irq(&tasklist_lock); - __ptrace_link(task, current); - write_unlock_irq(&tasklist_lock); - - force_sig_specific(SIGSTOP, task); - return 0; - -bad: - task_unlock(task); - return retval; -} - -int ptrace_detach(struct task_struct *child, unsigned int data) -{ - if (!valid_signal(data)) - return -EIO; - - /* Architecture-specific hardware disable .. */ - ptrace_disable(child); - - /* .. re-parent .. */ - child->exit_code = data; - - write_lock_irq(&tasklist_lock); - __ptrace_unlink(child); - /* .. and wake it up. */ - if (child->exit_state != EXIT_ZOMBIE) - wake_up_process(child); - write_unlock_irq(&tasklist_lock); - - return 0; -} - -/* - * Access another process' address space. - * Source/target buffer must be kernel space, - * Do not walk the page table directly, use get_user_pages - */ - -int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write) -{ - struct mm_struct *mm; - struct vm_area_struct *vma; - struct page *page; - void *old_buf = buf; - - mm = get_task_mm(tsk); - if (!mm) - return 0; - - down_read(&mm->mmap_sem); - /* ignore errors, just check how much was sucessfully transfered */ - while (len) { - int bytes, ret, offset; - void *maddr; - - ret = get_user_pages(tsk, mm, addr, 1, - write, 1, &page, &vma); - if (ret <= 0) - break; - - bytes = len; - offset = addr & (PAGE_SIZE-1); - if (bytes > PAGE_SIZE-offset) - bytes = PAGE_SIZE-offset; - - maddr = kmap(page); - if (write) { - copy_to_user_page(vma, page, addr, - maddr + offset, buf, bytes); - set_page_dirty_lock(page); - } else { - copy_from_user_page(vma, page, addr, - buf, maddr + offset, bytes); - } - kunmap(page); - page_cache_release(page); - len -= bytes; - buf += bytes; - addr += bytes; - } - up_read(&mm->mmap_sem); - mmput(mm); - - return buf - old_buf; -} -EXPORT_SYMBOL(access_process_vm); - -int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst, int len) -{ - int copied = 0; - - while (len > 0) { - char buf[128]; - int this_len, retval; - - this_len = (len > sizeof(buf)) ? sizeof(buf) : len; - retval = access_process_vm(tsk, src, buf, this_len, 0); - if (!retval) { - if (copied) - break; - return -EIO; - } - if (copy_to_user(dst, buf, retval)) - return -EFAULT; - copied += retval; - src += retval; - dst += retval; - len -= retval; - } - return copied; -} - -int ptrace_writedata(struct task_struct *tsk, char __user *src, unsigned long dst, int len) -{ - int copied = 0; - - while (len > 0) { - char buf[128]; - int this_len, retval; - - this_len = (len > sizeof(buf)) ? sizeof(buf) : len; - if (copy_from_user(buf, src, this_len)) - return -EFAULT; - retval = access_process_vm(tsk, dst, buf, this_len, 1); - if (!retval) { - if (copied) - break; - return -EIO; - } - copied += retval; - src += retval; - dst += retval; - len -= retval; - } - return copied; -} - -static int ptrace_setoptions(struct task_struct *child, long data) -{ - child->ptrace &= ~PT_TRACE_MASK; - - if (data & PTRACE_O_TRACESYSGOOD) - child->ptrace |= PT_TRACESYSGOOD; - - if (data & PTRACE_O_TRACEFORK) - child->ptrace |= PT_TRACE_FORK; - - if (data & PTRACE_O_TRACEVFORK) - child->ptrace |= PT_TRACE_VFORK; - - if (data & PTRACE_O_TRACECLONE) - child->ptrace |= PT_TRACE_CLONE; - - if (data & PTRACE_O_TRACEEXEC) - child->ptrace |= PT_TRACE_EXEC; - - if (data & PTRACE_O_TRACEVFORKDONE) - child->ptrace |= PT_TRACE_VFORK_DONE; - - if (data & PTRACE_O_TRACEEXIT) - child->ptrace |= PT_TRACE_EXIT; - - return (data & ~PTRACE_O_MASK) ? -EINVAL : 0; -} - -static int ptrace_getsiginfo(struct task_struct *child, siginfo_t __user * data) -{ - siginfo_t lastinfo; - int error = -ESRCH; - - read_lock(&tasklist_lock); - if (likely(child->sighand != NULL)) { - error = -EINVAL; - spin_lock_irq(&child->sighand->siglock); - if (likely(child->last_siginfo != NULL)) { - lastinfo = *child->last_siginfo; - error = 0; - } - spin_unlock_irq(&child->sighand->siglock); - } - read_unlock(&tasklist_lock); - if (!error) - return copy_siginfo_to_user(data, &lastinfo); - return error; -} - -static int ptrace_setsiginfo(struct task_struct *child, siginfo_t __user * data) -{ - siginfo_t newinfo; - int error = -ESRCH; - - if (copy_from_user(&newinfo, data, sizeof (siginfo_t))) - return -EFAULT; - - read_lock(&tasklist_lock); - if (likely(child->sighand != NULL)) { - error = -EINVAL; - spin_lock_irq(&child->sighand->siglock); - if (likely(child->last_siginfo != NULL)) { - *child->last_siginfo = newinfo; - error = 0; - } - spin_unlock_irq(&child->sighand->siglock); - } - read_unlock(&tasklist_lock); - return error; -} - -int ptrace_request(struct task_struct *child, long request, - long addr, long data) -{ - int ret = -EIO; - - switch (request) { -#ifdef PTRACE_OLDSETOPTIONS - case PTRACE_OLDSETOPTIONS: -#endif - case PTRACE_SETOPTIONS: - ret = ptrace_setoptions(child, data); - break; - case PTRACE_GETEVENTMSG: - ret = put_user(child->ptrace_message, (unsigned long __user *) data); - break; - case PTRACE_GETSIGINFO: - ret = ptrace_getsiginfo(child, (siginfo_t __user *) data); - break; - case PTRACE_SETSIGINFO: - ret = ptrace_setsiginfo(child, (siginfo_t __user *) data); - break; - default: - break; - } - - return ret; -} _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |