aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir@xen.org>2011-03-08 16:23:19 +0000
committerKeir Fraser <keir@xen.org>2011-03-08 16:23:19 +0000
commitf48395673e6d5c07ae7fc224a3ce24346b086e0c (patch)
tree14244e9517da0715e44d9fe174d15a686cfb2e9e
parentc7a057e756cb354d37ebb228cab269ac4acf5bba (diff)
downloadxen-f48395673e6d5c07ae7fc224a3ce24346b086e0c.tar.gz
xen-f48395673e6d5c07ae7fc224a3ce24346b086e0c.tar.bz2
xen-f48395673e6d5c07ae7fc224a3ce24346b086e0c.zip
x86, libxc: Fix xc_translate_foreign_address() for PV guests of
different bitness than dom0 (32-bit vs 64-bit). Original patch by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Keir Fraser <keir@xen.org> xen-unstable changeset: 22966:de49500f344a xen-unstable date: Thu Mar 03 17:46:44 2011 +0000
-rw-r--r--tools/include/xen-foreign/structs.py1
-rw-r--r--tools/libxc/xc_pagetab.c7
2 files changed, 5 insertions, 3 deletions
diff --git a/tools/include/xen-foreign/structs.py b/tools/include/xen-foreign/structs.py
index a1bc055a19..964829c534 100644
--- a/tools/include/xen-foreign/structs.py
+++ b/tools/include/xen-foreign/structs.py
@@ -53,6 +53,7 @@ defines = [ "__i386__",
# all archs
"xen_pfn_to_cr3",
+ "xen_cr3_to_pfn",
"XEN_LEGACY_MAX_VCPUS",
"MAX_GUEST_CMDLINE" ];
diff --git a/tools/libxc/xc_pagetab.c b/tools/libxc/xc_pagetab.c
index 1a4a3d01e5..40bf11a20a 100644
--- a/tools/libxc/xc_pagetab.c
+++ b/tools/libxc/xc_pagetab.c
@@ -46,11 +46,12 @@ unsigned long xc_translate_foreign_address(int xc_handle, uint32_t dom,
return 0;
if (domctl.u.address_size.size == 64) {
pt_levels = 4;
- paddr = ctx.x64.ctrlreg[3] & ~0xfffull;
+ paddr = (uint64_t)xen_cr3_to_pfn_x86_64(ctx.x64.ctrlreg[3])
+ << PAGE_SHIFT;
} else {
pt_levels = 3;
- paddr = (((uint64_t) xen_cr3_to_pfn(ctx.x32.ctrlreg[3]))
- << PAGE_SHIFT);
+ paddr = (uint64_t)xen_cr3_to_pfn_x86_32(ctx.x32.ctrlreg[3])
+ << PAGE_SHIFT;
}
}