File valgrind.xen-4.7-versioned-xen_arch_domainconfig.patch of Package valgrind

From: Olaf Hering <olaf@aepfle.de>
Date: Fri, 23 Nov 2018 15:45:25 +0100
Subject: xen-4.7: versioned xen_arch_domainconfig

New layout in xen-4.7, update xen_domctl_createdomain.
Use value 0x0c as suffix and case, even if this is the domctl value of xen-4.8.
This is because the domctl value was not updated for the release of xen-4.7.

bz#390553
---
 coregrind/m_syswrap/syswrap-xen.c | 37 ++++++++++++++++++++++++++++++-------
 include/vki/vki-xen-domctl.h      | 25 ++++++++++++++++++++++++-
 2 files changed, 54 insertions(+), 8 deletions(-)

--- a/coregrind/m_syswrap/syswrap-xen.c
+++ b/coregrind/m_syswrap/syswrap-xen.c
@@ -900,35 +900,58 @@ PRE(domctl)
 
    case VKI_XEN_DOMCTL_createdomain:
       switch (domctl->interface_version) {
       case 0x00000007:
       case 0x00000008:
       case 0x00000009:
       case 0x0000000a:
          PRE_XEN_DOMCTL_READ(createdomain_00000004, ssidref);
          PRE_XEN_DOMCTL_READ(createdomain_00000004, handle);
          PRE_XEN_DOMCTL_READ(createdomain_00000004, flags);
          break;
       case 0x0000000b:
-         PRE_XEN_DOMCTL_READ(createdomain_0000000b, ssidref);
-         PRE_XEN_DOMCTL_READ(createdomain_0000000b, handle);
-         PRE_XEN_DOMCTL_READ(createdomain_0000000b, flags);
+      case 0x0000000c:
+         switch (vki_assumed_xenversion) {
+         case vki_xenversion_406:
+            PRE_XEN_DOMCTL_READ(createdomain_0000000b, ssidref);
+            PRE_XEN_DOMCTL_READ(createdomain_0000000b, handle);
+            PRE_XEN_DOMCTL_READ(createdomain_0000000b, flags);
 #if defined(__i386__) || defined(__x86_64__)
-         __PRE_XEN_DOMCTL_READ(createdomain_0000000b, createdomain_0000000b, config.dummy);
+            __PRE_XEN_DOMCTL_READ(createdomain_0000000b, createdomain_0000000b, config.dummy);
 #endif
 #if defined(__arm__) || defined(__aarch64__)
-         __PRE_XEN_DOMCTL_READ(createdomain_0000000b, createdomain_0000000b, config.gic_version);
-         __PRE_XEN_DOMCTL_READ(createdomain_0000000b, createdomain_0000000b, config.nr_spis);
-         __PRE_XEN_DOMCTL_READ(createdomain_0000000b, createdomain_0000000b, config.clock_frequency);
+            __PRE_XEN_DOMCTL_READ(createdomain_0000000b, createdomain_0000000b, config.gic_version);
+            __PRE_XEN_DOMCTL_READ(createdomain_0000000b, createdomain_0000000b, config.nr_spis);
+            __PRE_XEN_DOMCTL_READ(createdomain_0000000b, createdomain_0000000b, config.clock_frequency);
 #endif
+            break;
+         case vki_xenversion_unset:
+         case vki_xenversion_406_or_407:
+            vki_report_unknown_xenversion("VKI_XEN_DOMCTL_createdomain");
+            /* fallthrough */
+         case vki_xenversion_407:
+         default:
+            PRE_XEN_DOMCTL_READ(createdomain_0000000c, ssidref);
+            PRE_XEN_DOMCTL_READ(createdomain_0000000c, handle);
+            PRE_XEN_DOMCTL_READ(createdomain_0000000c, flags);
+#if defined(__i386__) || defined(__x86_64__)
+            __PRE_XEN_DOMCTL_READ(createdomain_0000000c, createdomain_0000000c, config.emulation_flags);
+#endif
+#if defined(__arm__) || defined(__aarch64__)
+            __PRE_XEN_DOMCTL_READ(createdomain_0000000c, createdomain_0000000c, config.gic_version);
+            __PRE_XEN_DOMCTL_READ(createdomain_0000000c, createdomain_0000000c, config.nr_spis);
+            __PRE_XEN_DOMCTL_READ(createdomain_0000000c, createdomain_0000000c, config.clock_frequency);
+#endif
+            break;
+         }
          break;
       }
       break;
 
    case VKI_XEN_DOMCTL_gethvmcontext:
        /* Xen unconditionally reads the 'buffer' pointer */
        __PRE_XEN_DOMCTL_READ(gethvmcontext, hvmcontext, buffer);
        /* Xen only consumes 'size' if 'buffer' is non NULL. A NULL
         * buffer is a request for the required size. */
        if ( domctl->u.hvmcontext.buffer.p )
            __PRE_XEN_DOMCTL_READ(gethvmcontext, hvmcontext, size);
        break;
