File valgrind.xen-4.10-handle-xen_domctl_assign_device.patch of Package valgrind

From: Olaf Hering <olaf@aepfle.de>
Date: Fri, 16 Nov 2018 17:29:41 +0100
Subject: xen-4.10: handle xen_domctl_assign_device

The flags member moved in xen_domctl_assign_device. Copy the existing
code and handle xen-4.10.

Fixes commit c88133141a354d65568fb85037abc5e1f74ce46b.

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

--- a/coregrind/m_syswrap/syswrap-xen.c
+++ b/coregrind/m_syswrap/syswrap-xen.c
@@ -1045,122 +1045,169 @@ PRE(domctl)
 
    case VKI_XEN_DOMCTL_test_assign_device:
       switch (domctl->interface_version) {
       case 0x00000007:
       case 0x00000008:
       case 0x00000009:
       case 0x0000000a:
          __PRE_XEN_DOMCTL_READ(test_assign_device, assign_device_00000007, machine_sbdf);
          break;
       case 0x0000000b:
       case 0x0000000c:
       case 0x0000000d:
-      case 0x0000000e:
-      case 0x0000000f:
-      case 0x00000010:
-      case 0x00000011:
-      case 0x00000012:
          __PRE_XEN_DOMCTL_READ(test_assign_device, assign_device_0000000b, dev);
          __PRE_XEN_DOMCTL_READ(test_assign_device, assign_device_0000000b, flag);
          switch (domctl->u.assign_device_0000000b.dev) {
          case VKI_XEN_DOMCTL_DEV_PCI:
             __PRE_XEN_DOMCTL_READ(test_assign_device, assign_device_0000000b, u.pci);
             break;
          case VKI_XEN_DOMCTL_DEV_DT:
             __PRE_XEN_DOMCTL_READ(test_assign_device, assign_device_0000000b, u.dt);
             PRE_MEM_READ("XEN_DOMTCL_test_assign_device.dt",
                           (Addr)domctl->u.assign_device_0000000b.u.dt.path.p,
                           domctl->u.assign_device_0000000b.u.dt.size);
             break;
          default:
             bad_subop(tid, layout, arrghs, status, flags,
                          "__HYPERVISOR_domctl_test_assign_device dev",
                          domctl->u.assign_device_0000000b.dev);
             break;
          }
          break;
+      case 0x0000000e:
+      case 0x0000000f:
+      case 0x00000010:
+      case 0x00000011:
+      case 0x00000012:
+         __PRE_XEN_DOMCTL_READ(test_assign_device, assign_device_0000000e, dev);
+         __PRE_XEN_DOMCTL_READ(test_assign_device, assign_device_0000000e, flags);
+         switch (domctl->u.assign_device_0000000e.dev) {
+         case VKI_XEN_DOMCTL_DEV_PCI:
+            __PRE_XEN_DOMCTL_READ(test_assign_device, assign_device_0000000e, u.pci);
+            break;
+         case VKI_XEN_DOMCTL_DEV_DT:
+            __PRE_XEN_DOMCTL_READ(test_assign_device, assign_device_0000000e, u.dt);
+            PRE_MEM_READ("XEN_DOMTCL_test_assign_device.dt",
+                          (Addr)domctl->u.assign_device_0000000e.u.dt.path.p,
+                          domctl->u.assign_device_0000000e.u.dt.size);
+            break;
+         default:
+            bad_subop(tid, layout, arrghs, status, flags,
+                         "__HYPERVISOR_domctl_test_assign_device dev",
+                         domctl->u.assign_device_0000000e.dev);
+            break;
+         }
+         break;
       }
       break;
    case VKI_XEN_DOMCTL_assign_device:
       switch (domctl->interface_version) {
       case 0x00000007:
       case 0x00000008:
       case 0x00000009:
       case 0x0000000a:
          __PRE_XEN_DOMCTL_READ(assign_device, assign_device_00000007, machine_sbdf);
          break;
       case 0x0000000b:
       case 0x0000000c:
       case 0x0000000d:
-      case 0x0000000e:
-      case 0x0000000f:
-      case 0x00000010:
-      case 0x00000011:
-      case 0x00000012:
          __PRE_XEN_DOMCTL_READ(assign_device, assign_device_0000000b, dev);
          __PRE_XEN_DOMCTL_READ(assign_device, assign_device_0000000b, flag);
          switch (domctl->u.assign_device_0000000b.dev) {
          case VKI_XEN_DOMCTL_DEV_PCI:
             __PRE_XEN_DOMCTL_READ(assign_device, assign_device_0000000b, u.pci);
             break;
          case VKI_XEN_DOMCTL_DEV_DT:
             __PRE_XEN_DOMCTL_READ(assign_device, assign_device_0000000b, u.dt);
             PRE_MEM_READ("XEN_DOMTCL_assign_device.dt",
                           (Addr)domctl->u.assign_device_0000000b.u.dt.path.p,
                           domctl->u.assign_device_0000000b.u.dt.size);
             break;
          default:
             bad_subop(tid, layout, arrghs, status, flags,
                          "__HYPERVISOR_domctl_assign_device dev",
                          domctl->u.assign_device_0000000b.dev);
             break;
          }
          break;
+      case 0x0000000e:
+      case 0x0000000f:
+      case 0x00000010:
+      case 0x00000011:
+      case 0x00000012:
+         __PRE_XEN_DOMCTL_READ(assign_device, assign_device_0000000e, dev);
+         __PRE_XEN_DOMCTL_READ(assign_device, assign_device_0000000e, flags);
+         switch (domctl->u.assign_device_0000000e.dev) {
+         case VKI_XEN_DOMCTL_DEV_PCI:
+            __PRE_XEN_DOMCTL_READ(assign_device, assign_device_0000000e, u.pci);
+            break;
+         case VKI_XEN_DOMCTL_DEV_DT:
+            __PRE_XEN_DOMCTL_READ(assign_device, assign_device_0000000e, u.dt);
+            PRE_MEM_READ("XEN_DOMTCL_assign_device.dt",
+                        (Addr)domctl->u.assign_device_0000000e.u.dt.path.p,
+                        domctl->u.assign_device_0000000e.u.dt.size);
+            break;
+         }
+         break;
       }
       break;
    case VKI_XEN_DOMCTL_deassign_device:
       switch (domctl->interface_version) {
       case 0x00000007:
       case 0x00000008:
       case 0x00000009:
       case 0x0000000a:
          __PRE_XEN_DOMCTL_READ(deassign_device, assign_device_00000007, machine_sbdf);
          break;
       case 0x0000000b:
       case 0x0000000c:
       case 0x0000000d:
-      case 0x0000000e:
-      case 0x0000000f:
-      case 0x00000010:
-      case 0x00000011:
-      case 0x00000012:
          __PRE_XEN_DOMCTL_READ(deassign_device, assign_device_0000000b, dev);
          __PRE_XEN_DOMCTL_READ(deassign_device, assign_device_0000000b, flag);
          switch (domctl->u.assign_device_0000000b.dev) {
          case VKI_XEN_DOMCTL_DEV_PCI:
             __PRE_XEN_DOMCTL_READ(deassign_device, assign_device_0000000b, u.pci);
             break;
          case VKI_XEN_DOMCTL_DEV_DT:
             __PRE_XEN_DOMCTL_READ(deassign_device, assign_device_0000000b, u.dt);
             PRE_MEM_READ("XEN_DOMTCL_assign_device.dt",
                           (Addr)domctl->u.assign_device_0000000b.u.dt.path.p,
                           domctl->u.assign_device_0000000b.u.dt.size);
             break;
          default:
             bad_subop(tid, layout, arrghs, status, flags,
                          "__HYPERVISOR_domctl_deassign_device dev",
                          domctl->u.assign_device_0000000b.dev);
             break;
          }
          break;
+      case 0x0000000e:
+      case 0x0000000f:
+      case 0x00000010:
+      case 0x00000011:
+      case 0x00000012:
+         __PRE_XEN_DOMCTL_READ(deassign_device, assign_device_0000000e, dev);
+         __PRE_XEN_DOMCTL_READ(deassign_device, assign_device_0000000e, flags);
+         switch (domctl->u.assign_device_0000000e.dev) {
+         case VKI_XEN_DOMCTL_DEV_PCI:
+            __PRE_XEN_DOMCTL_READ(deassign_device, assign_device_0000000e, u.pci);
+            break;
+         case VKI_XEN_DOMCTL_DEV_DT:
+            __PRE_XEN_DOMCTL_READ(deassign_device, assign_device_0000000e, u.dt);
+            PRE_MEM_READ("XEN_DOMTCL_assign_device.dt",
+                        (Addr)domctl->u.assign_device_0000000e.u.dt.path.p,
+                        domctl->u.assign_device_0000000e.u.dt.size);
+            break;
+         }
+         break;
       }
       break;
 
    case VKI_XEN_DOMCTL_settscinfo:
       switch (domctl->interface_version) {
       case 0x00000007:
       case 0x00000008:
       case 0x00000009:
       case 0x0000000a:
          __PRE_XEN_DOMCTL_READ(settscinfo, tsc_info_00000007, info.tsc_mode);
          __PRE_XEN_DOMCTL_READ(settscinfo, tsc_info_00000007, info.gtsc_khz);
          __PRE_XEN_DOMCTL_READ(settscinfo, tsc_info_00000007, info.incarnation);
--- a/include/vki/vki-xen-domctl.h
+++ b/include/vki/vki-xen-domctl.h
@@ -548,24 +548,38 @@ struct vki_xen_domctl_assign_device_0000000b {
             vki_uint32_t machine_sbdf;   /* machine PCI ID of assigned device */
         } pci;
         struct {
             vki_uint32_t size; /* Length of the path */
             VKI_XEN_GUEST_HANDLE_64(vki_uint8) path; /* path to the device tree node */
         } dt;
     } u;
     /* IN */
 //#define XEN_DOMCTL_DEV_RDM_RELAXED      1
     vki_uint32_t  flag;   /* flag of assigned device */
 };
 
