File valgrind.xen-4.6-handle-XEN_SYSCTL_cputopoinfo.patch of Package valgrind
From: Olaf Hering <olaf@aepfle.de>
Date: Fri, 16 Nov 2018 17:21:22 +0100
Subject: xen-4.6: handle XEN_SYSCTL_cputopoinfo
In xen-4.6 XEN_SYSCTL_topologyinfo was replaced by XEN_SYSCTL_cputopoinfo.
Both share the same number. Add code to catch both variants.
bz#390553
---
coregrind/m_syswrap/syswrap-xen.c | 14 ++++++++++++--
include/vki/vki-xen-sysctl.h | 15 +++++++++++++++
2 files changed, 27 insertions(+), 2 deletions(-)
--- a/coregrind/m_syswrap/syswrap-xen.c
+++ b/coregrind/m_syswrap/syswrap-xen.c
@@ -758,37 +758,41 @@ PRE(sysctl) {
PRE_XEN_SYSCTL_READ(cpupool_op, domid);
if (sysctl->u.cpupool_op.op == VKI_XEN_SYSCTL_CPUPOOL_OP_ADDCPU ||
sysctl->u.cpupool_op.op == VKI_XEN_SYSCTL_CPUPOOL_OP_RMCPU)
PRE_XEN_SYSCTL_READ(cpupool_op, cpu);
break;
case VKI_XEN_SYSCTL_physinfo:
/* No input params */
break;
- case VKI_XEN_SYSCTL_topologyinfo:
+ case VKI_XEN_SYSCTL_topologyinfo | VKI_XEN_SYSCTL_cputopoinfo:
switch (sysctl->interface_version)
{
case 0x00000007:
case 0x00000008:
case 0x00000009:
case 0x0000000a:
case 0x0000000b:
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 0x0000000c:
+ PRE_XEN_SYSCTL_READ(cputopoinfo_0000000c, num_cpus);
+ PRE_XEN_SYSCTL_READ(cputopoinfo_0000000c, cputopo);
+ break;
}
break;
case VKI_XEN_SYSCTL_numainfo:
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);
@@ -2120,43 +2124,49 @@ POST(sysctl)
POST_XEN_SYSCTL_WRITE(physinfo_00000010, max_node_id);
POST_XEN_SYSCTL_WRITE(physinfo_00000010, cpu_khz);
POST_XEN_SYSCTL_WRITE(physinfo_00000010, capabilities);
POST_XEN_SYSCTL_WRITE(physinfo_00000010, total_pages);
POST_XEN_SYSCTL_WRITE(physinfo_00000010, free_pages);
POST_XEN_SYSCTL_WRITE(physinfo_00000010, scrub_pages);
POST_XEN_SYSCTL_WRITE(physinfo_00000010, outstanding_pages);
POST_XEN_SYSCTL_WRITE(physinfo_00000010, max_mfn);
POST_XEN_SYSCTL_WRITE(physinfo_00000010, hw_cap[8]);
}
break;
- case VKI_XEN_SYSCTL_topologyinfo:
+ case VKI_XEN_SYSCTL_topologyinfo | VKI_XEN_SYSCTL_cputopoinfo:
switch (sysctl->interface_version)
{
case 0x00000007:
case 0x00000008:
case 0x00000009:
case 0x0000000a:
case 0x0000000b:
POST_XEN_SYSCTL_WRITE(topologyinfo, max_cpu_index);
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 0x0000000c:
+ POST_XEN_SYSCTL_WRITE(cputopoinfo_0000000c, num_cpus);
+ if (sysctl->u.cputopoinfo_0000000c.cputopo.p)
+ POST_MEM_WRITE((Addr)sysctl->u.cputopoinfo_0000000c.cputopo.p,
+ sizeof(vki_xen_sysctl_cputopo_0000000c_t) * sysctl->u.cputopoinfo_0000000c.num_cpus);
+ break;
}
break;
case VKI_XEN_SYSCTL_numainfo:
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,
--- a/include/vki/vki-xen-sysctl.h
+++ b/include/vki/vki-xen-sysctl.h
@@ -30,24 +30,25 @@
#define VKI_XEN_SYSCTL_sched_id 4
#define VKI_XEN_SYSCTL_perfc_op 5
#define VKI_XEN_SYSCTL_getdomaininfolist 6
#define VKI_XEN_SYSCTL_debug_keys 7
#define VKI_XEN_SYSCTL_getcpuinfo 8
#define VKI_XEN_SYSCTL_availheap 9
#define VKI_XEN_SYSCTL_get_pmstat 10
#define VKI_XEN_SYSCTL_cpu_hotplug 11
#define VKI_XEN_SYSCTL_pm_op 12
#define VKI_XEN_SYSCTL_page_offline_op 14
#define VKI_XEN_SYSCTL_lockprof_op 15
#define VKI_XEN_SYSCTL_topologyinfo 16
+#define VKI_XEN_SYSCTL_cputopoinfo 16 /* Since xen-4.6 */
#define VKI_XEN_SYSCTL_numainfo 17
#define VKI_XEN_SYSCTL_cpupool_op 18
#define VKI_XEN_SYSCTL_scheduler_op 19
#define VKI_XEN_SYSCTL_coverage_op 20
#define VKI_XEN_SYSCTL_psr_cmt_op 21
struct vki_xen_sysctl_readconsole {
/* IN */
vki_uint8_t clear;
vki_uint8_t incremental;
vki_uint8_t pad0, pad1;
@@ -123,24 +124,37 @@ 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_cputopo_0000000c {
+ vki_uint32_t core;
+ vki_uint32_t socket;
+ vki_uint32_t node;
+};
+typedef struct vki_xen_sysctl_cputopo_0000000c vki_xen_sysctl_cputopo_0000000c_t;
+DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_sysctl_cputopo_0000000c_t);
+
+struct vki_xen_sysctl_cputopoinfo_0000000c {
+ vki_uint32_t num_cpus;
+ VKI_XEN_GUEST_HANDLE_64(vki_xen_sysctl_cputopo_0000000c_t) cputopo;
+};
+
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_xen_sysctl_meminfo_0000000c {
vki_uint64_t memsize;
vki_uint64_t memfree;
};
typedef struct vki_xen_xen_sysctl_meminfo_0000000c vki_xen_xen_sysctl_meminfo_0000000c_t;
@@ -209,24 +223,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_cputopoinfo_0000000c cputopoinfo_0000000c;
struct vki_xen_sysctl_numainfo_00000008 numainfo_00000008;
struct vki_xen_sysctl_numainfo_0000000c numainfo_0000000c;
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;