File valgrind.xen-4.9-handle-IOCTL_PRIVCMD_DM_OP.patch of Package valgrind
From: Olaf Hering <olaf@aepfle.de>
Date: Fri, 16 Nov 2018 17:29:39 +0100
Subject: xen-4.9: handle IOCTL_PRIVCMD_DM_OP
Handle IOCTL_PRIVCMD_DM_OP
bz#390553
---
coregrind/m_syswrap/syswrap-linux.c | 17 +++++++++++++++++
include/vki/vki-linux.h | 14 ++++++++++++++
2 files changed, 31 insertions(+)
--- a/coregrind/m_syswrap/syswrap-linux.c
+++ b/coregrind/m_syswrap/syswrap-linux.c
@@ -8428,24 +8428,35 @@ PRE(sys_ioctl)
struct vki_xen_privcmd_mmapbatch_v2 *args =
(struct vki_xen_privcmd_mmapbatch_v2 *)(Addr)(ARG3);
PRE_MEM_READ("VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH_V2(num)",
(Addr)&args->num, sizeof(args->num));
PRE_MEM_READ("VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH_V2(dom)",
(Addr)&args->dom, sizeof(args->dom));
PRE_MEM_READ("VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH_V2(addr)",
(Addr)&args->addr, sizeof(args->addr));
PRE_MEM_READ("VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH_V2(arr)",
(Addr)args->arr, sizeof(*(args->arr)) * args->num);
break;
}
+ case VKI_XEN_IOCTL_PRIVCMD_DM_OP: {
+ struct vki_xen_privcmd_dm_op *args =
+ (struct vki_xen_privcmd_dm_op *)(ARG3);
+ PRE_MEM_READ("VKI_XEN_IOCTL_PRIVCMD_DM_OP(dom)",
+ (Addr)&args->dom, sizeof(args->dom));
+ PRE_MEM_READ("VKI_XEN_IOCTL_PRIVCMD_DM_OP(num)",
+ (Addr)&args->num, sizeof(args->num));
+ PRE_MEM_READ("VKI_XEN_IOCTL_PRIVCMD_DM_OP(ubufs)",
+ (Addr)args->ubufs, sizeof(*(args->ubufs)) * args->num);
+ break;
+ }
case VKI_XEN_IOCTL_EVTCHN_BIND_VIRQ: {
struct vki_xen_ioctl_evtchn_bind_virq *args =
(struct vki_xen_ioctl_evtchn_bind_virq *)(Addr)(ARG3);
PRE_MEM_READ("VKI_XEN_IOCTL_EVTCHN_BIND_VIRQ(virq)",
(Addr)&args->virq, sizeof(args->virq));
}
break;
case VKI_XEN_IOCTL_EVTCHN_BIND_INTERDOMAIN: {
struct vki_xen_ioctl_evtchn_bind_interdomain *args =
(struct vki_xen_ioctl_evtchn_bind_interdomain *)(Addr)(ARG3);
PRE_MEM_READ("VKI_XEN_IOCTL_EVTCHN_BIND_INTERDOMAIN(remote_domain)",
@@ -11140,24 +11151,30 @@ POST(sys_ioctl)
case VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH: {
struct vki_xen_privcmd_mmapbatch *args =
(struct vki_xen_privcmd_mmapbatch *)(Addr)(ARG3);
POST_MEM_WRITE((Addr)args->arr, sizeof(*(args->arr)) * args->num);
}
break;
case VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH_V2: {
struct vki_xen_privcmd_mmapbatch_v2 *args =
(struct vki_xen_privcmd_mmapbatch_v2 *)(Addr)(ARG3);
POST_MEM_WRITE((Addr)args->err, sizeof(*(args->err)) * args->num);
}
break;
+ case VKI_XEN_IOCTL_PRIVCMD_DM_OP: {
+ struct vki_xen_privcmd_dm_op *args =
+ (struct vki_xen_privcmd_dm_op *)(ARG3);
+ POST_MEM_WRITE((Addr)args->ubufs, sizeof(*(args->ubufs)) * args->num);
+ }
+ break;
case VKI_XEN_IOCTL_EVTCHN_BIND_VIRQ:
case VKI_XEN_IOCTL_EVTCHN_BIND_INTERDOMAIN:
case VKI_XEN_IOCTL_EVTCHN_BIND_UNBOUND_PORT:
case VKI_XEN_IOCTL_EVTCHN_UNBIND:
case VKI_XEN_IOCTL_EVTCHN_NOTIFY:
case VKI_XEN_IOCTL_EVTCHN_RESET:
/* No output */
break;
case VKI_XEN_IOCTL_GNTDEV_MAP_GRANT_REF: {
struct vki_xen_ioctl_gntdev_map_grant_ref *args =
(struct vki_xen_ioctl_gntdev_map_grant_ref*)(Addr)(ARG3);
--- a/include/vki/vki-linux.h
+++ b/include/vki/vki-linux.h
@@ -3448,30 +3448,44 @@ struct vki_xen_privcmd_mmapbatch {
__vki_u64 addr; /* virtual address */
__vki_xen_pfn_t *arr; /* array of mfns - top nibble set on err */
};
struct vki_xen_privcmd_mmapbatch_v2 {
unsigned int num; /* number of pages to populate */
__vki_u16 dom; /* target domain */
__vki_u64 addr; /* virtual address */
const __vki_xen_pfn_t *arr; /* array of mfns */
int __user *err; /* array of error codes */
};
+struct vki_xen_privcmd_dm_op_buf {
+ void __user *uptr;
+ __vki_kernel_size_t size;
+};
+
+struct vki_xen_privcmd_dm_op {
+ __vki_u16 dom;
+ __vki_u16 num;
+ const struct vki_xen_privcmd_dm_op_buf __user *ubufs;
+};
+
+
#define VKI_XEN_IOCTL_PRIVCMD_HYPERCALL _VKI_IOC(_VKI_IOC_NONE, 'P', 0, sizeof(struct vki_xen_privcmd_hypercall))
#define VKI_XEN_IOCTL_PRIVCMD_MMAP _VKI_IOC(_VKI_IOC_NONE, 'P', 2, sizeof(struct vki_xen_privcmd_mmap))
#define VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH _VKI_IOC(_VKI_IOC_NONE, 'P', 3, sizeof(struct vki_xen_privcmd_mmapbatch))
#define VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH_V2 _VKI_IOC(_VKI_IOC_NONE, 'P', 4, sizeof(struct vki_xen_privcmd_mmapbatch_v2))
+#define VKI_XEN_IOCTL_PRIVCMD_DM_OP _VKI_IOC(_VKI_IOC_NONE, 'P', 5, sizeof(struct vki_xen_privcmd_dm_op))
+
//----------------------------------------------------------------------
// Xen evtchn IOCTL
//----------------------------------------------------------------------
#define VKI_XEN_IOCTL_EVTCHN_BIND_VIRQ \
_VKI_IOC(_VKI_IOC_NONE, 'E', 0, sizeof(struct vki_xen_ioctl_evtchn_bind_virq))
struct vki_xen_ioctl_evtchn_bind_virq {
vki_uint32_t virq;
};
#define VKI_XEN_IOCTL_EVTCHN_BIND_INTERDOMAIN \
_VKI_IOC(_VKI_IOC_NONE, 'E', 1, sizeof(struct vki_xen_ioctl_evtchn_bind_interdomain))