File valgrind.xen-4.11-versioned-xen_domctl_monitor_op.patch of Package valgrind

From: Olaf Hering <olaf@aepfle.de>
Date: Tue, 20 Nov 2018 10:55:51 +0100
Subject: xen-4.11: versioned xen_domctl_monitor_op

Handle new layout of xen_domctl_monitor_op in xen-4.11

Fixes commit c88133141a354d65568fb85037abc5e1f74ce46b.

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

--- a/coregrind/m_syswrap/syswrap-xen.c
+++ b/coregrind/m_syswrap/syswrap-xen.c
@@ -1712,61 +1712,63 @@ PRE(domctl)
                break;
             case VKI_XEN_DOMCTL_MONITOR_EVENT_GUEST_REQUEST:
                __PRE_XEN_DOMCTL_READ(monitor_op, monitor_op_0000000c, u.guest_request);
                break;
             case VKI_XEN_DOMCTL_MONITOR_EVENT_DEBUG_EXCEPTION:
                __PRE_XEN_DOMCTL_READ(monitor_op, monitor_op_0000000c, u.debug_exception);
                break;
             }
          }
          break;
       case 0x0000000e:
       case 0x0000000f:
-      case 0x00000010:
           if (domctl->u.monitor_op_0000000e.op == VKI_XEN_DOMCTL_MONITOR_OP_ENABLE ||
               domctl->u.monitor_op_0000000e.op == VKI_XEN_DOMCTL_MONITOR_OP_DISABLE) {
              switch (domctl->u.monitor_op_0000000e.event) {
              case VKI_XEN_DOMCTL_MONITOR_EVENT_WRITE_CTRLREG:
                 __PRE_XEN_DOMCTL_READ(monitor_op, monitor_op_0000000e, u.mov_to_cr);
                 break;
              case VKI_XEN_DOMCTL_MONITOR_EVENT_MOV_TO_MSR:
                 __PRE_XEN_DOMCTL_READ(monitor_op, monitor_op_0000000e, u.mov_to_msr);
                 break;
              case VKI_XEN_DOMCTL_MONITOR_EVENT_GUEST_REQUEST:
                 __PRE_XEN_DOMCTL_READ(monitor_op, monitor_op_0000000e, u.guest_request);
                 break;
              case VKI_XEN_DOMCTL_MONITOR_EVENT_DEBUG_EXCEPTION:
                 __PRE_XEN_DOMCTL_READ(monitor_op, monitor_op_0000000e, u.debug_exception);
                 break;
              }
           }
 
          break;
+      case 0x00000010:
       case 0x0000011:
       case 0x0000012:
