[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.