File valgrind.xen-4.2-handle-IOCTL_GNTALLOC_ALLOC_GREF.patch of Package valgrind

From: Olaf Hering <olaf@aepfle.de>
Date: Fri, 16 Nov 2018 17:21:02 +0100
Subject: xen-4.2: handle IOCTL_GNTALLOC_ALLOC_GREF

bz#390553
---
 coregrind/m_syswrap/syswrap-linux.c | 20 +++++++++
 include/vki/vki-linux.h             | 10 +++++
 2 files changed, 30 insertions(+)

--- a/coregrind/m_syswrap/syswrap-linux.c
+++ b/coregrind/m_syswrap/syswrap-linux.c
@@ -9273,24 +9273,35 @@ PRE(sys_ioctl)
          (struct vki_xen_ioctl_gntdev_get_offset_for_vaddr*)(Addr)(ARG3);
       PRE_MEM_READ("VKI_XEN_IOCTL_GNTDEV_map_grant_ref(vaddr)",
                   (Addr)&args->vaddr, sizeof(args->vaddr));
       }
       break;
    case VKI_XEN_IOCTL_GNTDEV_SET_MAX_GRANTS: {
       struct vki_xen_ioctl_gntdev_set_max_grants *args =
          (struct vki_xen_ioctl_gntdev_set_max_grants*)(Addr)(ARG3);
       PRE_MEM_READ("VKI_XEN_IOCTL_GNTDEV_set_max_grants(count)",
                   (Addr)&args->count, sizeof(args->count));
       }
       break;
+   case VKI_XEN_IOCTL_GNTALLOC_ALLOC_GREF: {
+      struct vki_xen_ioctl_gntalloc_alloc_gref *args =
+         (struct vki_xen_ioctl_gntalloc_alloc_gref*)(Addr)(ARG3);
+      PRE_MEM_READ("VKI_XEN_IOCTL_GNTALLOC_alloc_gref(domid)",
+                  (Addr)&args->domid, sizeof(args->domid));
+      PRE_MEM_READ("VKI_XEN_IOCTL_GNTALLOC_alloc_gref(flags)",
+                  (Addr)&args->flags, sizeof(args->flags));
+      PRE_MEM_READ("VKI_XEN_IOCTL_GNTALLOC_alloc_gref(count)",
+                  (Addr)&args->count, sizeof(args->count));
+      }
+      break;
 #endif
 
    /* Lustre */
    case VKI_OBD_IOC_FID2PATH: {
       struct vki_getinfo_fid2path *gf =
          (struct vki_getinfo_fid2path *)(Addr)ARG3;
       PRE_MEM_READ("VKI_OBD_IOC_FID2PATH(args)", ARG3, sizeof(struct vki_getinfo_fid2path));
       PRE_FIELD_WRITE("VKI_OBD_IOC_FID2PATH(args).gf_recno", gf->gf_recno);
       PRE_FIELD_WRITE("VKI_OBD_IOC_FID2PATH(args).gf_linkno", gf->gf_linkno);
       PRE_MEM_WRITE("VKI_OBD_IOC_FID2PATH(args)", (Addr)gf->gf_path, gf->gf_pathlen);
       break;
    }
@@ -11970,24 +11981,33 @@ POST(sys_ioctl)
       /* No output */
       break;
    case VKI_XEN_IOCTL_GNTDEV_GET_OFFSET_FOR_VADDR: {
       struct vki_xen_ioctl_gntdev_get_offset_for_vaddr *args =
          (struct vki_xen_ioctl_gntdev_get_offset_for_vaddr*)(Addr)(ARG3);
       POST_FIELD_WRITE(args->count);
       POST_FIELD_WRITE(args->offset);
       }
       break;
    case VKI_XEN_IOCTL_GNTDEV_SET_MAX_GRANTS:
       /* No output */
       break;
+   case VKI_XEN_IOCTL_GNTALLOC_ALLOC_GREF: {
+      struct vki_xen_ioctl_gntalloc_alloc_gref *args =
+         (struct vki_xen_ioctl_gntalloc_alloc_gref*)(Addr)(ARG3);
+      POST_FIELD_WRITE(args->index);
+      POST_FIELD_WRITE(args->count);
+      POST_MEM_WRITE((Addr)&args->gref_ids,
+                     sizeof(args->gref_ids) * sizeof(args->count));
+      }
+      break;
 #endif
 
    /* Lustre */
    case VKI_OBD_IOC_FID2PATH: {
        struct vki_getinfo_fid2path *args = (void *)(Addr)(ARG3);
        POST_FIELD_WRITE(args->gf_recno);
        POST_FIELD_WRITE(args->gf_linkno);
        POST_MEM_WRITE((Addr)args->gf_path, VG_(strlen)(args->gf_path)+1);
        break;
       }
 
    case VKI_LL_IOC_PATH2FID:
--- a/include/vki/vki-linux.h
+++ b/include/vki/vki-linux.h
@@ -3630,24 +3630,34 @@ struct vki_xen_ioctl_gntdev_get_offset_for_vaddr {
    __vki_u64 vaddr;
    __vki_u64 offset;
    vki_u32 count;
    vki_u32 pad;
 };
 
 #define VKI_XEN_IOCTL_GNTDEV_SET_MAX_GRANTS			\
 	_VKI_IOC(_VKI_IOC_NONE, 'G', 3, sizeof(struct vki_xen_ioctl_gntdev_set_max_grants))
 struct vki_xen_ioctl_gntdev_set_max_grants {
    vki_u32 count;
 };
 
+#define VKI_XEN_IOCTL_GNTALLOC_ALLOC_GREF			\
+	_VKI_IOC(_VKI_IOC_NONE, 'G', 5, sizeof(struct vki_xen_ioctl_gntalloc_alloc_gref))
+struct vki_xen_ioctl_gntalloc_alloc_gref {
+   vki_u16 domid;
+   vki_u16 flags;
+   vki_u32 count;
+   __vki_u64 index;
+   vki_u32 gref_ids[1];
+};
+
 //----------------------------------------------------------------------
 // From linux-3.4.0/include/linux/fs.h
 //----------------------------------------------------------------------
 
 struct vki_file_handle {
    __vki_u32 handle_bytes;
    int handle_type;
    /* file identifier */
    unsigned char f_handle[0];
 };
 
 //----------------------------------------------------------------------
openSUSE Build Service is sponsored by