-          if (domctl->u.monitor_op_00000011.op == VKI_XEN_DOMCTL_MONITOR_OP_ENABLE ||
-              domctl->u.monitor_op_00000011.op == VKI_XEN_DOMCTL_MONITOR_OP_DISABLE) {
-             switch (domctl->u.monitor_op_00000011.event) {
+          if (domctl->u.monitor_op_00000010.op == VKI_XEN_DOMCTL_MONITOR_OP_ENABLE ||
+              domctl->u.monitor_op_00000010.op == VKI_XEN_DOMCTL_MONITOR_OP_DISABLE) {
+             switch (domctl->u.monitor_op_00000010.event) {
              case VKI_XEN_DOMCTL_MONITOR_EVENT_WRITE_CTRLREG:
-                __PRE_XEN_DOMCTL_READ(monitor_op, monitor_op_00000011, u.mov_to_cr);
+                __PRE_XEN_DOMCTL_READ(monitor_op, monitor_op_00000010, u.mov_to_cr);
                 break;
              case VKI_XEN_DOMCTL_MONITOR_EVENT_MOV_TO_MSR:
-                __PRE_XEN_DOMCTL_READ(monitor_op, monitor_op_00000011, u.mov_to_msr);
+                __PRE_XEN_DOMCTL_READ(monitor_op, monitor_op_00000010, u.mov_to_msr);
                 break;
              case VKI_XEN_DOMCTL_MONITOR_EVENT_GUEST_REQUEST:
-                __PRE_XEN_DOMCTL_READ(monitor_op, monitor_op_00000011, u.guest_request);
+                __PRE_XEN_DOMCTL_READ(monitor_op, monitor_op_00000010, u.guest_request);
+                break;
+             case VKI_XEN_DOMCTL_MONITOR_EVENT_DEBUG_EXCEPTION:
+                __PRE_XEN_DOMCTL_READ(monitor_op, monitor_op_00000010, u.debug_exception);
                 break;
              }
           }
-
          break;
       }
       break;
 
    case VKI_XEN_DOMCTL_set_gnttab_limits:
       PRE_XEN_DOMCTL_READ(set_gnttab_limits_0000000e, grant_frames);
       PRE_XEN_DOMCTL_READ(set_gnttab_limits_0000000e, maptrack_frames);
       break;
 
    default:
       bad_subop(tid, layout, arrghs, status, flags,
                 "__HYPERVISOR_domctl", domctl->cmd);
@@ -2906,36 +2908,40 @@ POST(domctl){
                 __POST_XEN_DOMCTL_WRITE(monitor_op, monitor_op_0000000e, u.mov_to_msr);
                 break;
              case VKI_XEN_DOMCTL_MONITOR_EVENT_GUEST_REQUEST:
                 __POST_XEN_DOMCTL_WRITE(monitor_op, monitor_op_0000000e, u.guest_request);
                 break;
              case VKI_XEN_DOMCTL_MONITOR_EVENT_DEBUG_EXCEPTION:
                 __POST_XEN_DOMCTL_WRITE(monitor_op, monitor_op_0000000e, u.debug_exception);
                 break;
              }
           }
 
          break;
+      case 0x0000010:
       case 0x0000011:
-          if (domctl->u.monitor_op_00000011.op == VKI_XEN_DOMCTL_MONITOR_OP_GET_CAPABILITIES) {
-             switch(domctl->u.monitor_op_00000011.event) {
+          if (domctl->u.monitor_op_00000010.op == VKI_XEN_DOMCTL_MONITOR_OP_GET_CAPABILITIES) {
+             switch(domctl->u.monitor_op_00000010.event) {
              case VKI_XEN_DOMCTL_MONITOR_EVENT_WRITE_CTRLREG:
-                __POST_XEN_DOMCTL_WRITE(monitor_op, monitor_op_00000011, u.mov_to_cr);
+                __POST_XEN_DOMCTL_WRITE(monitor_op, monitor_op_00000010, u.mov_to_cr);
                 break;
              case VKI_XEN_DOMCTL_MONITOR_EVENT_MOV_TO_MSR:
-                __POST_XEN_DOMCTL_WRITE(monitor_op, monitor_op_00000011, u.mov_to_msr);
+                __POST_XEN_DOMCTL_WRITE(monitor_op, monitor_op_00000010, u.mov_to_msr);
                 break;
              case VKI_XEN_DOMCTL_MONITOR_EVENT_GUEST_REQUEST:
-                __POST_XEN_DOMCTL_WRITE(monitor_op, monitor_op_00000011, u.guest_request);
+                __POST_XEN_DOMCTL_WRITE(monitor_op, monitor_op_00000010, u.guest_request);
                 break;
+            case VKI_XEN_DOMCTL_MONITOR_EVENT_DEBUG_EXCEPTION:
+               __POST_XEN_DOMCTL_WRITE(monitor_op, monitor_op_00000010, u.debug_exception);
+               break;
              }
           }
 
          break;
       }
       break;
    }
 
 #undef POST_XEN_DOMCTL_WRITE
 #undef __POST_XEN_DOMCTL_WRITE
 }
 
--- a/include/vki/vki-xen-domctl.h
+++ b/include/vki/vki-xen-domctl.h
@@ -749,70 +749,45 @@ struct vki_xen_domctl_monitor_op_0000000e {
             vki_uint32_t msr;
         } mov_to_msr;
         struct {
             vki_uint8_t sync;
             vki_uint8_t allow_userspace;
         } guest_request;
         struct {
             vki_uint8_t sync;
         } debug_exception;
     } u;
 };
 
