File valgrind.xen-3.4-versioned-hvmcontext_partial.patch of Package valgrind

From: Olaf Hering <olaf@aepfle.de>
Date: Fri, 16 Nov 2018 17:29:42 +0100
Subject: xen-3.4: versioned hvmcontext_partial

The layout of xen_domctl_hvmcontext_partial used from xen-3.4 up to xen-4.9.
Rename the existing code and use the domctl value from xen-3.4 as suffix.

Actually use the required layout for the member value.
The code to deal with xen-4.10 was not implemented.

Fixes commit c88133141a354d65568fb85037abc5e1f74ce46b

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

--- a/coregrind/m_syswrap/syswrap-xen.c
+++ b/coregrind/m_syswrap/syswrap-xen.c
@@ -880,48 +880,56 @@ PRE(domctl)
            __PRE_XEN_DOMCTL_READ(gethvmcontext, hvmcontext, size);
        break;
 
    case VKI_XEN_DOMCTL_sethvmcontext:
        __PRE_XEN_DOMCTL_READ(sethvmcontext, hvmcontext, size);
        __PRE_XEN_DOMCTL_READ(sethvmcontext, hvmcontext, buffer);
        PRE_MEM_READ("XEN_DOMCTL_sethvmcontext *buffer",
                     (Addr)domctl->u.hvmcontext.buffer.p,
                     domctl->u.hvmcontext.size);
        break;
 
    case VKI_XEN_DOMCTL_gethvmcontext_partial:
