File valgrind.fix-XEN_SYSCTL_getdomaininfolist.patch of Package valgrind

From: Olaf Hering <olaf@aepfle.de>
Date: Fri, 28 Feb 2020 13:49:03 +0100
Subject: fix XEN_SYSCTL_getdomaininfolist

While there is just a single variant of xen_sysctl_getdomaininfolist for
XEN_SYSCTL_getdomaininfolist, the contained buffer pointer points to a
variant of xen_domctl_getdomaininfo_t. For the various Xen versions a
number of variants of xen_domctl_getdomaininfo_t exist. As a result,
each variant of xen_domctl_getdomaininfo_t needs a variant of
xen_sysctl_getdomaininfolist for POST(sysctl).

Remove variant 0000000a, such variant of xen_domctl_getdomaininfo_t does
not exist.

The next known variant is 0000000f

Signed-off-by: Olaf Hering <olaf@aepfle.de>
---
 coregrind/m_syswrap/syswrap-xen.c | 84 +++++----
 include/vki/vki-xen-domctl.h      | 12 +-
 include/vki/vki-xen-sysctl.h      | 18 +-
 3 files changed, 57 insertions(+), 57 deletions(-)

--- a/coregrind/m_syswrap/syswrap-xen.c
+++ b/coregrind/m_syswrap/syswrap-xen.c
@@ -667,53 +667,53 @@ PRE(sysctl) {
        /* These are all unconditionally read */
        PRE_XEN_SYSCTL_READ(readconsole, clear);
        PRE_XEN_SYSCTL_READ(readconsole, incremental);
        PRE_XEN_SYSCTL_READ(readconsole, buffer);
        PRE_XEN_SYSCTL_READ(readconsole, count);
 
        /* 'index' only read if 'incremental' is nonzero */
        if (sysctl->u.readconsole.incremental)
            PRE_XEN_SYSCTL_READ(readconsole, index);
        break;
 
    case VKI_XEN_SYSCTL_getdomaininfolist:
-      switch (sysctl->interface_version)
-      {
+      switch (sysctl->interface_version) {
+      case 0x00000007:
+         PRE_XEN_SYSCTL_READ(getdomaininfolist_00000007, first_domain);
+         PRE_XEN_SYSCTL_READ(getdomaininfolist_00000007, max_domains);
+         PRE_XEN_SYSCTL_READ(getdomaininfolist_00000007, buffer);
+         break;
       case 0x00000008:
-	 PRE_XEN_SYSCTL_READ(getdomaininfolist_00000008, first_domain);
-	 PRE_XEN_SYSCTL_READ(getdomaininfolist_00000008, max_domains);
-	 PRE_XEN_SYSCTL_READ(getdomaininfolist_00000008, buffer);
-	 break;
+         PRE_XEN_SYSCTL_READ(getdomaininfolist_00000008, first_domain);
+         PRE_XEN_SYSCTL_READ(getdomaininfolist_00000008, max_domains);
+         PRE_XEN_SYSCTL_READ(getdomaininfolist_00000008, buffer);
+         break;
       case 0x00000009:
-	 PRE_XEN_SYSCTL_READ(getdomaininfolist_00000009, first_domain);
-	 PRE_XEN_SYSCTL_READ(getdomaininfolist_00000009, max_domains);
-	 PRE_XEN_SYSCTL_READ(getdomaininfolist_00000009, buffer);
-	 break;
       case 0x0000000a:
       case 0x0000000b:
       case 0x0000000c:
       case 0x0000000d:
       case 0x0000000e:
+         PRE_XEN_SYSCTL_READ(getdomaininfolist_00000009, first_domain);
+         PRE_XEN_SYSCTL_READ(getdomaininfolist_00000009, max_domains);
+         PRE_XEN_SYSCTL_READ(getdomaininfolist_00000009, buffer);
+         break;
       case 0x0000000f:
-	 PRE_XEN_SYSCTL_READ(getdomaininfolist_0000000a, first_domain);
-	 PRE_XEN_SYSCTL_READ(getdomaininfolist_0000000a, max_domains);
-	 PRE_XEN_SYSCTL_READ(getdomaininfolist_0000000a, buffer);
-	 break;
       case 0x00000010:
       case 0x00000011:
       case 0x00000012:
-     PRE_XEN_SYSCTL_READ(getdomaininfolist_00000010, first_domain);
-     PRE_XEN_SYSCTL_READ(getdomaininfolist_00000010, max_domains);
-     PRE_XEN_SYSCTL_READ(getdomaininfolist_00000010, buffer);
-	 break;
+         PRE_XEN_SYSCTL_READ(getdomaininfolist_0000000f, first_domain);
+         PRE_XEN_SYSCTL_READ(getdomaininfolist_0000000f, max_domains);
+         PRE_XEN_SYSCTL_READ(getdomaininfolist_0000000f, buffer);
+         break;
       default:
           VG_(dmsg)("WARNING: XEN_SYSCTL_getdomaininfolist for sysctl version "
                     "%"PRIx32" not implemented yet\n",
                     sysctl->interface_version);
           SET_STATUS_Failure(VKI_EINVAL);
           return;
       }
       break;
 
    case VKI_XEN_SYSCTL_debug_keys:
        PRE_XEN_SYSCTL_READ(debug_keys, keys);
        PRE_XEN_SYSCTL_READ(debug_keys, nr_keys);
@@ -1910,57 +1910,61 @@ POST(sysctl)
       POST_MEM_WRITE((Addr)&sysctl->u._union._field,            \
                      sizeof(sysctl->u._union._field))
 #define POST_XEN_SYSCTL_WRITE(_sysctl, _field) \
       __POST_XEN_SYSCTL_WRITE(_sysctl, _sysctl, _field)
 
    switch (sysctl->cmd) {
    case VKI_XEN_SYSCTL_readconsole:
        POST_MEM_WRITE((Addr)sysctl->u.readconsole.buffer.p,
                       sysctl->u.readconsole.count * sizeof(char));
        break;
 
    case VKI_XEN_SYSCTL_getdomaininfolist:
-      switch (sysctl->interface_version)
-      {
+      switch (sysctl->interface_version) {
+      case 0x00000007:
+         POST_XEN_SYSCTL_WRITE(getdomaininfolist_00000007, num_domains);
+         if (sysctl->u.getdomaininfolist_00000007.num_domains > 0)
+            POST_MEM_WRITE((Addr)sysctl->u.getdomaininfolist_00000007.buffer.p,
+               sizeof(*sysctl->u.getdomaininfolist_00000007.buffer.p) *
+               sysctl->u.getdomaininfolist_00000007.num_domains);
+         break;
       case 0x00000008:
-	 POST_XEN_SYSCTL_WRITE(getdomaininfolist_00000008, num_domains);
-	 POST_MEM_WRITE((Addr)sysctl->u.getdomaininfolist_00000008.buffer.p,
-			sizeof(*sysctl->u.getdomaininfolist_00000008.buffer.p)
-			* sysctl->u.getdomaininfolist_00000008.num_domains);
-	 break;
+         POST_XEN_SYSCTL_WRITE(getdomaininfolist_00000008, num_domains);
+         if (sysctl->u.getdomaininfolist_00000008.num_domains > 0)
+            POST_MEM_WRITE((Addr)sysctl->u.getdomaininfolist_00000008.buffer.p,
+               sizeof(*sysctl->u.getdomaininfolist_00000008.buffer.p) *
+               sysctl->u.getdomaininfolist_00000008.num_domains);
+         break;
       case 0x00000009:
-	 POST_XEN_SYSCTL_WRITE(getdomaininfolist_00000009, num_domains);
-	 POST_MEM_WRITE((Addr)sysctl->u.getdomaininfolist_00000009.buffer.p,
-			sizeof(*sysctl->u.getdomaininfolist_00000009.buffer.p)
-			* sysctl->u.getdomaininfolist_00000009.num_domains);
-	 break;
       case 0x0000000a:
       case 0x0000000b:
       case 0x0000000c:
       case 0x0000000d:
       case 0x0000000e:
+         POST_XEN_SYSCTL_WRITE(getdomaininfolist_00000009, num_domains);
+         if (sysctl->u.getdomaininfolist_00000009.num_domains > 0)
+            POST_MEM_WRITE((Addr)sysctl->u.getdomaininfolist_00000009.buffer.p,
+               sizeof(*sysctl->u.getdomaininfolist_00000009.buffer.p) *
+               sysctl->u.getdomaininfolist_00000009.num_domains);
+         break;
       case 0x0000000f:
-	 POST_XEN_SYSCTL_WRITE(getdomaininfolist_0000000a, num_domains);
-	 POST_MEM_WRITE((Addr)sysctl->u.getdomaininfolist_0000000a.buffer.p,
-			sizeof(*sysctl->u.getdomaininfolist_0000000a.buffer.p)
-			* sysctl->u.getdomaininfolist_0000000a.num_domains);
-	 break;
       case 0x00000010:
       case 0x00000011:
       case 0x00000012:
-	 POST_XEN_SYSCTL_WRITE(getdomaininfolist_00000010, num_domains);
-	 POST_MEM_WRITE((Addr)sysctl->u.getdomaininfolist_00000010.buffer.p,
-			sizeof(*sysctl->u.getdomaininfolist_00000010.buffer.p)
-			* sysctl->u.getdomaininfolist_00000010.num_domains);
-	 break;
+         POST_XEN_SYSCTL_WRITE(getdomaininfolist_0000000f, num_domains);
+         if (sysctl->u.getdomaininfolist_0000000f.num_domains > 0)
+            POST_MEM_WRITE((Addr)sysctl->u.getdomaininfolist_0000000f.buffer.p,
+               sizeof(*sysctl->u.getdomaininfolist_0000000f.buffer.p) *
+               sysctl->u.getdomaininfolist_0000000f.num_domains);
+         break;
       }
       break;
 
    case VKI_XEN_SYSCTL_sched_id:
        POST_XEN_SYSCTL_WRITE(sched_id, sched_id);
        break;
 
    case VKI_XEN_SYSCTL_cpupool_op:
       if (sysctl->u.cpupool_op.op == VKI_XEN_SYSCTL_CPUPOOL_OP_CREATE ||
           sysctl->u.cpupool_op.op == VKI_XEN_SYSCTL_CPUPOOL_OP_INFO)
          POST_XEN_SYSCTL_WRITE(cpupool_op, cpupool_id);
       if (sysctl->u.cpupool_op.op == VKI_XEN_SYSCTL_CPUPOOL_OP_INFO) {
--- a/include/vki/vki-xen-domctl.h
+++ b/include/vki/vki-xen-domctl.h
@@ -180,50 +180,48 @@ struct vki_xen_domctl_getdomaininfo_00000009 {
     vki_xen_uint64_aligned_t shared_info_frame;
     vki_xen_uint64_aligned_t cpu_time;
     vki_uint32_t nr_online_vcpus;
     vki_uint32_t max_vcpu_id;
     vki_uint32_t ssidref;
     vki_xen_domain_handle_t handle;
     vki_uint32_t cpupool;
 };
 typedef struct vki_xen_domctl_getdomaininfo_00000009 vki_xen_domctl_getdomaininfo_00000009_t;
 DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_domctl_getdomaininfo_00000009_t);
 
 // x86 version only for now
-struct vki_xen_arch_domainconfig_00000010 {
+struct vki_xen_arch_domainconfig_0000000b {
     vki_uint32_t emulation_flags;
 };
 
-struct vki_xen_domctl_getdomaininfo_00000010 {
+struct vki_xen_domctl_getdomaininfo_0000000f {
     /* OUT variables. */
     vki_xen_domid_t  domain;
     vki_uint32_t flags;
     vki_xen_uint64_aligned_t tot_pages;
     vki_xen_uint64_aligned_t max_pages;
     vki_xen_uint64_aligned_t outstanding_pages;
     vki_xen_uint64_aligned_t shr_pages;
     vki_xen_uint64_aligned_t paged_pages;
     vki_xen_uint64_aligned_t shared_info_frame;
     vki_xen_uint64_aligned_t cpu_time;
     vki_uint32_t nr_online_vcpus;
     vki_uint32_t max_vcpu_id;
     vki_uint32_t ssidref;
     vki_xen_domain_handle_t handle;
     vki_uint32_t cpupool;
-    struct vki_xen_arch_domainconfig_00000010 arch;
+    struct vki_xen_arch_domainconfig_0000000b arch;
 };
-typedef struct vki_xen_domctl_getdomaininfo_00000010 vki_xen_domctl_getdomaininfo_00000010_t;
-DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_domctl_getdomaininfo_00000010_t);
-
-/* vki_xen_domctl_getdomaininfo_0000000a is the same as 00000009 */
+typedef struct vki_xen_domctl_getdomaininfo_0000000f vki_xen_domctl_getdomaininfo_0000000f_t;
+DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_domctl_getdomaininfo_0000000f_t);
 
 /* Get/set the NUMA node(s) with which the guest has affinity with. */
 /* XEN_DOMCTL_setnodeaffinity */
 /* XEN_DOMCTL_getnodeaffinity */
 struct vki_xen_domctl_nodeaffinity {
     struct vki_xenctl_bitmap nodemap;/* IN */
 };
 typedef struct vki_xen_domctl_nodeaffinity vki_xen_domctl_nodeaffinity_t;
 DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_domctl_nodeaffinity_t);
 
 struct vki_xen_domctl_getpageframeinfo3 {
     vki_xen_uint64_aligned_t num; /* IN */
--- a/include/vki/vki-xen-sysctl.h
+++ b/include/vki/vki-xen-sysctl.h
@@ -51,62 +51,59 @@ struct vki_xen_sysctl_readconsole {
      * OUT: End index after consuming from the console.
      */
     vki_uint32_t index;
     VKI_XEN_GUEST_HANDLE_64(char) buffer; /* IN */
 
     /*
      * IN:  size of buffer.
      * OUT: bytes written into buffer.
      */
     vki_uint32_t count;
 };
 
-struct vki_xen_sysctl_getdomaininfolist_00000008 {
+struct vki_xen_sysctl_getdomaininfolist_00000007 {
     /* IN variables. */
     vki_xen_domid_t           first_domain;
     vki_uint32_t              max_domains;
     VKI_XEN_GUEST_HANDLE_64(vki_xen_domctl_getdomaininfo_00000007_t) buffer;
     /* OUT variables. */
     vki_uint32_t              num_domains;
 };
-
-struct vki_xen_sysctl_getdomaininfolist_00000009 {
+struct vki_xen_sysctl_getdomaininfolist_00000008 {
     /* IN variables. */
     vki_xen_domid_t           first_domain;
     vki_uint32_t              max_domains;
     VKI_XEN_GUEST_HANDLE_64(vki_xen_domctl_getdomaininfo_00000008_t) buffer;
     /* OUT variables. */
     vki_uint32_t              num_domains;
 };
 
-struct vki_xen_sysctl_getdomaininfolist_0000000a {
+struct vki_xen_sysctl_getdomaininfolist_00000009 {
     /* IN variables. */
     vki_xen_domid_t           first_domain;
     vki_uint32_t              max_domains;
     VKI_XEN_GUEST_HANDLE_64(vki_xen_domctl_getdomaininfo_00000009_t) buffer;
     /* OUT variables. */
     vki_uint32_t              num_domains;
 };
 
-struct vki_xen_sysctl_getdomaininfolist_00000010 {
+struct vki_xen_sysctl_getdomaininfolist_0000000f {
     /* IN variables. */
     vki_xen_domid_t           first_domain;
     vki_uint32_t              max_domains;
-    VKI_XEN_GUEST_HANDLE_64(vki_xen_domctl_getdomaininfo_00000010_t) buffer;
+    VKI_XEN_GUEST_HANDLE_64(vki_xen_domctl_getdomaininfo_0000000f_t) buffer;
     /* OUT variables. */
     vki_uint32_t              num_domains;
 };
 
-/* vki_xen_sysctl_getdomaininfolist_0000000b is the same as 0000000a */
-
 #define VKI_XEN_SYSCTL_CPUPOOL_OP_CREATE                1  /* C */
 #define VKI_XEN_SYSCTL_CPUPOOL_OP_DESTROY               2  /* D */
 #define VKI_XEN_SYSCTL_CPUPOOL_OP_INFO                  3  /* I */
 #define VKI_XEN_SYSCTL_CPUPOOL_OP_ADDCPU                4  /* A */
 #define VKI_XEN_SYSCTL_CPUPOOL_OP_RMCPU                 5  /* R */
 #define VKI_XEN_SYSCTL_CPUPOOL_OP_MOVEDOMAIN            6  /* M */
 #define VKI_XEN_SYSCTL_CPUPOOL_OP_FREEINFO              7  /* F */
 #define VKI_XEN_SYSCTL_CPUPOOL_PAR_ANY     0xFFFFFFFF
 struct vki_xen_sysctl_cpupool_op {
     vki_uint32_t op;          /* IN */
     vki_uint32_t cpupool_id;  /* IN: CDIARM OUT: CI */
     vki_uint32_t sched_id;    /* IN: C      OUT: I  */
@@ -195,28 +192,29 @@ 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_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_0000000a getdomaininfolist_0000000a;
-        struct vki_xen_sysctl_getdomaininfolist_00000010 getdomaininfolist_00000010;
+        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;
         //struct vki_xen_sysctl_pm_op             pm_op;
         //struct vki_xen_sysctl_page_offline_op   page_offline;
         //struct vki_xen_sysctl_lockprof_op       lockprof_op;
         struct vki_xen_sysctl_cpupool_op        cpupool_op;
         //struct vki_xen_sysctl_scheduler_op      scheduler_op;
         //struct vki_xen_sysctl_coverage_op       coverage_op;
 
openSUSE Build Service is sponsored by