--- a/include/vki/vki-xen-domctl.h
+++ b/include/vki/vki-xen-domctl.h
@@ -141,32 +141,54 @@ struct vki_xen_arch_domainconfig_0000000b {
 #if defined(__i386__) || defined(__x86_64__)
     vki_uint8_t dummy;
 #endif
 #if defined(__arm__) || defined(__aarch64__)
     /* IN/OUT */
     vki_uint8_t gic_version;
     /* IN */
     vki_uint32_t nr_spis;
     vki_uint32_t clock_frequency;
 #endif
 };
 
+/* The layout changed in 4.07, which shares domctl with 4.06 */
+struct vki_xen_arch_domainconfig_0000000c {
+#if defined(__i386__) || defined(__x86_64__)
+    vki_uint32_t emulation_flags;
+#endif
+#if defined(__arm__) || defined(__aarch64__)
+    /* IN/OUT */
+    vki_uint8_t gic_version;
+    /* IN */
+    vki_uint32_t nr_spis;
+    vki_uint32_t clock_frequency;
+#endif
+};
+
 struct vki_xen_domctl_createdomain_0000000b {
     /* IN parameters */
     vki_uint32_t ssidref;
     vki_xen_domain_handle_t handle;
     vki_uint32_t flags;
     struct vki_xen_arch_domainconfig_0000000b config;
 };
 
+struct vki_xen_domctl_createdomain_0000000c {
+    /* IN parameters */
+    vki_uint32_t ssidref;
+    vki_xen_domain_handle_t handle;
+    vki_uint32_t flags;
+    struct vki_xen_arch_domainconfig_0000000c config;
+};
+
 struct vki_xen_domctl_getdomaininfo_00000007 {
     /* 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 shr_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;
@@ -222,25 +244,25 @@ struct vki_xen_domctl_getdomaininfo_0000000f {
     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_0000000b arch;
+    struct vki_xen_arch_domainconfig_0000000c arch;
 };
 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);
@@ -684,24 +706,25 @@ struct vki_xen_domctl_monitor_op_00000011 {
             vki_uint8_t sync;
         } debug_exception;
     } u;
 };
 
 struct vki_xen_domctl {
     vki_uint32_t cmd;
     vki_uint32_t interface_version; /* XEN_DOMCTL_INTERFACE_VERSION */
     vki_xen_domid_t  domain;
     union {
         struct vki_xen_domctl_createdomain_00000004  createdomain_00000004;
         struct vki_xen_domctl_createdomain_0000000b  createdomain_0000000b;
+        struct vki_xen_domctl_createdomain_0000000c  createdomain_0000000c;
         struct vki_xen_domctl_getdomaininfo_00000007 getdomaininfo_00000007;
         struct vki_xen_domctl_getdomaininfo_00000008 getdomaininfo_00000008;
         struct vki_xen_domctl_getdomaininfo_00000009 getdomaininfo_00000009;
         //struct vki_xen_domctl_getmemlist        getmemlist;
         //struct vki_xen_domctl_getpageframeinfo  getpageframeinfo;
         //struct vki_xen_domctl_getpageframeinfo2 getpageframeinfo2;
         struct vki_xen_domctl_getpageframeinfo3 getpageframeinfo3;
         struct vki_xen_domctl_nodeaffinity      nodeaffinity;
         struct vki_xen_domctl_vcpuaffinity_00000009 vcpuaffinity_00000009;
         struct vki_xen_domctl_vcpuaffinity_0000000a vcpuaffinity_0000000a;
         struct vki_xen_domctl_shadow_op         shadow_op;
         struct vki_xen_domctl_max_mem           max_mem;
openSUSE Build Service is sponsored by