aboutsummaryrefslogtreecommitdiffstats
path: root/tools/libxc/xg_save_restore.h
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-02-13 10:43:13 +0000
committerKeir Fraser <keir.fraser@citrix.com>2008-02-13 10:43:13 +0000
commitcbd2de39520605f71f07f303ae592a816f6bbcb0 (patch)
treebdd3e5eccc5c5381bb5c992a3a2d614a66cd418c /tools/libxc/xg_save_restore.h
parent5ffec49444facf629f9cb4eab0cefa4433428d6e (diff)
downloadxen-cbd2de39520605f71f07f303ae592a816f6bbcb0.tar.gz
xen-cbd2de39520605f71f07f303ae592a816f6bbcb0.tar.bz2
xen-cbd2de39520605f71f07f303ae592a816f6bbcb0.zip
Tools: fix save/restore of 32-bit PV guests with 64-bit tools
by removing some obvious typos, handling CR3 folding and hvirt_start based on guest word-size, and understanding 32-bit INVALID_MFN. Signed-off-by: Tim Deegan <Tim.Deegan@citrix.com>
Diffstat (limited to 'tools/libxc/xg_save_restore.h')
-rw-r--r--tools/libxc/xg_save_restore.h17
1 files changed, 17 insertions, 0 deletions
diff --git a/tools/libxc/xg_save_restore.h b/tools/libxc/xg_save_restore.h
index b0379a4550..2da1e2090d 100644
--- a/tools/libxc/xg_save_restore.h
+++ b/tools/libxc/xg_save_restore.h
@@ -68,6 +68,13 @@ static inline int get_platform_info(int xc_handle, uint32_t dom,
*guest_width = domctl.u.address_size.size / 8;
+ /* 64-bit tools will see the 64-bit hvirt_start, but 32-bit guests
+ * will be using the compat one. */
+ if ( *guest_width < sizeof (unsigned long) )
+ /* XXX need to fix up a way of extracting this value from Xen if
+ * XXX it becomes variable for domU */
+ *hvirt_start = 0xf5800000;
+
if (strstr(xen_caps, "xen-3.0-x86_64"))
/* Depends on whether it's a compat 32-on-64 guest */
*pt_levels = ( (*guest_width == 8) ? 4 : 3 );
@@ -136,6 +143,16 @@ typedef union
(_p)->x32._f = (_v); \
} while (0)
+#define UNFOLD_CR3(_c) \
+ ((uint64_t)((guest_width == 8) \
+ ? ((_c) >> 12) \
+ : (((uint32_t)(_c) >> 12) | ((uint32_t)(_c) << 20))))
+
+#define FOLD_CR3(_c) \
+ ((uint64_t)((guest_width == 8) \
+ ? ((uint64_t)(_c)) << 12 \
+ : (((uint32_t)(_c) << 12) | ((uint32_t)(_c) >> 20))))
+
#define MEMCPY_FIELD(_d, _s, _f) do { \
if (guest_width == 8) \
memcpy(&(_d)->x64._f, &(_s)->x64._f,sizeof((_d)->x64._f)); \