-struct vki_xen_domctl_monitor_op_00000011 {
+struct vki_xen_domctl_monitor_op_00000010 {
     vki_uint32_t op; /* vki_xen_DOMCTL_MONITOR_OP_* */
-
-    /*
-     * When used with ENABLE/DISABLE this has to be set to
-     * the requested vki_xen_DOMCTL_MONITOR_EVENT_* value.
-     * With GET_CAPABILITIES this field returns a bitmap of
-     * events supported by the platform, in the format
-     * (1 << vki_xen_DOMCTL_MONITOR_EVENT_*).
-     */
     vki_uint32_t event;
-
-    /*
-     * Further options when issuing vki_xen_DOMCTL_MONITOR_OP_ENABLE.
-     */
     union {
         struct {
-            /* Which control register */
             vki_uint8_t index;
-            /* Pause vCPU until response */
             vki_uint8_t sync;
-            /* Send event only on a change of value */
             vki_uint8_t onchangeonly;
-            /* Allignment padding */
             vki_uint8_t pad1;
             vki_uint32_t pad2;
-            /*
-             * Send event only if the changed bit in the control register
-             * is not masked.
-             */
             vki_xen_uint64_aligned_t bitmask;
         } mov_to_cr;
-
         struct {
             vki_uint32_t msr;
             vki_uint8_t onchangeonly;
         } mov_to_msr;
-
         struct {
-            /* Pause vCPU until response */
             vki_uint8_t sync;
             vki_uint8_t allow_userspace;
         } guest_request;
-
         struct {
-            /* Pause vCPU until response */
             vki_uint8_t sync;
         } debug_exception;
     } u;
 };
 
 struct vki_xen_domctl_set_gnttab_limits_0000000e {
     vki_uint32_t grant_frames;
     vki_uint32_t maptrack_frames;
 };
 
 struct vki_xen_domctl {
     vki_uint32_t cmd;
@@ -882,25 +857,25 @@ struct vki_xen_domctl {
         struct vki_xen_domctl_set_access_required access_required;
         //struct vki_xen_domctl_audit_p2m         audit_p2m;
         //struct vki_xen_domctl_set_virq_handler  set_virq_handler;
         struct vki_xen_domctl_set_max_evtchn    set_max_evtchn;
         //struct vki_xen_domctl_gdbsx_memio       gdbsx_guest_memio;
         //struct vki_xen_domctl_set_broken_page_p2m set_broken_page_p2m;
         struct vki_xen_domctl_cacheflush        cacheflush;
         //struct vki_xen_domctl_gdbsx_pauseunp_vcpu gdbsx_pauseunp_vcpu;
         //struct vki_xen_domctl_gdbsx_domstatus   gdbsx_domstatus;
         struct vki_xen_domctl_monitor_op_0000000b monitor_op_0000000b;
         struct vki_xen_domctl_monitor_op_0000000c monitor_op_0000000c;
         struct vki_xen_domctl_monitor_op_0000000e monitor_op_0000000e;
-        struct vki_xen_domctl_monitor_op_00000011 monitor_op_00000011;
+        struct vki_xen_domctl_monitor_op_00000010 monitor_op_00000010;
         //struct vki_xen_domctl_vnuma             vnuma;
         //struct vki_xen_domctl_psr_cmt_op        psr_cmt_op;
         //struct vki_xen_domctl_psr_cat_op        psr_cat_op;
         //struct vki_xen_domctl_arm_configuredomain configuredomain;
         struct vki_xen_domctl_set_gnttab_limits_0000000e set_gnttab_limits_0000000e;
         //struct vki_xen_domctl_vuart_op          vuart_op;
         vki_uint8_t                         pad[128];
     } u;
 };
 
 #endif // __VKI_XEN_DOMCTL_H
 
openSUSE Build Service is sponsored by