# HG changeset patch
# User emellor@xxxxxxxxxxxxxxxxxxxxxx
# Node ID b9181b1c576fb39bb4d3b088ac3378d77163b4cc
# Parent 3c21a174e8fcbec6e50aa674e3b920ed7de472f2
# Parent c3cfc4ff3b08b01051e6fa0741e1e014a1307aea
Merged.
diff -r 3c21a174e8fc -r b9181b1c576f install.sh
--- a/install.sh Sat Nov 26 01:13:51 2005
+++ b/install.sh Sat Nov 26 01:21:55 2005
@@ -28,7 +28,7 @@
echo "All done."
[ -x "$(which udevinfo)" ] && \
- UDEV_VERSION=$(udevinfo -V | sed -e 's/^.*\s\([0-9]\+\)[^0-9]*/\1/')
+ UDEV_VERSION=$(udevinfo -V | sed -e 's/^[^0-9]*
\([0-9]\{1,\}\)[^0-9]\{0,\}/\1/')
if [ -n "$UDEV_VERSION" ] && [ $UDEV_VERSION -ge 059 ]; then
cp -f $src/etc/udev/rules.d/*.rules $dst/etc/udev/rules.d/
diff -r 3c21a174e8fc -r b9181b1c576f
linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c
--- a/linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c Sat Nov 26
01:13:51 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c Sat Nov 26
01:21:55 2005
@@ -213,55 +213,6 @@
break;
#endif
-#ifndef __ia64__
- case IOCTL_PRIVCMD_GET_MACH2PHYS_MFNS: {
- pgd_t *pgd;
- pud_t *pud;
- pmd_t *pmd;
- unsigned long m2pv, m2p_mfn;
- privcmd_m2pmfns_t m;
- unsigned long __user *p;
- int i;
-
-#if defined (__x86_64__)
- /*
- ** XXX SMH: the below procedure won't work for 64 since
- ** we don't have access to the memory which maps the M2P.
- ** A proper fix will probably involve moving this
- ** functionality to Xen - for now just return an error
- ** here rather than GPF'ing in the kernel.
- */
- ret = -EINVAL;
- break;
-#endif
-
- if (copy_from_user(&m, udata, sizeof(m)))
- return -EFAULT;
-
- m2pv = (unsigned long)machine_to_phys_mapping;
-
- p = m.arr;
-
- for (i=0; i < m.num; i++) {
- pgd = pgd_offset_k(m2pv);
- pud = pud_offset(pgd, m2pv);
- pmd = pmd_offset(pud, m2pv);
- m2p_mfn = (*(uint64_t *)pmd >> PAGE_SHIFT)&0xFFFFFFFF;
- m2p_mfn += pte_index(m2pv);
-
- if (put_user(m2p_mfn, p + i))
- return -EFAULT;
-
- m2pv += (1 << 21);
- }
-
- ret = 0;
- break;
-
- }
- break;
-#endif
-
default:
ret = -EINVAL;
break;
diff -r 3c21a174e8fc -r b9181b1c576f
linux-2.6-xen-sparse/include/asm-xen/linux-public/privcmd.h
--- a/linux-2.6-xen-sparse/include/asm-xen/linux-public/privcmd.h Sat Nov
26 01:13:51 2005
+++ b/linux-2.6-xen-sparse/include/asm-xen/linux-public/privcmd.h Sat Nov
26 01:21:55 2005
@@ -59,11 +59,6 @@
unsigned long __user *arr; /* array of mfns - top nibble set on err */
} privcmd_mmapbatch_t;
-typedef struct privcmd_m2pmfns {
- int num; /* max number of mfns to return */
- unsigned long __user *arr; /* array of mfns */
-} privcmd_m2pmfns_t;
-
typedef struct privcmd_blkmsg
{
unsigned long op;
@@ -82,8 +77,6 @@
_IOC(_IOC_NONE, 'P', 2, sizeof(privcmd_mmap_t))
#define IOCTL_PRIVCMD_MMAPBATCH \
_IOC(_IOC_NONE, 'P', 3, sizeof(privcmd_mmapbatch_t))
-#define IOCTL_PRIVCMD_GET_MACH2PHYS_MFNS \
- _IOC(_IOC_READ, 'P', 4, sizeof(unsigned long))
#endif /* __LINUX_PUBLIC_PRIVCMD_H__ */
diff -r 3c21a174e8fc -r b9181b1c576f tools/check/check_hotplug
--- a/tools/check/check_hotplug Sat Nov 26 01:13:51 2005
+++ b/tools/check/check_hotplug Sat Nov 26 01:21:55 2005
@@ -7,7 +7,7 @@
exit 1
}
[ -x "$(which udevinfo)" ] && \
- UDEV_VERSION=$(udevinfo -V | sed -e 's/^.*\s\([0-9]\+\)[^0-9]*/\1/')
+ UDEV_VERSION=$(udevinfo -V | sed -e 's/^[^0-9]*
\([0-9]\{1,\}\)[^0-9]\{0,\}/\1/')
if [ -n "$UDEV_VERSION" ] && [ $UDEV_VERSION -ge 059 ]; then
exit 0
diff -r 3c21a174e8fc -r b9181b1c576f tools/libxc/xc_linux_restore.c
--- a/tools/libxc/xc_linux_restore.c Sat Nov 26 01:13:51 2005
+++ b/tools/libxc/xc_linux_restore.c Sat Nov 26 01:21:55 2005
@@ -78,6 +78,7 @@
pfn = (pte >> PAGE_SHIFT) & 0xffffffff;
if(pfn >= max_pfn) {
+ /* This "page table page" is probably not one; bail. */
ERR("Frame number in type %lu page table is out of range: "
"i=%d pfn=0x%lx max_pfn=%lu",
type >> 28, i, pfn, max_pfn);
@@ -111,6 +112,7 @@
unsigned long mfn, pfn;
unsigned int prev_pc, this_pc;
int verify = 0;
+ int nraces = 0;
/* The new domain's shared-info frame number. */
unsigned long shared_info_frame;
@@ -344,8 +346,15 @@
if(pt_levels != 3 || pagetype != L1TAB) {
if(!uncanonicalize_pagetable(pagetype, page)) {
- ERR("failed uncanonicalize pt!\n");
- goto out;
+ /*
+ ** Failing to uncanonicalize a page table can be ok
+ ** under live migration since the pages type may have
+ ** changed by now (and we'll get an update later).
+ */
+ DPRINTF("PT L%ld race on pfn=%08lx mfn=%08lx\n",
+ pagetype >> 28, pfn, mfn);
+ nraces++;
+ continue;
}
}
@@ -394,7 +403,7 @@
n+= j; /* crude stats */
}
- DPRINTF("Received all pages\n");
+ DPRINTF("Received all pages (%d races)\n", nraces);
if(pt_levels == 3) {
diff -r 3c21a174e8fc -r b9181b1c576f tools/libxc/xc_linux_save.c
--- a/tools/libxc/xc_linux_save.c Sat Nov 26 01:13:51 2005
+++ b/tools/libxc/xc_linux_save.c Sat Nov 26 01:21:55 2005
@@ -502,7 +502,7 @@
unsigned long max_mfn,
int prot)
{
- privcmd_m2pmfns_t m2p_mfns;
+ struct xen_machphys_mfn_list xmml;
privcmd_mmap_t ioctlx;
privcmd_mmap_entry_t *entries;
unsigned long m2p_chunks, m2p_size;
@@ -512,50 +512,45 @@
m2p_size = M2P_SIZE(max_mfn);
m2p_chunks = M2P_CHUNKS(max_mfn);
-
- m2p_mfns.num = m2p_chunks;
-
- if(!(m2p_mfns.arr = malloc(m2p_chunks * sizeof(unsigned long)))) {
+ xmml.max_extents = m2p_chunks;
+ if (!(xmml.extent_start = malloc(m2p_chunks * sizeof(unsigned long)))) {
ERR("failed to allocate space for m2p mfns!\n");
return NULL;
}
- if (ioctl(xc_handle, IOCTL_PRIVCMD_GET_MACH2PHYS_MFNS, &m2p_mfns) < 0) {
+ if (xc_memory_op(xc_handle, XENMEM_machphys_mfn_list, &xmml) ||
+ (xmml.nr_extents != m2p_chunks)) {
ERR("xc_get_m2p_mfns:");
return NULL;
}
- if((m2p = mmap(NULL, m2p_size, prot,
- MAP_SHARED, xc_handle, 0)) == MAP_FAILED) {
+ if ((m2p = mmap(NULL, m2p_size, prot,
+ MAP_SHARED, xc_handle, 0)) == MAP_FAILED) {
ERR("failed to mmap m2p");
return NULL;
}
-
-
- if(!(entries = malloc(m2p_chunks * sizeof(privcmd_mmap_entry_t)))) {
+
+ if (!(entries = malloc(m2p_chunks * sizeof(privcmd_mmap_entry_t)))) {
ERR("failed to allocate space for mmap entries!\n");
return NULL;
}
-
ioctlx.num = m2p_chunks;
ioctlx.dom = DOMID_XEN;
ioctlx.entry = entries;
- for(i=0; i < m2p_chunks; i++) {
-
+ for (i=0; i < m2p_chunks; i++) {
entries[i].va = (unsigned long)(((void *)m2p) + (i * M2P_CHUNK_SIZE));
- entries[i].mfn = m2p_mfns.arr[i];
+ entries[i].mfn = xmml.extent_start[i];
entries[i].npages = M2P_CHUNK_SIZE >> PAGE_SHIFT;
-
- }
-
- if((rc = ioctl(xc_handle, IOCTL_PRIVCMD_MMAP, &ioctlx)) < 0) {
+ }
+
+ if ((rc = ioctl(xc_handle, IOCTL_PRIVCMD_MMAP, &ioctlx)) < 0) {
ERR("ioctl_mmap failed (rc = %d)", rc);
return NULL;
}
-
- free(m2p_mfns.arr);
+
+ free(xmml.extent_start);
free(entries);
return m2p;
diff -r 3c21a174e8fc -r b9181b1c576f tools/libxc/xc_private.c
--- a/tools/libxc/xc_private.c Sat Nov 26 01:13:51 2005
+++ b/tools/libxc/xc_private.c Sat Nov 26 01:21:55 2005
@@ -190,6 +190,7 @@
{
DECLARE_HYPERCALL;
struct xen_memory_reservation *reservation = arg;
+ struct xen_machphys_mfn_list *xmml = arg;
long ret = -EINVAL;
hypercall.op = __HYPERVISOR_memory_op;
@@ -214,6 +215,20 @@
goto out1;
}
break;
+ case XENMEM_machphys_mfn_list:
+ if ( mlock(xmml, sizeof(*xmml)) != 0 )
+ {
+ PERROR("Could not mlock");
+ goto out1;
+ }
+ if ( mlock(xmml->extent_start,
+ xmml->max_extents * sizeof(unsigned long)) != 0 )
+ {
+ PERROR("Could not mlock");
+ safe_munlock(xmml, sizeof(*xmml));
+ goto out1;
+ }
+ break;
}
ret = do_xen_hypercall(xc_handle, &hypercall);
@@ -226,6 +241,11 @@
if ( reservation->extent_start != NULL )
safe_munlock(reservation->extent_start,
reservation->nr_extents * sizeof(unsigned long));
+ break;
+ case XENMEM_machphys_mfn_list:
+ safe_munlock(xmml, sizeof(*xmml));
+ safe_munlock(xmml->extent_start,
+ xmml->max_extents * sizeof(unsigned long));
break;
}
diff -r 3c21a174e8fc -r b9181b1c576f tools/xm-test/configure.ac
--- a/tools/xm-test/configure.ac Sat Nov 26 01:13:51 2005
+++ b/tools/xm-test/configure.ac Sat Nov 26 01:21:55 2005
@@ -35,6 +35,7 @@
Makefile
ramdisk/Makefile
tests/Makefile
+ tests/_sanity/Makefile
tests/block-list/Makefile
tests/block-create/Makefile
tests/block-destroy/Makefile
diff -r 3c21a174e8fc -r b9181b1c576f tools/xm-test/runtest.sh
--- a/tools/xm-test/runtest.sh Sat Nov 26 01:13:51 2005
+++ b/tools/xm-test/runtest.sh Sat Nov 26 01:21:55 2005
@@ -14,6 +14,7 @@
echo " -q : run a quick test set"
echo " -e <email> : set email address for report"
echo " -s <report> : just submit report <report>"
+ echo " -h | --help : show this help"
}
# Just submit the report
@@ -83,6 +84,15 @@
# See if xend is running
if ! xm list >/dev/null 2>&1; then
echo "'xm list' failed: is xend running?"
+ exit 1
+ fi
+
+ # Run a few sample tests to make sure things are working
+ # before we take the plunge
+ echo "Running sanity checks..."
+ make -C tests/_sanity check 2>&1 | grep REASON
+ if [ $? -eq 0 ]; then
+ echo "Sanity checks failed"
exit 1
fi
@@ -119,7 +129,7 @@
# Run the tests
run_tests() {
output=$1
- echo Running tests...
+ echo Running real tests...
TEST_VERBOSE=1 make -k check > $output 2>&1
}
@@ -209,6 +219,10 @@
-s)
run=no
;;
+ -h|--help)
+ usage
+ exit 0
+ ;;
*)
REPORT=$1
break
diff -r 3c21a174e8fc -r b9181b1c576f
tools/xm-test/tests/network-attach/network_utils.py
--- a/tools/xm-test/tests/network-attach/network_utils.py Sat Nov 26
01:13:51 2005
+++ b/tools/xm-test/tests/network-attach/network_utils.py Sat Nov 26
01:21:55 2005
@@ -10,7 +10,7 @@
run = console.runCmd("ifconfig -a | grep eth")
except ConsoleError, e:
FAIL(str(e))
- return = len(run['output'].splitlines())
+ return len(run['output'].splitlines())
def network_attach(domain_name, console):
eths_before = count_eth(console)
diff -r 3c21a174e8fc -r b9181b1c576f xen/arch/x86/shadow32.c
--- a/xen/arch/x86/shadow32.c Sat Nov 26 01:13:51 2005
+++ b/xen/arch/x86/shadow32.c Sat Nov 26 01:21:55 2005
@@ -800,13 +800,10 @@
/*
* Then free monitor_table.
- * Note: for VMX guest, only BSP need do this free.
*/
- if (!(VMX_DOMAIN(v) && v->vcpu_id)) {
- mfn = pagetable_get_pfn(v->arch.monitor_table);
- unmap_domain_page(v->arch.monitor_vtable);
- free_domheap_page(&frame_table[mfn]);
- }
+ mfn = pagetable_get_pfn(v->arch.monitor_table);
+ unmap_domain_page(v->arch.monitor_vtable);
+ free_domheap_page(&frame_table[mfn]);
v->arch.monitor_table = mk_pagetable(0);
v->arch.monitor_vtable = 0;
diff -r 3c21a174e8fc -r b9181b1c576f xen/arch/x86/shadow_public.c
--- a/xen/arch/x86/shadow_public.c Sat Nov 26 01:13:51 2005
+++ b/xen/arch/x86/shadow_public.c Sat Nov 26 01:21:55 2005
@@ -297,13 +297,11 @@
/*
* free monitor_table.
- * Note: for VMX guest, only BSP need do this free.
*/
- if (!(VMX_DOMAIN(v) && v->vcpu_id)) {
- mfn = pagetable_get_pfn(v->arch.monitor_table);
- unmap_domain_page(v->arch.monitor_vtable);
- free_domheap_page(&frame_table[mfn]);
- }
+ mfn = pagetable_get_pfn(v->arch.monitor_table);
+ unmap_domain_page(v->arch.monitor_vtable);
+ free_domheap_page(&frame_table[mfn]);
+
v->arch.monitor_table = mk_pagetable(0);
v->arch.monitor_vtable = 0;
}
@@ -396,18 +394,15 @@
/*
* Then free monitor_table.
- * Note: for VMX guest, only BSP need do this free.
*/
- if (!(VMX_DOMAIN(v) && v->vcpu_id)) {
- mfn = pagetable_get_pfn(v->arch.monitor_table);
- unmap_domain_page(v->arch.monitor_vtable);
- free_domheap_page(&frame_table[mfn]);
- }
+ mfn = pagetable_get_pfn(v->arch.monitor_table);
+ unmap_domain_page(v->arch.monitor_vtable);
+ free_domheap_page(&frame_table[mfn]);
v->arch.monitor_table = mk_pagetable(0);
v->arch.monitor_vtable = 0;
}
-#endif
+#endif
static void
shadow_free_snapshot(struct domain *d, struct out_of_sync_entry *entry)
diff -r 3c21a174e8fc -r b9181b1c576f xen/arch/x86/x86_32/mm.c
--- a/xen/arch/x86/x86_32/mm.c Sat Nov 26 01:13:51 2005
+++ b/xen/arch/x86/x86_32/mm.c Sat Nov 26 01:21:55 2005
@@ -27,6 +27,7 @@
#include <asm/page.h>
#include <asm/flushtlb.h>
#include <asm/fixmap.h>
+#include <public/memory.h>
extern l1_pgentry_t *mapcache;
@@ -184,6 +185,41 @@
}
}
+long arch_memory_op(int op, void *arg)
+{
+ struct xen_machphys_mfn_list xmml;
+ unsigned long mfn;
+ unsigned int i, max;
+ long rc = 0;
+
+ switch ( op )
+ {
+ case XENMEM_machphys_mfn_list:
+ if ( copy_from_user(&xmml, arg, sizeof(xmml)) )
+ return -EFAULT;
+
+ max = min_t(unsigned int, xmml.max_extents, mpt_size >> 21);
+
+ for ( i = 0; i < max; i++ )
+ {
+ mfn = l2e_get_pfn(idle_pg_table_l2[l2_linear_offset(
+ RDWR_MPT_VIRT_START + (i << 21))]) + l1_table_offset(i << 21);
+ if ( put_user(mfn, &xmml.extent_start[i]) )
+ return -EFAULT;
+ }
+
+ if ( put_user(i, &((struct xen_machphys_mfn_list *)arg)->nr_extents) )
+ return -EFAULT;
+
+ break;
+
+ default:
+ rc = -ENOSYS;
+ break;
+ }
+
+ return rc;
+}
long do_stack_switch(unsigned long ss, unsigned long esp)
{
diff -r 3c21a174e8fc -r b9181b1c576f xen/arch/x86/x86_64/mm.c
--- a/xen/arch/x86/x86_64/mm.c Sat Nov 26 01:13:51 2005
+++ b/xen/arch/x86/x86_64/mm.c Sat Nov 26 01:21:55 2005
@@ -28,6 +28,7 @@
#include <asm/flushtlb.h>
#include <asm/fixmap.h>
#include <asm/msr.h>
+#include <public/memory.h>
struct pfn_info *alloc_xen_pagetable(void)
{
@@ -172,6 +173,51 @@
page_set_owner(&frame_table[m2p_start_mfn+i], dom_xen);
}
}
+}
+
+long arch_memory_op(int op, void *arg)
+{
+ struct xen_machphys_mfn_list xmml;
+ l3_pgentry_t l3e;
+ l2_pgentry_t l2e;
+ unsigned long mfn, v;
+ unsigned int i;
+ long rc = 0;
+
+ switch ( op )
+ {
+ case XENMEM_machphys_mfn_list:
+ if ( copy_from_user(&xmml, arg, sizeof(xmml)) )
+ return -EFAULT;
+
+ for ( v = RDWR_MPT_VIRT_START; v != RDWR_MPT_VIRT_END; v += 1 << 21 )
+ {
+ l3e = l4e_to_l3e(idle_pg_table[l4_table_offset(v)])[
+ l3_table_offset(v)];
+ if ( !(l3e_get_flags(l3e) & _PAGE_PRESENT) )
+ break;
+ l2e = l3e_to_l2e(l3e)[l2_table_offset(v)];
+ if ( !(l2e_get_flags(l2e) & _PAGE_PRESENT) )
+ break;
+ mfn = l2e_get_pfn(l2e) + l1_table_offset(v);
+ if ( i == xmml.max_extents )
+ break;
+ if ( put_user(mfn, &xmml.extent_start[i]) )
+ return -EFAULT;
+ i++;
+ }
+
+ if ( put_user(i, &((struct xen_machphys_mfn_list *)arg)->nr_extents) )
+ return -EFAULT;
+
+ break;
+
+ default:
+ rc = -ENOSYS;
+ break;
+ }
+
+ return rc;
}
long do_stack_switch(unsigned long ss, unsigned long esp)
diff -r 3c21a174e8fc -r b9181b1c576f xen/common/memory.c
--- a/xen/common/memory.c Sat Nov 26 01:13:51 2005
+++ b/xen/common/memory.c Sat Nov 26 01:21:55 2005
@@ -215,7 +215,7 @@
break;
default:
- rc = -ENOSYS;
+ rc = arch_memory_op(op, arg);
break;
}
diff -r 3c21a174e8fc -r b9181b1c576f xen/include/asm-ia64/mm.h
--- a/xen/include/asm-ia64/mm.h Sat Nov 26 01:13:51 2005
+++ b/xen/include/asm-ia64/mm.h Sat Nov 26 01:21:55 2005
@@ -440,4 +440,7 @@
#define __gpa_to_mpa(_d, gpa) \
((__gpfn_to_mfn((_d),(gpa)>>PAGE_SHIFT)<<PAGE_SHIFT)|((gpa)&~PAGE_MASK))
+/* Arch-specific portion of memory_op hypercall. */
+#define arch_memory_op(op, arg) (-ENOSYS)
+
#endif /* __ASM_IA64_MM_H__ */
diff -r 3c21a174e8fc -r b9181b1c576f xen/include/asm-x86/mm.h
--- a/xen/include/asm-x86/mm.h Sat Nov 26 01:13:51 2005
+++ b/xen/include/asm-x86/mm.h Sat Nov 26 01:21:55 2005
@@ -379,6 +379,9 @@
void propagate_page_fault(unsigned long addr, u16 error_code);
-extern int __sync_lazy_execstate(void);
+int __sync_lazy_execstate(void);
+
+/* Arch-specific portion of memory_op hypercall. */
+long arch_memory_op(int op, void *arg);
#endif /* __ASM_X86_MM_H__ */
diff -r 3c21a174e8fc -r b9181b1c576f xen/include/public/memory.h
--- a/xen/include/public/memory.h Sat Nov 26 01:13:51 2005
+++ b/xen/include/public/memory.h Sat Nov 26 01:21:55 2005
@@ -60,6 +60,34 @@
#define XENMEM_current_reservation 3
#define XENMEM_maximum_reservation 4
+/*
+ * Returns a list of MFN bases of 2MB extents comprising the machine_to_phys
+ * mapping table. Architectures which do not have a m2p table do not implement
+ * this command.
+ * arg == addr of xen_machphys_mfn_list_t.
+ */
+#define XENMEM_machphys_mfn_list 5
+typedef struct xen_machphys_mfn_list {
+ /*
+ * Size of the 'extent_start' array. Fewer entries will be filled if the
+ * machphys table is smaller than max_extents * 2MB.
+ */
+ unsigned int max_extents;
+
+ /*
+ * Pointer to buffer to fill with list of extent starts. If there are
+ * any large discontiguities in the machine address space, 2MB gaps in
+ * the machphys table will be represented by an MFN base of zero.
+ */
+ unsigned long *extent_start;
+
+ /*
+ * Number of extents written to the above array. This will be smaller
+ * than 'max_extents' if the machphys table is smaller than max_e * 2MB.
+ */
+ unsigned int nr_extents;
+} xen_machphys_mfn_list_t;
+
#endif /* __XEN_PUBLIC_MEMORY_H__ */
/*
diff -r 3c21a174e8fc -r b9181b1c576f tools/xm-test/tests/_sanity/01_domu_proc.py
--- /dev/null Sat Nov 26 01:13:51 2005
+++ b/tools/xm-test/tests/_sanity/01_domu_proc.py Sat Nov 26 01:21:55 2005
@@ -0,0 +1,34 @@
+#!/usr/bin/python
+
+# Copyright (C) International Business Machines Corp., 2005
+# Author: Dan Smith <danms@xxxxxxxxxx>
+
+#
+# Test that the library and ramdisk are working to the point
+# that we can start a DomU and read /proc
+#
+
+from XmTestLib import *
+
+import re
+
+domain = XmTestDomain()
+
+try:
+ domain.start()
+except DomainError, e:
+ FAIL(str(e))
+
+try:
+ console = XmConsole(domain.getName())
+ console.sendInput("foo")
+ run = console.runCmd("cat /proc/cpuinfo")
+except ConsoleError, e:
+ FAIL(str(e))
+
+if run["return"] != 0:
+ FAIL("Unable to read /proc/cpuinfo")
+
+if not re.search("processor", run["output"]):
+ print run["output"]
+ FAIL("/proc/cpuinfo looks wrong!")
diff -r 3c21a174e8fc -r b9181b1c576f tools/xm-test/tests/_sanity/Makefile.am
--- /dev/null Sat Nov 26 01:13:51 2005
+++ b/tools/xm-test/tests/_sanity/Makefile.am Sat Nov 26 01:21:55 2005
@@ -0,0 +1,21 @@
+
+SUBDIRS =
+
+TESTS = 01_domu_proc.test
+
+XFAIL_TESTS =
+
+EXTRA_DIST = $(TESTS) $(XFAIL_TESTS)
+
+TESTS_ENVIRONMENT=@TENV@
+
+%.test: %.py
+ cp $< $@
+ chmod +x $@
+
+clean-local: am_config_clean-local
+
+am_config_clean-local:
+ rm -f *test
+ rm -f *log
+ rm -f *~
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|