xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Andrew Cooper <andrew.cooper3@citrix.com>
To: Xen-devel <xen-devel@lists.xen.org>
Cc: Andrew Cooper <andrew.cooper3@citrix.com>
Subject: [PATCH 02/13] xen: Infratructure for XEN_TMEM_* hypercalls
Date: Thu, 28 Nov 2013 18:56:50 +0000	[thread overview]
Message-ID: <1385665021-5392-3-git-send-email-andrew.cooper3@citrix.com> (raw)
In-Reply-To: <1385665021-5392-1-git-send-email-andrew.cooper3@citrix.com>

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@citrix.com>
---
 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

  parent reply	other threads:[~2013-11-28 18:56 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-11-28 18:56 [PATCH 00/13] Valgrind patches for hypercalls Andrew Cooper
2013-11-28 18:56 ` [PATCH 01/13] xen: Fix XEN_SYSCTL_getdomaininfolist for version 0xa Andrew Cooper
2013-11-28 18:56 ` Andrew Cooper [this message]
2013-11-28 18:56 ` [PATCH 03/13] xen: XENMEM_maximum_ram_page hypercall Andrew Cooper
2013-11-28 18:56 ` [PATCH 04/13] xen: XENMEM_maximum_gpfn hypercall Andrew Cooper
2013-11-28 18:56 ` [PATCH 05/13] xen: XENMEM_machphys_mfn_list hypercall Andrew Cooper
2013-11-28 18:56 ` [PATCH 06/13] xen: XENMEM_add_to_physmap hypercall Andrew Cooper
2013-11-29 11:17   ` Ian Campbell
2013-11-28 18:56 ` [PATCH 07/13] xen: XENMEM_remove_from_physmap hypercall Andrew Cooper
2013-11-28 18:56 ` [PATCH 08/13] xen: XEN_DOMCTL_gethvmcontext hypercall Andrew Cooper
2013-11-28 18:56 ` [PATCH 09/13] xen: XEN_DOMCTL_getpageframeinfo3 hypercall Andrew Cooper
2013-11-28 18:56 ` [PATCH 10/13] xen: XEN_DOMCTL_sethvmcontext hypercall Andrew Cooper
2013-11-29 11:22   ` Ian Campbell
2013-11-28 18:56 ` [PATCH 11/13] xen: XEN_DOMCTL_shadow_op hypercall Andrew Cooper
2013-11-29 11:25   ` Ian Campbell
2013-11-29 11:27     ` Andrew Cooper
2013-11-28 18:57 ` [PATCH 12/13] xen: XEN_SYSCTL_readconsole hypercall Andrew Cooper
2013-11-28 18:57 ` [PATCH 13/13] xen: XEN_SYSCTL_debugkeys hypercall Andrew Cooper
2013-11-29 11:45 ` [PATCH 00/13] Valgrind patches for hypercalls Ian Campbell
2013-12-02 10:37   ` Ian Campbell
2013-12-02 10:46     ` Andrew Cooper
2013-12-02 10:49       ` Ian Campbell
2013-12-02 10:55         ` Andrew Cooper
2013-12-02 11:16           ` Ian Campbell
2013-12-02 14:25 ` Ian Campbell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1385665021-5392-3-git-send-email-andrew.cooper3@citrix.com \
    --to=andrew.cooper3@citrix.com \
    --cc=xen-devel@lists.xen.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).