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
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
* =============