File valgrind.xen-4.5-versioned-XEN_SYSCTL_topologyinfo.patch of Package valgrind

From: Olaf Hering <olaf@aepfle.de>
Date: Fri, 16 Nov 2018 17:21:12 +0100
Subject: xen-4.5: versioned XEN_SYSCTL_topologyinfo

The XEN_SYSCTL_topologyinfo was available until xen-4.5.
In xen-4.6 it was replaced by XEN_SYSCTL_cputopoinfo.
Both share the same sysctl number.

bz#390553
---
 coregrind/m_syswrap/syswrap-xen.c | 46 ++++++++++++++++++++++++++++++++--------------
 1 file changed, 32 insertions(+), 14 deletions(-)

--- a/coregrind/m_syswrap/syswrap-xen.c
+++ b/coregrind/m_syswrap/syswrap-xen.c
@@ -757,28 +757,37 @@ PRE(sysctl) {
 
       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:
-      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);
+      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;
+      }
       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);
          PRE_XEN_SYSCTL_READ(numainfo_00000008, node_to_memfree);
@@ -2085,34 +2094,43 @@ POST(sysctl)
          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:
-      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);
+      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;
+      }
       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,
                         sizeof(uint64_t) * sysctl->u.numainfo_00000008.max_node_index);
openSUSE Build Service is sponsored by