mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
[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@sun.com>
This commit is contained in:
1 parent
ec0ebb15e5
commit
3321c3c8e9
8 files changed
+14
-5
No files matched your search
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -737,7 +737,7 @@ int xc_linux_restore(int xc_handle, int io_fd,
|
||||
/* 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. */
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -107,6 +107,7 @@ typedef struct vcpu_guest_context vcpu_guest_context_t;
|
||||
DEFINE_XEN_GUEST_HANDLE(vcpu_guest_context_t);
|
||||
|
||||
struct arch_shared_info {
|
||||
uint64_t pad[32];
|
||||
};
|
||||
|
||||
struct arch_vcpu_info {
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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];
|
||||
|
||||