File valgrind.xen-4.8-versioned-xen_domctl_monitor_op.patch of Package valgrind
From: Olaf Hering <olaf@aepfle.de>
Date: Fri, 16 Nov 2018 17:29:28 +0100
Subject: xen-4.8: versioned xen_domctl_monitor_op
Layout of xen_domctl_monitor_op changed in xen-4.8.
Copy and adjust the existing monitor_op_0000000b handler.
bz#390553
---
coregrind/m_syswrap/syswrap-xen.c | 47 +++++++++++++++++++++++++++++++++++++++++------
include/vki/vki-xen-domctl.h | 22 ++++++++++++++++++++++
2 files changed, 63 insertions(+), 6 deletions(-)
--- a/coregrind/m_syswrap/syswrap-xen.c
+++ b/coregrind/m_syswrap/syswrap-xen.c
@@ -1564,45 +1564,63 @@ PRE(domctl)
__PRE_XEN_DOMCTL_READ(set_vcpu_msrs, vcpu_msrs, vcpu);
__PRE_XEN_DOMCTL_READ(set_vcpu_msrs, vcpu_msrs, msr_count);
__PRE_XEN_DOMCTL_READ(set_vcpu_msrs, vcpu_msrs, msrs);
PRE_MEM_READ("XEN_DOMCTL_set_vcpu_msrs *u.vcpu_msrs.msrs.p",
(Addr)domctl->u.vcpu_msrs.msrs.p,
sizeof(vki_xen_domctl_vcpu_msr_t) *
domctl->u.vcpu_msrs.msr_count);
break;
case VKI_XEN_DOMCTL_monitor_op:
switch (domctl->interface_version) {
case 0x0000000b:
- case 0x0000000c:
- case 0x0000000d:
- case 0x0000000e:
- case 0x0000000f:
- case 0x00000010:
if (domctl->u.monitor_op_0000000b.op == VKI_XEN_DOMCTL_MONITOR_OP_ENABLE ||
domctl->u.monitor_op_0000000b.op == VKI_XEN_DOMCTL_MONITOR_OP_DISABLE) {
switch (domctl->u.monitor_op_0000000b.event) {
case VKI_XEN_DOMCTL_MONITOR_EVENT_WRITE_CTRLREG:
__PRE_XEN_DOMCTL_READ(monitor_op, monitor_op_0000000b, u.mov_to_cr);
break;
case VKI_XEN_DOMCTL_MONITOR_EVENT_MOV_TO_MSR:
__PRE_XEN_DOMCTL_READ(monitor_op, monitor_op_0000000b, u.mov_to_msr);
break;
case VKI_XEN_DOMCTL_MONITOR_EVENT_GUEST_REQUEST:
__PRE_XEN_DOMCTL_READ(monitor_op, monitor_op_0000000b, u.guest_request);
break;
}
}
break;
+ case 0x0000000c:
+ case 0x0000000d:
+ case 0x0000000e:
+ case 0x0000000f:
+ case 0x00000010:
+ if (domctl->u.monitor_op_0000000c.op == VKI_XEN_DOMCTL_MONITOR_OP_ENABLE ||
+ domctl->u.monitor_op_0000000c.op == VKI_XEN_DOMCTL_MONITOR_OP_DISABLE) {
+ switch (domctl->u.monitor_op_0000000c.event) {
+ case VKI_XEN_DOMCTL_MONITOR_EVENT_WRITE_CTRLREG:
+ __PRE_XEN_DOMCTL_READ(monitor_op, monitor_op_0000000c, u.mov_to_cr);
+ break;
+ case VKI_XEN_DOMCTL_MONITOR_EVENT_MOV_TO_MSR:
+ __PRE_XEN_DOMCTL_READ(monitor_op, monitor_op_0000000c, u.mov_to_msr);
+ 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 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) {
case VKI_XEN_DOMCTL_MONITOR_EVENT_WRITE_CTRLREG:
__PRE_XEN_DOMCTL_READ(monitor_op, monitor_op_00000011, 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);
break;
case VKI_XEN_DOMCTL_MONITOR_EVENT_GUEST_REQUEST:
@@ -2653,25 +2671,42 @@ POST(domctl){
switch(domctl->u.monitor_op_0000000b.event) {
case VKI_XEN_DOMCTL_MONITOR_EVENT_WRITE_CTRLREG:
__POST_XEN_DOMCTL_WRITE(monitor_op, monitor_op_0000000b, u.mov_to_cr);
break;
case VKI_XEN_DOMCTL_MONITOR_EVENT_MOV_TO_MSR:
__POST_XEN_DOMCTL_WRITE(monitor_op, monitor_op_0000000b, u.mov_to_msr);
break;
case VKI_XEN_DOMCTL_MONITOR_EVENT_GUEST_REQUEST:
__POST_XEN_DOMCTL_WRITE(monitor_op, monitor_op_0000000b, u.guest_request);
break;
}
}
-
+ break;
+ case 0x0000000c:
+ if (domctl->u.monitor_op_0000000c.op == VKI_XEN_DOMCTL_MONITOR_OP_GET_CAPABILITIES) {
+ switch(domctl->u.monitor_op_0000000c.event) {
+ case VKI_XEN_DOMCTL_MONITOR_EVENT_WRITE_CTRLREG:
+ __POST_XEN_DOMCTL_WRITE(monitor_op, monitor_op_0000000c, u.mov_to_cr);
+ break;
+ case VKI_XEN_DOMCTL_MONITOR_EVENT_MOV_TO_MSR:
+ __POST_XEN_DOMCTL_WRITE(monitor_op, monitor_op_0000000c, u.mov_to_msr);
+ break;
+ case VKI_XEN_DOMCTL_MONITOR_EVENT_GUEST_REQUEST:
+ __POST_XEN_DOMCTL_WRITE(monitor_op, monitor_op_0000000c, u.guest_request);
+ break;
+ case VKI_XEN_DOMCTL_MONITOR_EVENT_DEBUG_EXCEPTION:
+ __POST_XEN_DOMCTL_WRITE(monitor_op, monitor_op_0000000c, u.debug_exception);
+ break;
+ }
+ }
break;
case 0x0000011:
if (domctl->u.monitor_op_00000011.op == VKI_XEN_DOMCTL_MONITOR_OP_GET_CAPABILITIES) {
switch(domctl->u.monitor_op_00000011.event) {
case VKI_XEN_DOMCTL_MONITOR_EVENT_WRITE_CTRLREG:
__POST_XEN_DOMCTL_WRITE(monitor_op, monitor_op_00000011, 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);
break;
case VKI_XEN_DOMCTL_MONITOR_EVENT_GUEST_REQUEST:
__POST_XEN_DOMCTL_WRITE(monitor_op, monitor_op_00000011, u.guest_request);
--- a/include/vki/vki-xen-domctl.h
+++ b/include/vki/vki-xen-domctl.h
@@ -660,24 +660,45 @@ struct vki_xen_domctl_monitor_op_0000000b {
struct {
/* Enable the capture of an extended set of MSRs */
vki_uint8_t extended_capture;
} mov_to_msr;
struct {
/* Pause vCPU until response */
vki_uint8_t sync;
} guest_request;
} u;
};
+struct vki_xen_domctl_monitor_op_0000000c {
+ vki_uint32_t op; /* vki_xen_DOMCTL_MONITOR_OP_* */
+ vki_uint32_t event;
+ union {
+ struct {
+ vki_uint8_t index;
+ vki_uint8_t sync;
+ vki_uint8_t onchangeonly;
+ } mov_to_cr;
+ struct {
+ vki_uint32_t msr;
+ } mov_to_msr;
+ struct {
+ vki_uint8_t sync;
+ } guest_request;
+ struct {
+ vki_uint8_t sync;
+ } debug_exception;
+ } u;
+};
+
struct vki_xen_domctl_monitor_op_00000011 {
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;
@@ -784,24 +805,25 @@ struct vki_xen_domctl {
struct vki_xen_domctl_vcpu_msrs vcpu_msrs;
#endif
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_00000011 monitor_op_00000011;
//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;
vki_uint8_t pad[128];
} u;
};
#endif // __VKI_XEN_DOMCTL_H
/*--------------------------------------------------------------------*/