File valgrind.xen-3.4-versioned-hvmcontext_partial.patch of Package valgrind
From: Olaf Hering <olaf@aepfle.de>
Date: Fri, 16 Nov 2018 17:29:42 +0100
Subject: xen-3.4: versioned hvmcontext_partial
The layout of xen_domctl_hvmcontext_partial used from xen-3.4 up to xen-4.9.
Rename the existing code and use the domctl value from xen-3.4 as suffix.
Actually use the required layout for the member value.
The code to deal with xen-4.10 was not implemented.
Fixes commit c88133141a354d65568fb85037abc5e1f74ce46b
bz#390553
---
coregrind/m_syswrap/syswrap-xen.c | 79 +++++----
include/vki/vki-xen-domctl.h | 8 +-
2 files changed, 51 insertions(+), 36 deletions(-)
--- a/coregrind/m_syswrap/syswrap-xen.c
+++ b/coregrind/m_syswrap/syswrap-xen.c
@@ -880,48 +880,56 @@ PRE(domctl)
__PRE_XEN_DOMCTL_READ(gethvmcontext, hvmcontext, size);
break;
case VKI_XEN_DOMCTL_sethvmcontext:
__PRE_XEN_DOMCTL_READ(sethvmcontext, hvmcontext, size);
__PRE_XEN_DOMCTL_READ(sethvmcontext, hvmcontext, buffer);
PRE_MEM_READ("XEN_DOMCTL_sethvmcontext *buffer",
(Addr)domctl->u.hvmcontext.buffer.p,
domctl->u.hvmcontext.size);
break;
case VKI_XEN_DOMCTL_gethvmcontext_partial:
- __PRE_XEN_DOMCTL_READ(gethvmcontext_partial, hvmcontext_partial_00000007, type);
- __PRE_XEN_DOMCTL_READ(gethvmcontext_partial, hvmcontext_partial_00000007, instance);
- __PRE_XEN_DOMCTL_READ(gethvmcontext_partial, hvmcontext_partial_00000007, buffer);
-
- switch (domctl->u.hvmcontext_partial_00000007.type) {
- case VKI_HVM_SAVE_CODE(CPU):
- if ( domctl->u.hvmcontext_partial_00000007.buffer.p )
- PRE_MEM_WRITE("XEN_DOMCTL_gethvmcontext_partial *buffer",
- (Addr)domctl->u.hvmcontext_partial_00000007.buffer.p,
- VKI_HVM_SAVE_LENGTH(CPU));
- break;
- case VKI_HVM_SAVE_CODE(MTRR):
- if ( domctl->u.hvmcontext_partial_00000007.buffer.p )
- PRE_MEM_WRITE("XEN_DOMCTL_gethvmcontext_partial *buffer",
- (Addr)domctl->u.hvmcontext_partial_00000007.buffer.p,
- VKI_HVM_SAVE_LENGTH(MTRR));
- break;
- default:
- bad_subop(tid, layout, arrghs, status, flags,
- "__HYPERVISOR_domctl_gethvmcontext_partial type",
- domctl->u.hvmcontext_partial_00000007.type);
- break;
- }
- break;
+ switch (domctl->interface_version) {
+ case 0x00000007:
+ case 0x00000008:
+ case 0x00000009:
+ case 0x0000000a:
+ case 0x0000000b:
+ __PRE_XEN_DOMCTL_READ(gethvmcontext_partial, hvmcontext_partial_00000005, type);
+ __PRE_XEN_DOMCTL_READ(gethvmcontext_partial, hvmcontext_partial_00000005, instance);
+ __PRE_XEN_DOMCTL_READ(gethvmcontext_partial, hvmcontext_partial_00000005, buffer);
+
+ switch (domctl->u.hvmcontext_partial_00000005.type) {
+ case VKI_HVM_SAVE_CODE(CPU):
+ if ( domctl->u.hvmcontext_partial_00000005.buffer.p )
+ PRE_MEM_WRITE("XEN_DOMCTL_gethvmcontext_partial *buffer",
+ (Addr)domctl->u.hvmcontext_partial_00000005.buffer.p,
+ VKI_HVM_SAVE_LENGTH(CPU));
+ break;
+ case VKI_HVM_SAVE_CODE(MTRR):
+ if ( domctl->u.hvmcontext_partial_00000005.buffer.p )
+ PRE_MEM_WRITE("XEN_DOMCTL_gethvmcontext_partial *buffer",
+ (Addr)domctl->u.hvmcontext_partial_00000005.buffer.p,
+ VKI_HVM_SAVE_LENGTH(MTRR));
+ break;
+ default:
+ bad_subop(tid, layout, arrghs, status, flags,
+ "__HYPERVISOR_domctl_gethvmcontext_partial type",
+ domctl->u.hvmcontext_partial_00000005.type);
+ break;
+ }
+ break;
+ }
+ break;
case VKI_XEN_DOMCTL_max_mem:
PRE_XEN_DOMCTL_READ(max_mem, max_memkb);
break;
case VKI_XEN_DOMCTL_set_address_size:
__PRE_XEN_DOMCTL_READ(set_address_size, address_size, size);
break;
case VKI_XEN_DOMCTL_test_assign_device:
switch (domctl->interface_version) {
case 0x00000007:
@@ -2203,32 +2211,39 @@ POST(domctl){
case VKI_XEN_DOMCTL_gethvmcontext:
/* Xen unconditionally writes size... */
__POST_XEN_DOMCTL_WRITE(gethvmcontext, hvmcontext, size);
/* ...but only writes to the buffer if it was non NULL */
if ( domctl->u.hvmcontext.buffer.p )
POST_MEM_WRITE((Addr)domctl->u.hvmcontext.buffer.p,
sizeof(*domctl->u.hvmcontext.buffer.p)
* domctl->u.hvmcontext.size);
break;
case VKI_XEN_DOMCTL_gethvmcontext_partial:
- switch (domctl->u.hvmcontext_partial_00000007.type) {
- case VKI_HVM_SAVE_CODE(CPU):
- if ( domctl->u.hvmcontext_partial_00000007.buffer.p )
- POST_MEM_WRITE((Addr)domctl->u.hvmcontext_partial_00000007.buffer.p,
- VKI_HVM_SAVE_LENGTH(CPU));
- break;
- }
- break;
+ switch (domctl->interface_version) {
+ case 0x00000007:
+ case 0x00000008:
+ case 0x00000009:
+ case 0x0000000a:
+ case 0x0000000b:
+ switch (domctl->u.hvmcontext_partial_00000005.type) {
+ case VKI_HVM_SAVE_CODE(CPU):
+ if ( domctl->u.hvmcontext_partial_00000005.buffer.p )
+ POST_MEM_WRITE((Addr)domctl->u.hvmcontext_partial_00000005.buffer.p, VKI_HVM_SAVE_LENGTH(CPU));
+ break;
+ }
+ break;
+ }
+ break;
case VKI_XEN_DOMCTL_scheduler_op:
if ( domctl->u.scheduler_op.cmd == VKI_XEN_DOMCTL_SCHEDOP_getinfo ) {
switch(domctl->u.scheduler_op.sched_id) {
case VKI_XEN_SCHEDULER_SEDF:
POST_XEN_DOMCTL_WRITE(scheduler_op, u.sedf.period);
POST_XEN_DOMCTL_WRITE(scheduler_op, u.sedf.slice);
POST_XEN_DOMCTL_WRITE(scheduler_op, u.sedf.latency);
POST_XEN_DOMCTL_WRITE(scheduler_op, u.sedf.extratime);
POST_XEN_DOMCTL_WRITE(scheduler_op, u.sedf.weight);
break;
case VKI_XEN_SCHEDULER_CREDIT:
--- a/include/vki/vki-xen-domctl.h
+++ b/include/vki/vki-xen-domctl.h
@@ -395,31 +395,31 @@ struct vki_xen_domctl_tsc_info_0000000b {
vki_uint32_t pad;
vki_xen_uint64_aligned_t elapsed_nsec;
};
struct vki_xen_domctl_hvmcontext {
vki_uint32_t size; /* IN/OUT size of buffer */
VKI_XEN_GUEST_HANDLE_64(vki_uint8) buffer; /* IN/OUT */
};
typedef struct vki_xen_domctl_hvmcontext vki_xen_domctl_hvmcontext_t;
DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_domctl_hvmcontext_t);
-struct vki_xen_domctl_hvmcontext_partial_00000007 {
+struct vki_xen_domctl_hvmcontext_partial_00000005 {
vki_uint32_t type; /* IN */
vki_uint32_t instance; /* IN */
VKI_XEN_GUEST_HANDLE_64(vki_uint8) buffer; /* IN/OUT buffer */
};
-typedef struct vki_xen_domctl_hvmcontext_partial_00000007 vki_xen_domctl_hvmcontext_partial_00000007_t;
-DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_domctl_hvmcontext_partial_00000007_t);
+typedef struct vki_xen_domctl_hvmcontext_partial_00000005 vki_xen_domctl_hvmcontext_partial_00000005_t;
+DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_domctl_hvmcontext_partial_00000005_t);
struct vki_xen_domctl_hvmcontext_partial_0000000e {
vki_uint32_t type; /* IN */
vki_uint32_t instance; /* IN */
vki_xen_uint64_aligned_t bufsz; /* IN */
VKI_XEN_GUEST_HANDLE_64(vki_uint8) buffer; /* OUT buffer */
};
typedef struct vki_xen_domctl_hvmcontext_partial_0000000e vki_xen_domctl_hvmcontext_partial_0000000e_t;
DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_domctl_hvmcontext_partial_0000000e_t);
struct vki_xen_domctl_pin_mem_cacheattr {
vki_xen_uint64_aligned_t start, end; /* IN */
@@ -682,25 +682,25 @@ struct vki_xen_domctl {
//struct vki_xen_domctl_setdebugging setdebugging;
struct vki_xen_domctl_irq_permission irq_permission;
struct vki_xen_domctl_iomem_permission iomem_permission;
struct vki_xen_domctl_ioport_permission ioport_permission;
struct vki_xen_domctl_hypercall_init hypercall_init;
//struct vki_xen_domctl_arch_setup arch_setup;
struct vki_xen_domctl_settimeoffset_00000001 settimeoffset_00000001;
//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_0000000e hvmcontext_partial_00000007;
+ 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_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;