xen: Infratructure for XEN_TMEM_* hypercalls

and an implementation of XEN_TMEM_control save_begin.

Xen will read various fields at various time, but write nothing back for a
save_begin subop.

From: Andrew Cooper <andrew.cooper3@citrix.com>
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13726
This commit is contained in:
Bart Van Assche 2013-12-01 10:52:22 +00:00
parent bbbdd846be
commit b848d83815
3 changed files with 151 additions and 1 deletions

View File

@ -670,6 +670,61 @@ PRE(hvm_op)
#undef PRE_XEN_HVMOP_READ
}
PRE(tmem_op)
{
struct vki_xen_tmem_op *tmem = (struct vki_xen_tmem_op *)ARG1;
PRINT("__HYPERVISOR_tmem_op ( %d )", tmem->cmd);
/* Common part for xen_tmem_op:
* vki_uint32_t cmd;
*/
PRE_MEM_READ("__HYPERVISOR_tmem_op cmd", ARG1, sizeof(vki_uint32_t));
#define __PRE_XEN_TMEMOP_READ(_tmem, _union, _field) \
PRE_MEM_READ("XEN_tmem_op_" #_tmem " u." #_union "." #_field, \
(Addr)&tmem->u._union._field, \
sizeof(tmem->u._union._field))
#define PRE_XEN_TMEMOP_READ(_tmem, _field) \
__PRE_XEN_TMEMOP_READ(_tmem, _tmem, _field)
switch(tmem->cmd) {
case VKI_XEN_TMEM_control:
/* Common part for control hypercall:
* vki_int32_t pool_id;
* vki_uint32_t subop;
*/
PRE_MEM_READ("__HYPERVISOR_tmem_op pool_id",
(Addr)&tmem->pool_id, sizeof(&tmem->pool_id));
PRE_XEN_TMEMOP_READ(ctrl, subop);
switch (tmem->u.ctrl.subop) {
case VKI_XEN_TMEMC_save_begin:
PRE_XEN_TMEMOP_READ(ctrl, cli_id);
PRE_XEN_TMEMOP_READ(ctrl, arg1);
PRE_XEN_TMEMOP_READ(ctrl, buf);
break;
default:
bad_subop(tid, layout, arrghs, status, flags,
"__HYPERVISOR_tmem_op_control", tmem->u.ctrl.subop);
}
break;
default:
bad_subop(tid, layout, arrghs, status, flags,
"__HYPERVISOR_tmem_op", ARG1);
}
#undef PRE_XEN_TMEMOP_READ
#undef __PRE_XEN_TMEMOP_READ
}
POST(memory_op)
{
switch (ARG1) {
@ -1080,6 +1135,24 @@ POST(hvm_op)
#undef POST_XEN_HVMOP_WRITE
}
POST(tmem_op)
{
struct vki_xen_tmem_op *tmem = (struct vki_xen_tmem_op *)ARG1;
switch(tmem->cmd) {
case VKI_XEN_TMEM_control:
switch(tmem->u.ctrl.subop) {
/* No outputs */
case VKI_XEN_TMEMC_save_begin:
break;
}
break;
}
}
typedef
struct {
SyscallTableEntry entry;
@ -1140,7 +1213,7 @@ static XenHypercallTableEntry hypercall_table[] = {
HYPXY(__VKI_XEN_sysctl, sysctl, 1), // 35
HYPXY(__VKI_XEN_domctl, domctl, 1), // 36
// __VKI_XEN_kexec_op // 37
// __VKI_XEN_tmem_op // 38
HYPXY(__VKI_XEN_tmem_op, tmem_op, 1), // 38
};
static void bad_before ( ThreadId tid,

View File

@ -0,0 +1,75 @@
#ifndef __VKI_XEN_TMEM_H
#define __VKI_XEN_TMEM_H
typedef VKI_XEN_GUEST_HANDLE(char) vki_xen_tmem_cli_va_t;
/* version of ABI */
#define VKI_XEN_TMEM_spec_version 1
/* Commands to HYPERVISOR_tmem_op() */
#define VKI_XEN_TMEM_control 0
#define VKI_XEN_TMEM_new_pool 1
#define VKI_XEN_TMEM_destroy_pool 2
#define VKI_XEN_TMEM_new_page 3
#define VKI_XEN_TMEM_put_page 4
#define VKI_XEN_TMEM_get_page 5
#define VKI_XEN_TMEM_flush_page 6
#define VKI_XEN_TMEM_flush_object 7
#define VKI_XEN_TMEM_read 8
#define VKI_XEN_TMEM_write 9
#define VKI_XEN_TMEM_xchg 10
/* Privileged commands to HYPERVISOR_tmem_op() */
#define VKI_XEN_tmem_auth 101
#define VKI_XEN_tmem_restore_new 102
/* for cmd = TMEM_CONTROL */
struct vki_xen_tmem_ctrl {
vki_uint32_t subop;
/* Subops for HYPERVISOR_tmem_op(TMEM_CONTROL) */
#define VKI_XEN_TMEMC_thaw 0
#define VKI_XEN_TMEMC_freeze 1
#define VKI_XEN_TMEMC_flush 2
#define VKI_XEN_TMEMC_destroy 3
#define VKI_XEN_TMEMC_list 4
#define VKI_XEN_TMEMC_set_weight 5
#define VKI_XEN_TMEMC_set_cap 6
#define VKI_XEN_TMEMC_set_compress 7
#define VKI_XEN_TMEMC_query_freeable_mb 8
#define VKI_XEN_TMEMC_save_begin 10
#define VKI_XEN_TMEMC_save_get_version 11
#define VKI_XEN_TMEMC_save_get_maxpools 12
#define VKI_XEN_TMEMC_save_get_client_weight 13
#define VKI_XEN_TMEMC_save_get_client_cap 14
#define VKI_XEN_TMEMC_save_get_client_flags 15
#define VKI_XEN_TMEMC_save_get_pool_flags 16
#define VKI_XEN_TMEMC_save_get_pool_npages 17
#define VKI_XEN_TMEMC_save_get_pool_uuid 18
#define VKI_XEN_TMEMC_save_get_next_page 19
#define VKI_XEN_TMEMC_save_get_next_inv 20
#define VKI_XEN_TMEMC_save_end 21
#define VKI_XEN_TMEMC_restore_begin 30
#define VKI_XEN_TMEMC_restore_put_page 32
#define VKI_XEN_TMEMC_restore_flush_page 33
vki_uint32_t cli_id;
vki_uint32_t arg1;
vki_uint32_t arg2;
vki_uint64_t oid[3];
vki_xen_tmem_cli_va_t buf;
};
struct vki_xen_tmem_op {
vki_uint32_t cmd;
vki_int32_t pool_id;
union {
struct vki_xen_tmem_ctrl ctrl;
} u;
};
#endif // __VKI_XEN_TMEM_H
/*--------------------------------------------------------------------*/
/*--- end ---*/
/*--------------------------------------------------------------------*/

View File

@ -58,6 +58,7 @@ typedef vki_uint16_t vki_xen_domid_t;
#endif
DEFINE_VKI_XEN_GUEST_HANDLE(void);
DEFINE_VKI_XEN_GUEST_HANDLE(char);
DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_pfn_t);
__DEFINE_VKI_XEN_GUEST_HANDLE(vki_ulong, unsigned long);
@ -84,6 +85,7 @@ struct vki_xenctl_bitmap {
#include <vki/vki-xen-gnttab.h>
#include <vki/vki-xen-version.h>
#include <vki/vki-xen-hvm.h>
#include <vki/vki-xen-tmem.h>
#endif // __VKI_XEN_H