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;