+struct vki_xen_domctl_assign_device_0000000e {
+    vki_uint32_t dev;   /* XEN_DOMCTL_DEV_* */
+    vki_uint32_t flags;
+    union {
+        struct {
+            vki_uint32_t machine_sbdf;   /* machine PCI ID of assigned device */
+        } pci;
+        struct {
+            vki_uint32_t size; /* Length of the path */
+            VKI_XEN_GUEST_HANDLE_64(vki_uint8) path; /* path to the device tree node */
+        } dt;
+    } u;
+};
+
 struct vki_xen_domctl_debug_op {
     vki_uint32_t op;   /* IN */
     vki_uint32_t vcpu; /* IN */
 };
 typedef struct vki_xen_domctl_debug_op vki_xen_domctl_debug_op_t;
 
 struct vki_xen_domctl_mem_event_op_00000007 {
     vki_uint32_t op; /* IN */
     vki_uint32_t mode; /* IN */
     __vki_aligned_u64 shared_addr; /* IN */
     __vki_aligned_u64 ring_addr; /* IN */
     __vki_aligned_u64 gfn; /* IN */
@@ -780,24 +794,25 @@ struct vki_xen_domctl {
         //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_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_assign_device_0000000e assign_device_0000000e;
         //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;
         //struct vki_xen_domctl_set_target        set_target;
         //struct vki_xen_domctl_subscribe         subscribe;
         struct vki_xen_domctl_debug_op          debug_op;
         struct vki_xen_domctl_mem_event_op_00000007 mem_event_op_00000007;
         struct vki_xen_domctl_vm_event_op_00000008 vm_event_op_00000008;
         struct vki_xen_domctl_vm_event_op_00000012 vm_event_op_00000012;
openSUSE Build Service is sponsored by