libsel4utils: Initialise an empty vspace
Implemented a new interface function
'sel4utils_get_empty_vspace' that allows the user to
create a vspace that has no part of the virtual address
space being pre-reserved e.g. kernel region. This is useful in
cases where processes belong to virtual machine based applications
and need the full address space.
diff --git a/libsel4utils/include/sel4utils/vspace.h b/libsel4utils/include/sel4utils/vspace.h
index 90020f6..4e4a1b0 100644
--- a/libsel4utils/include/sel4utils/vspace.h
+++ b/libsel4utils/include/sel4utils/vspace.h
@@ -151,6 +151,28 @@
vka_t *vka, seL4_CPtr vspace_root, vspace_allocated_object_fn allocated_object_fn,
void *allocated_object_cookie);
+/**
+ * Allows for an empty vspace to be created.
+ * This is useful if you want a vspace manager, but you do not want parts of the virtual address space to be
+ * pre-reserved e.g the kernel region. The vspace is useful for guest virtual machine-based applications.
+ *
+ * @param loader vspace of the current process, used to allocate
+ * virtual memory book keeping.
+ * @param new_vspace uninitialised vspace struct to populate.
+ * @param data uninitialised vspace data struct to populate.
+ * @param vka initialised vka that this virtual memory allocator will use to
+ * allocate pages and pagetables. This allocator will never invoke free.
+ * @param vspace_root root object for the new vspace.
+ * @param allocated_object_fn function to call when objects are allocated. Can be null.
+ * @param allocated_object_cookie cookie passed when the above function is called. Can be null.
+ *
+ * @return 0 on success.
+ */
+int sel4utils_get_empty_vspace(vspace_t *loader, vspace_t *new_vspace, sel4utils_alloc_data_t *data,
+ vka_t *vka, seL4_CPtr vspace_root, vspace_allocated_object_fn allocated_object_fn,
+ void *allocated_object_cookie);
+
+
#ifdef CONFIG_VTX
/**
* Initialise a vspace allocator for an EPT address space
diff --git a/libsel4utils/src/vspace/bootstrap.c b/libsel4utils/src/vspace/bootstrap.c
index 2ce9f4d..ef81d41 100644
--- a/libsel4utils/src/vspace/bootstrap.c
+++ b/libsel4utils/src/vspace/bootstrap.c
@@ -341,6 +341,21 @@
allocated_object_cookie, sel4utils_map_page_pd);
}
+int sel4utils_get_empty_vspace(vspace_t *loader, vspace_t *new_vspace, sel4utils_alloc_data_t *data,
+ vka_t *vka, seL4_CPtr vspace_root,
+ vspace_allocated_object_fn allocated_object_fn, void *allocated_object_cookie)
+{
+ new_vspace->data = (void *) data;
+
+ if (common_init(new_vspace, vka, vspace_root, allocated_object_fn, allocated_object_cookie)) {
+ return -1;
+ }
+ data->is_empty = true;
+
+ return get_vspace_bootstrap(loader, new_vspace, data, sel4utils_map_page_pd);
+}
+
+
#ifdef CONFIG_VTX
int sel4utils_get_vspace_ept(vspace_t *loader, vspace_t *new_vspace, vka_t *vka,
seL4_CPtr ept, vspace_allocated_object_fn allocated_object_fn, void *allocated_object_cookie)