File valgrind.fix-XEN_SYSCTL_getdomaininfolist.patch of Package valgrind
From: Olaf Hering <olaf@aepfle.de>
Date: Fri, 28 Feb 2020 13:49:03 +0100
Subject: fix XEN_SYSCTL_getdomaininfolist
While there is just a single variant of xen_sysctl_getdomaininfolist for
XEN_SYSCTL_getdomaininfolist, the contained buffer pointer points to a
variant of xen_domctl_getdomaininfo_t. For the various Xen versions a
number of variants of xen_domctl_getdomaininfo_t exist. As a result,
each variant of xen_domctl_getdomaininfo_t needs a variant of
xen_sysctl_getdomaininfolist for POST(sysctl).
Remove variant 0000000a, such variant of xen_domctl_getdomaininfo_t does
not exist.
The next known variant is 0000000f
Signed-off-by: Olaf Hering <olaf@aepfle.de>
---
coregrind/m_syswrap/syswrap-xen.c | 84 +++++----
include/vki/vki-xen-domctl.h | 12 +-
include/vki/vki-xen-sysctl.h | 18 +-
3 files changed, 57 insertions(+), 57 deletions(-)
--- a/coregrind/m_syswrap/syswrap-xen.c
+++ b/coregrind/m_syswrap/syswrap-xen.c
@@ -667,53 +667,53 @@ PRE(sysctl) {
/* These are all unconditionally read */
PRE_XEN_SYSCTL_READ(readconsole, clear);
PRE_XEN_SYSCTL_READ(readconsole, incremental);
PRE_XEN_SYSCTL_READ(readconsole, buffer);
PRE_XEN_SYSCTL_READ(readconsole, count);
/* 'index' only read if 'incremental' is nonzero */
if (sysctl->u.readconsole.incremental)
PRE_XEN_SYSCTL_READ(readconsole, index);
break;
case VKI_XEN_SYSCTL_getdomaininfolist:
- switch (sysctl->interface_version)
- {
+ switch (sysctl->interface_version) {
+ case 0x00000007:
+ PRE_XEN_SYSCTL_READ(getdomaininfolist_00000007, first_domain);
+ PRE_XEN_SYSCTL_READ(getdomaininfolist_00000007, max_domains);
+ PRE_XEN_SYSCTL_READ(getdomaininfolist_00000007, buffer);
+ break;
case 0x00000008:
- PRE_XEN_SYSCTL_READ(getdomaininfolist_00000008, first_domain);
- PRE_XEN_SYSCTL_READ(getdomaininfolist_00000008, max_domains);
- PRE_XEN_SYSCTL_READ(getdomaininfolist_00000008, buffer);
- break;
+ PRE_XEN_SYSCTL_READ(getdomaininfolist_00000008, first_domain);
+ PRE_XEN_SYSCTL_READ(getdomaininfolist_00000008, max_domains);
+ PRE_XEN_SYSCTL_READ(getdomaininfolist_00000008, buffer);
+ break;
case 0x00000009:
- PRE_XEN_SYSCTL_READ(getdomaininfolist_00000009, first_domain);
- PRE_XEN_SYSCTL_READ(getdomaininfolist_00000009, max_domains);
- PRE_XEN_SYSCTL_READ(getdomaininfolist_00000009, buffer);
- break;
case 0x0000000a:
case 0x0000000b:
case 0x0000000c:
case 0x0000000d:
case 0x0000000e:
+ PRE_XEN_SYSCTL_READ(getdomaininfolist_00000009, first_domain);
+ PRE_XEN_SYSCTL_READ(getdomaininfolist_00000009, max_domains);
+ PRE_XEN_SYSCTL_READ(getdomaininfolist_00000009, buffer);
+ break;
case 0x0000000f:
- PRE_XEN_SYSCTL_READ(getdomaininfolist_0000000a, first_domain);
- PRE_XEN_SYSCTL_READ(getdomaininfolist_0000000a, max_domains);
- PRE_XEN_SYSCTL_READ(getdomaininfolist_0000000a, buffer);
- break;
case 0x00000010:
case 0x00000011:
case 0x00000012:
- PRE_XEN_SYSCTL_READ(getdomaininfolist_00000010, first_domain);
- PRE_XEN_SYSCTL_READ(getdomaininfolist_00000010, max_domains);
- PRE_XEN_SYSCTL_READ(getdomaininfolist_00000010, buffer);
- break;
+ PRE_XEN_SYSCTL_READ(getdomaininfolist_0000000f, first_domain);
+ PRE_XEN_SYSCTL_READ(getdomaininfolist_0000000f, max_domains);
+ PRE_XEN_SYSCTL_READ(getdomaininfolist_0000000f, buffer);
+ break;
default:
VG_(dmsg)("WARNING: XEN_SYSCTL_getdomaininfolist for sysctl version "
"%"PRIx32" not implemented yet\n",
sysctl->interface_version);
SET_STATUS_Failure(VKI_EINVAL);
return;
}
break;
case VKI_XEN_SYSCTL_debug_keys:
PRE_XEN_SYSCTL_READ(debug_keys, keys);
PRE_XEN_SYSCTL_READ(debug_keys, nr_keys);
@@ -1910,57 +1910,61 @@ POST(sysctl)
POST_MEM_WRITE((Addr)&sysctl->u._union._field, \
sizeof(sysctl->u._union._field))
#define POST_XEN_SYSCTL_WRITE(_sysctl, _field) \
__POST_XEN_SYSCTL_WRITE(_sysctl, _sysctl, _field)
switch (sysctl->cmd) {
case VKI_XEN_SYSCTL_readconsole:
POST_MEM_WRITE((Addr)sysctl->u.readconsole.buffer.p,
sysctl->u.readconsole.count * sizeof(char));
break;
case VKI_XEN_SYSCTL_getdomaininfolist:
- switch (sysctl->interface_version)
- {
+ switch (sysctl->interface_version) {
+ case 0x00000007:
+ POST_XEN_SYSCTL_WRITE(getdomaininfolist_00000007, num_domains);
+ if (sysctl->u.getdomaininfolist_00000007.num_domains > 0)
+ POST_MEM_WRITE((Addr)sysctl->u.getdomaininfolist_00000007.buffer.p,
+ sizeof(*sysctl->u.getdomaininfolist_00000007.buffer.p) *
+ sysctl->u.getdomaininfolist_00000007.num_domains);
+ break;
case 0x00000008:
- POST_XEN_SYSCTL_WRITE(getdomaininfolist_00000008, num_domains);
- POST_MEM_WRITE((Addr)sysctl->u.getdomaininfolist_00000008.buffer.p,
- sizeof(*sysctl->u.getdomaininfolist_00000008.buffer.p)
- * sysctl->u.getdomaininfolist_00000008.num_domains);
- break;
+ POST_XEN_SYSCTL_WRITE(getdomaininfolist_00000008, num_domains);
+ if (sysctl->u.getdomaininfolist_00000008.num_domains > 0)
+ POST_MEM_WRITE((Addr)sysctl->u.getdomaininfolist_00000008.buffer.p,
+ sizeof(*sysctl->u.getdomaininfolist_00000008.buffer.p) *
+ sysctl->u.getdomaininfolist_00000008.num_domains);
+ break;
case 0x00000009:
- POST_XEN_SYSCTL_WRITE(getdomaininfolist_00000009, num_domains);
- POST_MEM_WRITE((Addr)sysctl->u.getdomaininfolist_00000009.buffer.p,
- sizeof(*sysctl->u.getdomaininfolist_00000009.buffer.p)
- * sysctl->u.getdomaininfolist_00000009.num_domains);
- break;
case 0x0000000a:
case 0x0000000b:
case 0x0000000c:
case 0x0000000d:
case 0x0000000e:
+ POST_XEN_SYSCTL_WRITE(getdomaininfolist_00000009, num_domains);
+ if (sysctl->u.getdomaininfolist_00000009.num_domains > 0)
+ POST_MEM_WRITE((Addr)sysctl->u.getdomaininfolist_00000009.buffer.p,
+ sizeof(*sysctl->u.getdomaininfolist_00000009.buffer.p) *
+ sysctl->u.getdomaininfolist_00000009.num_domains);
+ break;
case 0x0000000f:
- POST_XEN_SYSCTL_WRITE(getdomaininfolist_0000000a, num_domains);
- POST_MEM_WRITE((Addr)sysctl->u.getdomaininfolist_0000000a.buffer.p,
- sizeof(*sysctl->u.getdomaininfolist_0000000a.buffer.p)
- * sysctl->u.getdomaininfolist_0000000a.num_domains);
- break;
case 0x00000010:
case 0x00000011:
case 0x00000012:
- POST_XEN_SYSCTL_WRITE(getdomaininfolist_00000010, num_domains);
- POST_MEM_WRITE((Addr)sysctl->u.getdomaininfolist_00000010.buffer.p,
- sizeof(*sysctl->u.getdomaininfolist_00000010.buffer.p)
- * sysctl->u.getdomaininfolist_00000010.num_domains);
- break;
+ POST_XEN_SYSCTL_WRITE(getdomaininfolist_0000000f, num_domains);
+ if (sysctl->u.getdomaininfolist_0000000f.num_domains > 0)
+ POST_MEM_WRITE((Addr)sysctl->u.getdomaininfolist_0000000f.buffer.p,
+ sizeof(*sysctl->u.getdomaininfolist_0000000f.buffer.p) *
+ sysctl->u.getdomaininfolist_0000000f.num_domains);
+ break;
}
break;
case VKI_XEN_SYSCTL_sched_id:
POST_XEN_SYSCTL_WRITE(sched_id, sched_id);
break;
case VKI_XEN_SYSCTL_cpupool_op:
if (sysctl->u.cpupool_op.op == VKI_XEN_SYSCTL_CPUPOOL_OP_CREATE ||
sysctl->u.cpupool_op.op == VKI_XEN_SYSCTL_CPUPOOL_OP_INFO)
POST_XEN_SYSCTL_WRITE(cpupool_op, cpupool_id);
if (sysctl->u.cpupool_op.op == VKI_XEN_SYSCTL_CPUPOOL_OP_INFO) {
--- a/include/vki/vki-xen-domctl.h
+++ b/include/vki/vki-xen-domctl.h
@@ -180,50 +180,48 @@ struct vki_xen_domctl_getdomaininfo_00000009 {
vki_xen_uint64_aligned_t shared_info_frame;
vki_xen_uint64_aligned_t cpu_time;
vki_uint32_t nr_online_vcpus;
vki_uint32_t max_vcpu_id;
vki_uint32_t ssidref;
vki_xen_domain_handle_t handle;
vki_uint32_t cpupool;
};
typedef struct vki_xen_domctl_getdomaininfo_00000009 vki_xen_domctl_getdomaininfo_00000009_t;
DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_domctl_getdomaininfo_00000009_t);
// x86 version only for now
-struct vki_xen_arch_domainconfig_00000010 {
+struct vki_xen_arch_domainconfig_0000000b {
vki_uint32_t emulation_flags;
};
-struct vki_xen_domctl_getdomaininfo_00000010 {
+struct vki_xen_domctl_getdomaininfo_0000000f {
/* OUT variables. */
vki_xen_domid_t domain;
vki_uint32_t flags;
vki_xen_uint64_aligned_t tot_pages;
vki_xen_uint64_aligned_t max_pages;
vki_xen_uint64_aligned_t outstanding_pages;
vki_xen_uint64_aligned_t shr_pages;
vki_xen_uint64_aligned_t paged_pages;
vki_xen_uint64_aligned_t shared_info_frame;
vki_xen_uint64_aligned_t cpu_time;
vki_uint32_t nr_online_vcpus;
vki_uint32_t max_vcpu_id;
vki_uint32_t ssidref;
vki_xen_domain_handle_t handle;
vki_uint32_t cpupool;
- struct vki_xen_arch_domainconfig_00000010 arch;
+ struct vki_xen_arch_domainconfig_0000000b arch;
};
-typedef struct vki_xen_domctl_getdomaininfo_00000010 vki_xen_domctl_getdomaininfo_00000010_t;
-DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_domctl_getdomaininfo_00000010_t);
-
-/* vki_xen_domctl_getdomaininfo_0000000a is the same as 00000009 */
+typedef struct vki_xen_domctl_getdomaininfo_0000000f vki_xen_domctl_getdomaininfo_0000000f_t;
+DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_domctl_getdomaininfo_0000000f_t);
/* Get/set the NUMA node(s) with which the guest has affinity with. */
/* XEN_DOMCTL_setnodeaffinity */
/* XEN_DOMCTL_getnodeaffinity */
struct vki_xen_domctl_nodeaffinity {
struct vki_xenctl_bitmap nodemap;/* IN */
};
typedef struct vki_xen_domctl_nodeaffinity vki_xen_domctl_nodeaffinity_t;
DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_domctl_nodeaffinity_t);
struct vki_xen_domctl_getpageframeinfo3 {
vki_xen_uint64_aligned_t num; /* IN */
--- a/include/vki/vki-xen-sysctl.h
+++ b/include/vki/vki-xen-sysctl.h
@@ -51,62 +51,59 @@ struct vki_xen_sysctl_readconsole {
* OUT: End index after consuming from the console.
*/
vki_uint32_t index;
VKI_XEN_GUEST_HANDLE_64(char) buffer; /* IN */
/*
* IN: size of buffer.
* OUT: bytes written into buffer.
*/
vki_uint32_t count;
};
-struct vki_xen_sysctl_getdomaininfolist_00000008 {
+struct vki_xen_sysctl_getdomaininfolist_00000007 {
/* IN variables. */
vki_xen_domid_t first_domain;
vki_uint32_t max_domains;
VKI_XEN_GUEST_HANDLE_64(vki_xen_domctl_getdomaininfo_00000007_t) buffer;
/* OUT variables. */
vki_uint32_t num_domains;
};
-
-struct vki_xen_sysctl_getdomaininfolist_00000009 {
+struct vki_xen_sysctl_getdomaininfolist_00000008 {
/* IN variables. */
vki_xen_domid_t first_domain;
vki_uint32_t max_domains;
VKI_XEN_GUEST_HANDLE_64(vki_xen_domctl_getdomaininfo_00000008_t) buffer;
/* OUT variables. */
vki_uint32_t num_domains;
};
-struct vki_xen_sysctl_getdomaininfolist_0000000a {
+struct vki_xen_sysctl_getdomaininfolist_00000009 {
/* IN variables. */
vki_xen_domid_t first_domain;
vki_uint32_t max_domains;
VKI_XEN_GUEST_HANDLE_64(vki_xen_domctl_getdomaininfo_00000009_t) buffer;
/* OUT variables. */
vki_uint32_t num_domains;
};
-struct vki_xen_sysctl_getdomaininfolist_00000010 {
+struct vki_xen_sysctl_getdomaininfolist_0000000f {
/* IN variables. */
vki_xen_domid_t first_domain;
vki_uint32_t max_domains;
- VKI_XEN_GUEST_HANDLE_64(vki_xen_domctl_getdomaininfo_00000010_t) buffer;
+ VKI_XEN_GUEST_HANDLE_64(vki_xen_domctl_getdomaininfo_0000000f_t) buffer;
/* OUT variables. */
vki_uint32_t num_domains;
};
-/* vki_xen_sysctl_getdomaininfolist_0000000b is the same as 0000000a */
-
#define VKI_XEN_SYSCTL_CPUPOOL_OP_CREATE 1 /* C */
#define VKI_XEN_SYSCTL_CPUPOOL_OP_DESTROY 2 /* D */
#define VKI_XEN_SYSCTL_CPUPOOL_OP_INFO 3 /* I */
#define VKI_XEN_SYSCTL_CPUPOOL_OP_ADDCPU 4 /* A */
#define VKI_XEN_SYSCTL_CPUPOOL_OP_RMCPU 5 /* R */
#define VKI_XEN_SYSCTL_CPUPOOL_OP_MOVEDOMAIN 6 /* M */
#define VKI_XEN_SYSCTL_CPUPOOL_OP_FREEINFO 7 /* F */
#define VKI_XEN_SYSCTL_CPUPOOL_PAR_ANY 0xFFFFFFFF
struct vki_xen_sysctl_cpupool_op {
vki_uint32_t op; /* IN */
vki_uint32_t cpupool_id; /* IN: CDIARM OUT: CI */
vki_uint32_t sched_id; /* IN: C OUT: I */
@@ -195,28 +192,29 @@ struct vki_xen_sysctl {
vki_uint32_t cmd;
vki_uint32_t interface_version; /* XEN_SYSCTL_INTERFACE_VERSION */
union {
struct vki_xen_sysctl_readconsole readconsole;
//struct vki_xen_sysctl_tbuf_op tbuf_op;
struct vki_xen_sysctl_physinfo_00000008 physinfo_00000008;
struct vki_xen_sysctl_physinfo_0000000a physinfo_0000000a;
struct vki_xen_sysctl_physinfo_00000010 physinfo_00000010;
struct vki_xen_sysctl_topologyinfo topologyinfo;
struct vki_xen_sysctl_numainfo numainfo;
struct vki_xen_sysctl_sched_id sched_id;
//struct vki_xen_sysctl_perfc_op perfc_op;
+ /* getdomaininfolist (sysctl) suffix is the getdomaininfo (domctl) suffix */
+ struct vki_xen_sysctl_getdomaininfolist_00000007 getdomaininfolist_00000007;
struct vki_xen_sysctl_getdomaininfolist_00000008 getdomaininfolist_00000008;
struct vki_xen_sysctl_getdomaininfolist_00000009 getdomaininfolist_00000009;
- struct vki_xen_sysctl_getdomaininfolist_0000000a getdomaininfolist_0000000a;
- struct vki_xen_sysctl_getdomaininfolist_00000010 getdomaininfolist_00000010;
+ struct vki_xen_sysctl_getdomaininfolist_0000000f getdomaininfolist_0000000f;
struct vki_xen_sysctl_debug_keys debug_keys;
//struct vki_xen_sysctl_getcpuinfo getcpuinfo;
//struct vki_xen_sysctl_availheap availheap;
//struct vki_xen_sysctl_get_pmstat get_pmstat;
//struct vki_xen_sysctl_cpu_hotplug cpu_hotplug;
//struct vki_xen_sysctl_pm_op pm_op;
//struct vki_xen_sysctl_page_offline_op page_offline;
//struct vki_xen_sysctl_lockprof_op lockprof_op;
struct vki_xen_sysctl_cpupool_op cpupool_op;
//struct vki_xen_sysctl_scheduler_op scheduler_op;
//struct vki_xen_sysctl_coverage_op coverage_op;