File valgrind.xen-4.6-handle-XEN_SYSCTL_pcitopoinfo.patch of Package valgrind

From: Olaf Hering <olaf@aepfle.de>
Date: Fri, 16 Nov 2018 17:21:23 +0100
Subject: xen-4.6: handle XEN_SYSCTL_pcitopoinfo

bz#390553
---
 coregrind/m_syswrap/syswrap-xen.c | 20 ++++++++++++++++++++
 include/vki/vki-xen-physdev.h     |  9 +++++++++
 include/vki/vki-xen-sysctl.h      |  8 ++++++++
 3 files changed, 37 insertions(+)

--- a/coregrind/m_syswrap/syswrap-xen.c
+++ b/coregrind/m_syswrap/syswrap-xen.c
@@ -798,24 +798,34 @@ PRE(sysctl) {
          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;
       case 0x0000000c:
          PRE_XEN_SYSCTL_READ(numainfo_0000000c, num_nodes);
          PRE_XEN_SYSCTL_READ(numainfo_0000000c, meminfo);
          PRE_XEN_SYSCTL_READ(numainfo_0000000c, distance);
          break;
       }
       break;
 
+   case VKI_XEN_SYSCTL_pcitopoinfo:
+      switch (sysctl->interface_version)
+      {
+      case 0x0000000c:
+         PRE_XEN_SYSCTL_READ(pcitopoinfo_0000000c, num_devs);
+         PRE_XEN_SYSCTL_READ(pcitopoinfo_0000000c, devs);
+         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)
 {
    struct vki_xen_domctl *domctl = (struct vki_xen_domctl *)ARG1;
@@ -2179,24 +2189,34 @@ POST(sysctl)
          break;
       case 0x0000000c:
          POST_XEN_SYSCTL_WRITE(numainfo_0000000c, num_nodes);
          POST_MEM_WRITE((Addr)sysctl->u.numainfo_0000000c.meminfo.p,
                         sizeof(uint64_t) * sysctl->u.numainfo_0000000c.num_nodes);
          POST_MEM_WRITE((Addr)sysctl->u.numainfo_0000000c.distance.p,
                         sizeof(uint32_t) *
 			(sysctl->u.numainfo_0000000c.num_nodes * sysctl->u.numainfo_0000000c.num_nodes));
          break;
       }
       break;
 
+   case VKI_XEN_SYSCTL_pcitopoinfo:
+      switch (sysctl->interface_version)
+      {
+      case 0x0000000c:
+         POST_XEN_SYSCTL_WRITE(pcitopoinfo_0000000c, num_devs);
+         POST_MEM_WRITE((Addr)sysctl->u.pcitopoinfo_0000000c.nodes.p,
+                        sizeof(uint32_t) *  sysctl->u.pcitopoinfo_0000000c.num_devs);
+         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;
 
    switch (domctl->interface_version) {
--- a/include/vki/vki-xen-physdev.h
+++ b/include/vki/vki-xen-physdev.h
@@ -49,17 +49,26 @@ struct vki_xen_physdev_map_pirq {
     int entry_nr;
     /* IN */
     vki_uint64_t table_base;
 };
 
 #define VKI_XEN_PHYSDEVOP_unmap_pirq             14
 struct vki_xen_physdev_unmap_pirq {
     vki_xen_domid_t domid;
     /* IN */
     int pirq;
 };
 
+struct vki_physdev_pci_device {
+    /* IN */
+    vki_uint16_t seg;
+    vki_uint8_t bus;
+    vki_uint8_t devfn;
+};
+typedef struct vki_physdev_pci_device vki_physdev_pci_device_t;
+DEFINE_VKI_XEN_GUEST_HANDLE(vki_physdev_pci_device_t);
+
 #endif // __VKI_XEN_PHYSDEV_H
 
 /*--------------------------------------------------------------------*/
 /*--- end                                                          ---*/
 /*--------------------------------------------------------------------*/
--- a/include/vki/vki-xen-sysctl.h
+++ b/include/vki/vki-xen-sysctl.h
@@ -36,24 +36,25 @@
 #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
+#define VKI_XEN_SYSCTL_pcitopoinfo                   22
 
 struct vki_xen_sysctl_readconsole {
     /* IN */
     vki_uint8_t clear;
     vki_uint8_t incremental;
 
     vki_uint8_t pad0, pad1;
 
     /*
      * IN:  Start index for consumption if @incremental.
      * OUT: End index after consuming from the console.
      */
@@ -137,24 +138,30 @@ 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_pcitopoinfo_0000000c {
+    vki_uint32_t num_devs;
+    VKI_XEN_GUEST_HANDLE_64(vki_physdev_pci_device_t) devs;
+    VKI_XEN_GUEST_HANDLE_64(vki_uint32) nodes;
+};
+
 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;
@@ -224,24 +231,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_pcitopoinfo_0000000c pcitopoinfo_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