# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxxx
# Node ID 0340e579f06544431e915d17596ac144145a077e
# Parent 9900884577de164941fd75fe3d7689c0e8210495
[XEN] Add a warning about changeable size of shared_info structure.
sizeof(shared_info_t) can change even in compatible hypervisor
versions.
Add a clear warning about this, and fix the few places relying on it.
In addition, add some padding to arch_shared_info, to allow future
additions to the structure without breaking known offsets of members
following it in the shared info.
Signed-off-by: John Levon <john.levon@xxxxxxx>
---
tools/libxc/xc_hvm_build.c | 2 +-
tools/libxc/xc_linux_build.c | 4 ++--
tools/libxc/xc_linux_restore.c | 2 +-
xen/include/public/arch-ia64.h | 2 ++
xen/include/public/arch-powerpc.h | 1 +
xen/include/public/arch-x86_32.h | 1 +
xen/include/public/arch-x86_64.h | 1 +
xen/include/public/xen.h | 6 +++++-
8 files changed, 14 insertions(+), 5 deletions(-)
diff -r 9900884577de -r 0340e579f065 tools/libxc/xc_hvm_build.c
--- a/tools/libxc/xc_hvm_build.c Sat Aug 12 15:58:52 2006 +0100
+++ b/tools/libxc/xc_hvm_build.c Sat Aug 12 16:18:08 2006 +0100
@@ -303,7 +303,7 @@ static int setup_guest(int xc_handle,
xc_handle, dom, PAGE_SIZE, PROT_READ | PROT_WRITE,
shared_info_frame)) == 0 )
goto error_out;
- memset(shared_info, 0, sizeof(shared_info_t));
+ memset(shared_info, 0, PAGE_SIZE);
/* Mask all upcalls... */
for ( i = 0; i < MAX_VIRT_CPUS; i++ )
shared_info->vcpu_info[i].evtchn_upcall_mask = 1;
diff -r 9900884577de -r 0340e579f065 tools/libxc/xc_linux_build.c
--- a/tools/libxc/xc_linux_build.c Sat Aug 12 15:58:52 2006 +0100
+++ b/tools/libxc/xc_linux_build.c Sat Aug 12 16:18:08 2006 +0100
@@ -593,7 +593,7 @@ static int setup_guest(int xc_handle,
xc_handle, dom, PAGE_SIZE, PROT_READ|PROT_WRITE, shared_info_frame);
printf("shared_info = %p, err=%s frame=%lx\n",
shared_info, strerror (errno), shared_info_frame);
- //memset(shared_info, 0, sizeof(shared_info_t));
+ //memset(shared_info, 0, PAGE_SIZE);
/* Mask all upcalls... */
for ( i = 0; i < MAX_VIRT_CPUS; i++ )
shared_info->vcpu_info[i].evtchn_upcall_mask = 1;
@@ -1064,7 +1064,7 @@ static int setup_guest(int xc_handle,
/* shared_info page starts its life empty. */
shared_info = xc_map_foreign_range(
xc_handle, dom, PAGE_SIZE, PROT_READ|PROT_WRITE, shared_info_frame);
- memset(shared_info, 0, sizeof(shared_info_t));
+ memset(shared_info, 0, PAGE_SIZE);
/* Mask all upcalls... */
for ( i = 0; i < MAX_VIRT_CPUS; i++ )
shared_info->vcpu_info[i].evtchn_upcall_mask = 1;
diff -r 9900884577de -r 0340e579f065 tools/libxc/xc_linux_restore.c
--- a/tools/libxc/xc_linux_restore.c Sat Aug 12 15:58:52 2006 +0100
+++ b/tools/libxc/xc_linux_restore.c Sat Aug 12 16:18:08 2006 +0100
@@ -737,7 +737,7 @@ int xc_linux_restore(int xc_handle, int
/* Copy saved contents of shared-info page. No checking needed. */
page = xc_map_foreign_range(
xc_handle, dom, PAGE_SIZE, PROT_WRITE, shared_info_frame);
- memcpy(page, shared_info, sizeof(shared_info_t));
+ memcpy(page, shared_info, PAGE_SIZE);
munmap(page, PAGE_SIZE);
/* Uncanonicalise the pfn-to-mfn table frame-number list. */
diff -r 9900884577de -r 0340e579f065 xen/include/public/arch-ia64.h
--- a/xen/include/public/arch-ia64.h Sat Aug 12 15:58:52 2006 +0100
+++ b/xen/include/public/arch-ia64.h Sat Aug 12 16:18:08 2006 +0100
@@ -297,6 +297,8 @@ struct arch_shared_info {
/* Interrupt vector for event channel. */
int evtchn_vector;
+
+ uint64_t pad[32];
};
typedef struct arch_shared_info arch_shared_info_t;
diff -r 9900884577de -r 0340e579f065 xen/include/public/arch-powerpc.h
--- a/xen/include/public/arch-powerpc.h Sat Aug 12 15:58:52 2006 +0100
+++ b/xen/include/public/arch-powerpc.h Sat Aug 12 16:18:08 2006 +0100
@@ -107,6 +107,7 @@ DEFINE_XEN_GUEST_HANDLE(vcpu_guest_conte
DEFINE_XEN_GUEST_HANDLE(vcpu_guest_context_t);
struct arch_shared_info {
+ uint64_t pad[32];
};
struct arch_vcpu_info {
diff -r 9900884577de -r 0340e579f065 xen/include/public/arch-x86_32.h
--- a/xen/include/public/arch-x86_32.h Sat Aug 12 15:58:52 2006 +0100
+++ b/xen/include/public/arch-x86_32.h Sat Aug 12 16:18:08 2006 +0100
@@ -191,6 +191,7 @@ struct arch_shared_info {
/* Frame containing list of mfns containing list of mfns containing p2m. */
xen_pfn_t pfn_to_mfn_frame_list_list;
unsigned long nmi_reason;
+ uint64_t pad[32];
};
typedef struct arch_shared_info arch_shared_info_t;
diff -r 9900884577de -r 0340e579f065 xen/include/public/arch-x86_64.h
--- a/xen/include/public/arch-x86_64.h Sat Aug 12 15:58:52 2006 +0100
+++ b/xen/include/public/arch-x86_64.h Sat Aug 12 16:18:08 2006 +0100
@@ -261,6 +261,7 @@ struct arch_shared_info {
/* Frame containing list of mfns containing list of mfns containing p2m. */
xen_pfn_t pfn_to_mfn_frame_list_list;
unsigned long nmi_reason;
+ uint64_t pad[32];
};
typedef struct arch_shared_info arch_shared_info_t;
diff -r 9900884577de -r 0340e579f065 xen/include/public/xen.h
--- a/xen/include/public/xen.h Sat Aug 12 15:58:52 2006 +0100
+++ b/xen/include/public/xen.h Sat Aug 12 16:18:08 2006 +0100
@@ -376,7 +376,11 @@ typedef struct vcpu_info vcpu_info_t;
/*
* Xen/kernel shared data -- pointer provided in start_info.
- * NB. We expect that this struct is smaller than a page.
+ *
+ * This structure is defined to be both smaller than a page, and the
+ * only data on the shared page, but may vary in actual size even within
+ * compatible Xen versions; guests should not rely on the size
+ * of this structure remaining constant.
*/
struct shared_info {
struct vcpu_info vcpu_info[MAX_VIRT_CPUS];
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|