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 a5019735-40e9-0310-863c-91ae7b9d1cf9
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 @@
#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 @@
#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 @@
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 @@
#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 @@
#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