File valgrind.xen-4.1-versioned-XEN_SYSCTL_numainfo.patch of Package valgrind
From: Olaf Hering <olaf@aepfle.de>
Date: Fri, 16 Nov 2018 17:21:13 +0100
Subject: xen-4.1: versioned XEN_SYSCTL_numainfo
The XEN_SYSCTL_numainfo changed layout after xen-4.5.
Rename layout and handle runtime from xen-4.1 upto xen-4.5.
bz#390553
---
coregrind/m_syswrap/syswrap-xen.c | 40 ++++++---
include/vki/vki-xen-sysctl.h | 4 +-
2 files changed, 30 insertions(+), 14 deletions(-)
--- a/coregrind/m_syswrap/syswrap-xen.c
+++ b/coregrind/m_syswrap/syswrap-xen.c
@@ -764,28 +764,36 @@ PRE(sysctl) {
case VKI_XEN_SYSCTL_physinfo:
/* No input params */
break;
case VKI_XEN_SYSCTL_topologyinfo:
PRE_XEN_SYSCTL_READ(topologyinfo, max_cpu_index);
PRE_XEN_SYSCTL_READ(topologyinfo, cpu_to_core);
PRE_XEN_SYSCTL_READ(topologyinfo, cpu_to_socket);
PRE_XEN_SYSCTL_READ(topologyinfo, cpu_to_node);
break;
case VKI_XEN_SYSCTL_numainfo:
- PRE_XEN_SYSCTL_READ(numainfo, max_node_index);
- PRE_XEN_SYSCTL_READ(numainfo, node_to_memsize);
- PRE_XEN_SYSCTL_READ(numainfo, node_to_memfree);
- PRE_XEN_SYSCTL_READ(numainfo, node_to_node_distance);
+ switch (sysctl->interface_version)
+ {
+ case 0x00000008:
+ case 0x00000009:
+ case 0x0000000a:
+ case 0x0000000b:
+ PRE_XEN_SYSCTL_READ(numainfo_00000008, max_node_index);
+ PRE_XEN_SYSCTL_READ(numainfo_00000008, node_to_memsize);
+ PRE_XEN_SYSCTL_READ(numainfo_00000008, node_to_memfree);
+ PRE_XEN_SYSCTL_READ(numainfo_00000008, node_to_node_distance);
+ break;
+ }
break;
default:
bad_subop(tid, layout, arrghs, status, flags,
"__HYPERVISOR_sysctl", sysctl->cmd);
break;
}
#undef PRE_XEN_SYSCTL_READ
#undef __PRE_XEN_SYSCTL_READ
}
PRE(domctl)
@@ -2094,32 +2102,40 @@ POST(sysctl)
if (sysctl->u.topologyinfo.cpu_to_core.p)
POST_MEM_WRITE((Addr)sysctl->u.topologyinfo.cpu_to_core.p,
sizeof(uint32_t) * sysctl->u.topologyinfo.max_cpu_index);
if (sysctl->u.topologyinfo.cpu_to_socket.p)
POST_MEM_WRITE((Addr)sysctl->u.topologyinfo.cpu_to_socket.p,
sizeof(uint32_t) * sysctl->u.topologyinfo.max_cpu_index);
if (sysctl->u.topologyinfo.cpu_to_node.p)
POST_MEM_WRITE((Addr)sysctl->u.topologyinfo.cpu_to_node.p,
sizeof(uint32_t) * sysctl->u.topologyinfo.max_cpu_index);
break;
case VKI_XEN_SYSCTL_numainfo:
- POST_XEN_SYSCTL_WRITE(numainfo, max_node_index);
- POST_MEM_WRITE((Addr)sysctl->u.numainfo.node_to_memsize.p,
- sizeof(uint64_t) * sysctl->u.numainfo.max_node_index);
- POST_MEM_WRITE((Addr)sysctl->u.numainfo.node_to_memfree.p,
- sizeof(uint64_t) * sysctl->u.numainfo.max_node_index);
- POST_MEM_WRITE((Addr)sysctl->u.numainfo.node_to_node_distance.p,
- sizeof(uint32_t) *
- (sysctl->u.numainfo.max_node_index * sysctl->u.numainfo.max_node_index));
+ switch (sysctl->interface_version)
+ {
+ case 0x00000008:
+ case 0x00000009:
+ case 0x0000000a:
+ case 0x0000000b:
+ POST_XEN_SYSCTL_WRITE(numainfo_00000008, max_node_index);
+ POST_MEM_WRITE((Addr)sysctl->u.numainfo_00000008.node_to_memsize.p,
+ sizeof(uint64_t) * sysctl->u.numainfo_00000008.max_node_index);
+ POST_MEM_WRITE((Addr)sysctl->u.numainfo_00000008.node_to_memfree.p,
+ sizeof(uint64_t) * sysctl->u.numainfo_00000008.max_node_index);
+ POST_MEM_WRITE((Addr)sysctl->u.numainfo_00000008.node_to_node_distance.p,
+ sizeof(uint32_t) *
+ (sysctl->u.numainfo_00000008.max_node_index * sysctl->u.numainfo_00000008.max_node_index));
+ break;
+ }
break;
/* No outputs */
case VKI_XEN_SYSCTL_debug_keys:
break;
}
#undef POST_XEN_SYSCTL_WRITE
#undef __POST_XEN_SYSCTL_WRITE
}
POST(domctl){
struct vki_xen_domctl *domctl = (struct vki_xen_domctl *)ARG1;
--- a/include/vki/vki-xen-sysctl.h
+++ b/include/vki/vki-xen-sysctl.h
@@ -121,25 +121,25 @@ struct vki_xen_sysctl_debug_keys {
/* IN variables. */
VKI_XEN_GUEST_HANDLE_64(char) keys;
vki_uint32_t nr_keys;
};
struct vki_xen_sysctl_topologyinfo {
vki_uint32_t max_cpu_index;
VKI_XEN_GUEST_HANDLE_64(vki_uint32) cpu_to_core;
VKI_XEN_GUEST_HANDLE_64(vki_uint32) cpu_to_socket;
VKI_XEN_GUEST_HANDLE_64(vki_uint32) cpu_to_node;
};
-struct vki_xen_sysctl_numainfo {
+struct vki_xen_sysctl_numainfo_00000008 {
vki_uint32_t max_node_index;
VKI_XEN_GUEST_HANDLE_64(vki_uint64) node_to_memsize;
VKI_XEN_GUEST_HANDLE_64(vki_uint64) node_to_memfree;
VKI_XEN_GUEST_HANDLE_64(vki_uint32) node_to_node_distance;
};
struct vki_xen_sysctl_physinfo_00000008 {
vki_uint32_t threads_per_core;
vki_uint32_t cores_per_socket;
vki_uint32_t nr_cpus; /* # CPUs currently online */
vki_uint32_t max_cpu_id; /* Largest possible CPU ID on this host */
vki_uint32_t nr_nodes; /* # nodes currently online */
vki_uint32_t max_node_id; /* Largest possible node ID on this host */
@@ -193,25 +193,25 @@ struct vki_xen_sysctl_sched_id {
};
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_numainfo_00000008 numainfo_00000008;
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_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;