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;
openSUSE Build Service is sponsored by