-       __PRE_XEN_DOMCTL_READ(gethvmcontext_partial, hvmcontext_partial_00000007, type);
-       __PRE_XEN_DOMCTL_READ(gethvmcontext_partial, hvmcontext_partial_00000007, instance);
-       __PRE_XEN_DOMCTL_READ(gethvmcontext_partial, hvmcontext_partial_00000007, buffer);
-
-       switch (domctl->u.hvmcontext_partial_00000007.type) {
-       case VKI_HVM_SAVE_CODE(CPU):
-           if ( domctl->u.hvmcontext_partial_00000007.buffer.p )
-                PRE_MEM_WRITE("XEN_DOMCTL_gethvmcontext_partial *buffer",
-                   (Addr)domctl->u.hvmcontext_partial_00000007.buffer.p,
-                   VKI_HVM_SAVE_LENGTH(CPU));
-           break;
-       case VKI_HVM_SAVE_CODE(MTRR):
-           if ( domctl->u.hvmcontext_partial_00000007.buffer.p )
-	        PRE_MEM_WRITE("XEN_DOMCTL_gethvmcontext_partial *buffer",
-		   (Addr)domctl->u.hvmcontext_partial_00000007.buffer.p,
-		   VKI_HVM_SAVE_LENGTH(MTRR));
-           break;
-       default:
-           bad_subop(tid, layout, arrghs, status, flags,
-                         "__HYPERVISOR_domctl_gethvmcontext_partial type",
-                         domctl->u.hvmcontext_partial_00000007.type);
-           break;
-       }
-       break;
+      switch (domctl->interface_version) {
+      case 0x00000007:
+      case 0x00000008:
+      case 0x00000009:
+      case 0x0000000a:
+      case 0x0000000b:
+         __PRE_XEN_DOMCTL_READ(gethvmcontext_partial, hvmcontext_partial_00000005, type);
+         __PRE_XEN_DOMCTL_READ(gethvmcontext_partial, hvmcontext_partial_00000005, instance);
+         __PRE_XEN_DOMCTL_READ(gethvmcontext_partial, hvmcontext_partial_00000005, buffer);
+
+         switch (domctl->u.hvmcontext_partial_00000005.type) {
+         case VKI_HVM_SAVE_CODE(CPU):
+            if ( domctl->u.hvmcontext_partial_00000005.buffer.p )
+               PRE_MEM_WRITE("XEN_DOMCTL_gethvmcontext_partial *buffer",
+                             (Addr)domctl->u.hvmcontext_partial_00000005.buffer.p,
+                             VKI_HVM_SAVE_LENGTH(CPU));
+            break;
+         case VKI_HVM_SAVE_CODE(MTRR):
+            if ( domctl->u.hvmcontext_partial_00000005.buffer.p )
+               PRE_MEM_WRITE("XEN_DOMCTL_gethvmcontext_partial *buffer",
+                             (Addr)domctl->u.hvmcontext_partial_00000005.buffer.p,
+                             VKI_HVM_SAVE_LENGTH(MTRR));
+            break;
+         default:
+            bad_subop(tid, layout, arrghs, status, flags,
+                      "__HYPERVISOR_domctl_gethvmcontext_partial type",
+                      domctl->u.hvmcontext_partial_00000005.type);
+            break;
+         }
+         break;
+      }
+      break;
 
    case VKI_XEN_DOMCTL_max_mem:
       PRE_XEN_DOMCTL_READ(max_mem, max_memkb);
       break;
 
    case VKI_XEN_DOMCTL_set_address_size:
       __PRE_XEN_DOMCTL_READ(set_address_size, address_size, size);
       break;
 
    case VKI_XEN_DOMCTL_test_assign_device:
       switch (domctl->interface_version) {
       case 0x00000007:
@@ -2203,32 +2211,39 @@ POST(domctl){
 
    case VKI_XEN_DOMCTL_gethvmcontext:
        /* Xen unconditionally writes size... */
        __POST_XEN_DOMCTL_WRITE(gethvmcontext, hvmcontext, size);
        /* ...but only writes to the buffer if it was non NULL */
        if ( domctl->u.hvmcontext.buffer.p )
            POST_MEM_WRITE((Addr)domctl->u.hvmcontext.buffer.p,
                           sizeof(*domctl->u.hvmcontext.buffer.p)
                           * domctl->u.hvmcontext.size);
        break;
 
    case VKI_XEN_DOMCTL_gethvmcontext_partial:
-       switch (domctl->u.hvmcontext_partial_00000007.type) {
-       case VKI_HVM_SAVE_CODE(CPU):
-           if ( domctl->u.hvmcontext_partial_00000007.buffer.p )
-                POST_MEM_WRITE((Addr)domctl->u.hvmcontext_partial_00000007.buffer.p,
-                   VKI_HVM_SAVE_LENGTH(CPU));
-           break;
-       }
-       break;
+      switch (domctl->interface_version) {
+      case 0x00000007:
+      case 0x00000008:
+      case 0x00000009:
+      case 0x0000000a:
+      case 0x0000000b:
+         switch (domctl->u.hvmcontext_partial_00000005.type) {
+         case VKI_HVM_SAVE_CODE(CPU):
+            if ( domctl->u.hvmcontext_partial_00000005.buffer.p )
+               POST_MEM_WRITE((Addr)domctl->u.hvmcontext_partial_00000005.buffer.p, VKI_HVM_SAVE_LENGTH(CPU));
+            break;
+         }
+         break;
+      }
+      break;
 
    case VKI_XEN_DOMCTL_scheduler_op:
       if ( domctl->u.scheduler_op.cmd == VKI_XEN_DOMCTL_SCHEDOP_getinfo ) {
          switch(domctl->u.scheduler_op.sched_id) {
          case VKI_XEN_SCHEDULER_SEDF:
             POST_XEN_DOMCTL_WRITE(scheduler_op, u.sedf.period);
             POST_XEN_DOMCTL_WRITE(scheduler_op, u.sedf.slice);
             POST_XEN_DOMCTL_WRITE(scheduler_op, u.sedf.latency);
             POST_XEN_DOMCTL_WRITE(scheduler_op, u.sedf.extratime);
             POST_XEN_DOMCTL_WRITE(scheduler_op, u.sedf.weight);
             break;
          case VKI_XEN_SCHEDULER_CREDIT:
--- a/include/vki/vki-xen-domctl.h
+++ b/include/vki/vki-xen-domctl.h
@@ -395,31 +395,31 @@ struct vki_xen_domctl_tsc_info_0000000b {
     vki_uint32_t pad;
     vki_xen_uint64_aligned_t elapsed_nsec;
 };
 
 
 struct vki_xen_domctl_hvmcontext {
     vki_uint32_t size; /* IN/OUT size of buffer */
     VKI_XEN_GUEST_HANDLE_64(vki_uint8) buffer; /* IN/OUT */
 };
 typedef struct vki_xen_domctl_hvmcontext vki_xen_domctl_hvmcontext_t;
 DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_domctl_hvmcontext_t);
 
-struct vki_xen_domctl_hvmcontext_partial_00000007 {
+struct vki_xen_domctl_hvmcontext_partial_00000005 {
     vki_uint32_t type; /* IN */
     vki_uint32_t instance; /* IN */
     VKI_XEN_GUEST_HANDLE_64(vki_uint8) buffer; /* IN/OUT buffer */
 };
-typedef struct vki_xen_domctl_hvmcontext_partial_00000007 vki_xen_domctl_hvmcontext_partial_00000007_t;
-DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_domctl_hvmcontext_partial_00000007_t);
+typedef struct vki_xen_domctl_hvmcontext_partial_00000005 vki_xen_domctl_hvmcontext_partial_00000005_t;
+DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_domctl_hvmcontext_partial_00000005_t);
 
 struct vki_xen_domctl_hvmcontext_partial_0000000e {
     vki_uint32_t type; /* IN */
     vki_uint32_t instance; /* IN */
     vki_xen_uint64_aligned_t bufsz; /* IN */
     VKI_XEN_GUEST_HANDLE_64(vki_uint8) buffer; /* OUT buffer */
 };
 typedef struct vki_xen_domctl_hvmcontext_partial_0000000e vki_xen_domctl_hvmcontext_partial_0000000e_t;
 DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_domctl_hvmcontext_partial_0000000e_t);
 
 struct vki_xen_domctl_pin_mem_cacheattr {
     vki_xen_uint64_aligned_t start, end; /* IN */
@@ -682,25 +682,25 @@ struct vki_xen_domctl {
         //struct vki_xen_domctl_setdebugging      setdebugging;
         struct vki_xen_domctl_irq_permission    irq_permission;
         struct vki_xen_domctl_iomem_permission  iomem_permission;
         struct vki_xen_domctl_ioport_permission ioport_permission;
         struct vki_xen_domctl_hypercall_init    hypercall_init;
         //struct vki_xen_domctl_arch_setup        arch_setup;
         struct vki_xen_domctl_settimeoffset_00000001     settimeoffset_00000001;
         //struct vki_xen_domctl_disable_migrate   disable_migrate;
         struct vki_xen_domctl_tsc_info_00000007   tsc_info_00000007;
         struct vki_xen_domctl_tsc_info_0000000b   tsc_info_0000000b;
         //struct vki_xen_domctl_real_mode_area    real_mode_area;
         struct vki_xen_domctl_hvmcontext        hvmcontext;
-        struct vki_xen_domctl_hvmcontext_partial_0000000e hvmcontext_partial_00000007;
+        struct vki_xen_domctl_hvmcontext_partial_00000005 hvmcontext_partial_00000005;
         struct vki_xen_domctl_hvmcontext_partial_0000000e hvmcontext_partial_0000000e;
         struct vki_xen_domctl_address_size      address_size;
         //struct vki_xen_domctl_sendtrigger       sendtrigger;
         //struct vki_xen_domctl_get_device_group  get_device_group;
         struct vki_xen_domctl_assign_device_00000007 assign_device_00000007;
         struct vki_xen_domctl_assign_device_0000000b assign_device_0000000b;
         //struct vki_xen_domctl_bind_pt_irq       bind_pt_irq;
         //struct vki_xen_domctl_memory_mapping    memory_mapping;
         //struct vki_xen_domctl_ioport_mapping    ioport_mapping;
         struct vki_xen_domctl_pin_mem_cacheattr pin_mem_cacheattr;
         struct vki_xen_domctl_ext_vcpucontext_00000008 ext_vcpucontext_00000008;
         struct vki_xen_domctl_ext_vcpucontext_00000009 ext_vcpucontext_00000009;
openSUSE Build Service is sponsored by