]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/xen.git/commitdiff
libxendevicemodel: add support for marking memory R/O or R/W
authorIan Campbell <ian.campbell@citrix.com>
Tue, 2 Feb 2016 15:34:26 +0000 (15:34 +0000)
committerIan Campbell <ian.campbell@citrix.com>
Wed, 10 Feb 2016 17:09:54 +0000 (17:09 +0000)
XXX underlying hypercall is not stable. Note this with the version of
    @@UNSTABLE. Also in order to build need to define __XEN_TOOLS__,
    use a separate source file to avoid accidentally poluting the
    stable bits of the library.

TBD replace hypercall with a stable variant and move to core.c +
    version as @@1.0

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
tools/libs/devicemodel/core_unstable.c
tools/libs/devicemodel/include/xendevicemodel.h
tools/libs/devicemodel/libxendevicemodel.map

index af9e0bc9a2a11f84bc7a99f75841c862212e4749..4c72f51609ed46a9d7e129de9ce3de28aa93cb52 100644 (file)
@@ -49,6 +49,50 @@ int xendevicemodel_mark_memory_region_dirty(xendevicemodel_handle *dm,
     return ret;
 }
 
+static int set_mem_type(xendevicemodel_handle *dm,
+                    xen_pfn_t start_gpfn, size_t nr_pages,
+                    hvmmem_type_t mem_type)
+{
+    xen_hvm_set_mem_type_t *arg;
+    int ret = -1;
+
+    arg = xencall_alloc_buffer(dm->call, sizeof(*arg));
+    if ( arg == NULL )
+    {
+        LOGE(ERROR, "unable to allocate memory for set mem type hypercall");
+        goto err;
+    }
+
+    arg->domid     = dm->domid;
+    arg->hvmmem_type  = mem_type;
+    arg->first_pfn    = start_gpfn;
+    arg->nr           = nr_pages;
+
+    ret = xencall2(dm->call, __HYPERVISOR_hvm_op,
+                   HVMOP_set_mem_type,
+                   (uintptr_t)arg);
+
+    if ( ret )
+        LOGE(ERROR, "set mem type hypercall failed");
+
+    xencall_free_buffer(dm->call, arg);
+
+ err:
+    return ret;
+}
+
+int xendevicemodel_make_ram_region_rw(xendevicemodel_handle *dm,
+                                      xen_pfn_t start_gpfn, size_t nr_pages)
+{
+    return set_mem_type(dm, start_gpfn, nr_pages, HVMMEM_ram_rw);
+}
+
+int xendevicemodel_make_ram_region_ro(xendevicemodel_handle *dm,
+                                      xen_pfn_t start_gpfn, size_t nr_pages)
+{
+    return set_mem_type(dm, start_gpfn, nr_pages, HVMMEM_ram_ro);
+}
+
 /*
  * Local variables:
  * mode: C
index 0858d68e9f1a336d4f31d7bc8bb13ed292bc3bdb..d410a3aafdd3ff5b2266b1746acd8b62efe74e37 100644 (file)
@@ -156,6 +156,19 @@ int xendevicemodel_inject_msi(xendevicemodel_handle *dm,
 int xendevicemodel_mark_memory_region_dirty(xendevicemodel_handle *dm,
                                             xen_pfn_t start, xen_pfn_t nr);
 
+/*
+ * Make a region of guest physical address space r/w or r/o from the
+ * guests point of view.
+ *
+ * Note that privileged mappings of such regions made by the device
+ * model are always writeable even if they are r/o to the guest.
+ * XXX TRUTH?
+ */
+int xendevicemodel_make_ram_region_rw(xendevicemodel_handle *dm,
+                                      xen_pfn_t start_gpfn, size_t nr_pages);
+int xendevicemodel_make_ram_region_ro(xendevicemodel_handle *dm,
+                                      xen_pfn_t start_gpfn, size_t nr_pages);
+
 /*
  * IOREQ Servers
  * =============
index ea183c09031d2adfc714e4339fd9f1766683c4ff..763c89fb1f01c7f76df8f65c74d35e0564366db4 100644 (file)
@@ -11,6 +11,8 @@ UNSTABLE {
                xendevicemodel_destroy_ioreq_server;
 
                xendevicemodel_mark_memory_region_dirty;
+               xendevicemodel_make_ram_region_ro;
+               xendevicemodel_make_ram_region_rw;
 
                xendevicemodel_inject_msi;
 };