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