[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 02/13] 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. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- coregrind/m_syswrap/syswrap-xen.c | 75 ++++++++++++++++++++++++++++++++++++- include/vki/vki-xen-tmem.h | 75 +++++++++++++++++++++++++++++++++++++ include/vki/vki-xen.h | 2 + 3 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 include/vki/vki-xen-tmem.h diff --git a/coregrind/m_syswrap/syswrap-xen.c b/coregrind/m_syswrap/syswrap-xen.c index 0314451..e80c05d 100644 --- a/coregrind/m_syswrap/syswrap-xen.c +++ b/coregrind/m_syswrap/syswrap-xen.c @@ -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, diff --git a/include/vki/vki-xen-tmem.h b/include/vki/vki-xen-tmem.h new file mode 100644 index 0000000..ab402f0 --- /dev/null +++ b/include/vki/vki-xen-tmem.h @@ -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 ---*/ +/*--------------------------------------------------------------------*/ diff --git a/include/vki/vki-xen.h b/include/vki/vki-xen.h index 87fbb4f..e2f3d81 100644 --- a/include/vki/vki-xen.h +++ b/include/vki/vki-xen.h @@ -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 -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |