This commit is contained in:
emellor@leeni.uk.xensource.com committed 2005-11-26 01:21:55 +00:00
commit 10e8ebd5bb
20 files changed
+248 -102

No files matched your search

+1 -1
View File
@@ -28,7 +28,7 @@ cp -fdRL $src/etc/init.d/* $dst/etc/init.d/
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/
@@ -213,55 +213,6 @@ static int privcmd_ioctl(struct inode *inode, struct file *file,
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;
@@ -59,11 +59,6 @@ typedef struct privcmd_mmapbatch {
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 @@ typedef struct privcmd_blkmsg
_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__ */
+1 -1
View File
@@ -7,7 +7,7 @@ function error {
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
+12 -3
View File
@@ -78,6 +78,7 @@ int uncanonicalize_pagetable(unsigned long type, void *page)
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 @@ int xc_linux_restore(int xc_handle, int io_fd,
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 @@ int xc_linux_restore(int xc_handle, int io_fd,
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 @@ int xc_linux_restore(int xc_handle, int io_fd,
n+= j; /* crude stats */
}
DPRINTF("Received all pages\n");
DPRINTF("Received all pages (%d races)\n", nraces);
if(pt_levels == 3) {
+13 -18
View File
@@ -502,7 +502,7 @@ static unsigned long *xc_map_m2p(int xc_handle,
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 @@ static unsigned long *xc_map_m2p(int xc_handle,
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;
+20
View File
@@ -190,6 +190,7 @@ int xc_memory_op(int xc_handle,
{
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 @@ int xc_memory_op(int xc_handle,
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);
@@ -227,6 +242,11 @@ int xc_memory_op(int xc_handle,
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;
}
out1:
+1
View File
@@ -35,6 +35,7 @@ AC_CONFIG_FILES([
Makefile
ramdisk/Makefile
tests/Makefile
tests/_sanity/Makefile
tests/block-list/Makefile
tests/block-create/Makefile
tests/block-destroy/Makefile
+15 -1
View File
@@ -14,6 +14,7 @@ usage() {
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
@@ -86,6 +87,15 @@ runnable_tests() {
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
}
# Get contact info if needed
@@ -119,7 +129,7 @@ get_contact_info() {
# 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 @@ while [ $# -gt 0 ]
-s)
run=no
;;
-h|--help)
usage
exit 0
;;
*)
REPORT=$1
break
@@ -0,0 +1,34 @@
#!/usr/bin/python
# Copyright (C) International Business Machines Corp., 2005
# Author: Dan Smith <danms@us.ibm.com>
#
# 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!")
+21
View File
@@ -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 *~
@@ -10,7 +10,7 @@ def count_eth(console):
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)
+3 -6
View File
@@ -800,13 +800,10 @@ void free_monitor_pagetable(struct vcpu *v)
/*
* 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;
+8 -13
View File
@@ -297,13 +297,11 @@ void free_monitor_pagetable(struct vcpu *v)
/*
* 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 @@ void free_monitor_pagetable(struct vcpu *v)
/*
* 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)
+36
View File
@@ -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 @@ void subarch_init_memory(struct domain *dom_xen)
}
}
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)
{
+46
View File
@@ -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)
{
@@ -174,6 +175,51 @@ void subarch_init_memory(struct domain *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)
{
if ( (ss & 3) != 3 )
+1 -1
View File
@@ -215,7 +215,7 @@ long do_memory_op(int cmd, void *arg)
break;
default:
rc = -ENOSYS;
rc = arch_memory_op(op, arg);
break;
}
+3
View File
@@ -440,4 +440,7 @@ extern unsigned long lookup_domain_mpa(struct domain *d, unsigned long mpaddr);
#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__ */
+4 -1
View File
@@ -379,6 +379,9 @@ int new_guest_cr3(unsigned long pfn);
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__ */
+28
View File
@@ -60,6 +60,34 @@ typedef struct xen_memory_reservation {
#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__ */
/*
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.