mirror of
https://github.com/Zenithsiz/ftmemsim-valgrind.git
synced 2026-02-03 18:13:01 +00:00
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:
parent
bbbdd846be
commit
b848d83815
@ -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,
|
||||
|
||||
75
include/vki/vki-xen-tmem.h
Normal file
75
include/vki/vki-xen-tmem.h
Normal 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 ---*/
|
||||
/*--------------------------------------------------------------------*/
|
||||
@ -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
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user