Signed-off-by: Andrea Bastoni <[email protected]>
---
hypervisor/control.c | 40 ++++++++++++++++++++++++----------------
1 file changed, 24 insertions(+), 16 deletions(-)
diff --git a/hypervisor/control.c b/hypervisor/control.c
index d6ede805..10f8a271 100644
--- a/hypervisor/control.c
+++ b/hypervisor/control.c
@@ -300,7 +300,7 @@ static bool address_in_region(unsigned long addr,
addr < (region->phys_start + region->size);
}
-static int unmap_from_root_cell(const struct jailhouse_memory *mem)
+static int unmap_from_root_cell(const struct jailhouse_memory *mem, bool
create)
{
/*
* arch_unmap_memory_region and mmio_subpage_unregister use the
@@ -316,6 +316,11 @@ static int unmap_from_root_cell(const struct
jailhouse_memory *mem)
return 0;
}
+ if (!create && (mem->flags & JAILHOUSE_MEM_COLORED)) {
+ assert(tmp.colors != 0);
+ return arch_color_unmap_from_root(&tmp);
+ }
+
return arch_unmap_memory_region(&root_cell, &tmp);
}
@@ -347,10 +352,21 @@ int remap_to_root_cell(const struct jailhouse_memory *mem,
overlap.phys_start - root_mem->phys_start;
overlap.flags = root_mem->flags;
- if (JAILHOUSE_MEMORY_IS_SUBPAGE(&overlap))
- err = mmio_subpage_register(&root_cell, &overlap);
- else
- err = arch_map_memory_region(&root_cell, &overlap);
+ if ((mem->flags & JAILHOUSE_MEM_COLORED) &&
+ (mode == ABORT_ON_ERROR)) {
+ /* ABORT_ON_ERROR signals that we're loading the
+ * cell, WARN_ON_ERROR that we're deleting it.
+ * On deletion, we're already taking the right colors
+ * into account.
+ */
+ overlap.colors = mem->colors;
+ err = arch_color_remap_to_root(&overlap);
+ } else {
+ if (JAILHOUSE_MEMORY_IS_SUBPAGE(&overlap))
+ err = mmio_subpage_register(&root_cell,
&overlap);
+ else
+ err = arch_map_memory_region(&root_cell,
&overlap);
+ }
if (err) {
if (mode == ABORT_ON_ERROR)
break;
@@ -532,7 +548,7 @@ static int cell_create(struct per_cpu *cpu_data, unsigned
long config_address)
*/
if (!(mem->flags & (JAILHOUSE_MEM_COMM_REGION |
JAILHOUSE_MEM_ROOTSHARED))) {
- err = unmap_from_root_cell(mem);
+ err = unmap_from_root_cell(mem, true);
if (err)
goto err_destroy_cell;
}
@@ -645,11 +661,7 @@ static int cell_start(struct per_cpu *cpu_data, unsigned
long id)
/* unmap all loadable memory regions from the root cell */
for_each_mem_region(mem, cell->config, n)
if (mem->flags & JAILHOUSE_MEM_LOADABLE) {
- if (mem->flags & JAILHOUSE_MEM_COLORED) {
- err = arch_color_unmap_from_root(mem);
- } else {
- err = unmap_from_root_cell(mem);
- }
+ err = unmap_from_root_cell(mem, false);
if (err)
goto out_resume;
}
@@ -727,11 +739,7 @@ static int cell_set_loadable(struct per_cpu *cpu_data,
unsigned long id)
/* map all loadable memory regions into the root cell */
for_each_mem_region(mem, cell->config, n)
if (mem->flags & JAILHOUSE_MEM_LOADABLE) {
- if (mem->flags & JAILHOUSE_MEM_COLORED) {
- err = arch_color_remap_to_root(mem);
- } else {
- err = remap_to_root_cell(mem, ABORT_ON_ERROR);
- }
+ err = remap_to_root_cell(mem, ABORT_ON_ERROR);
if (err)
goto out_resume;
}
--
2.29.2
--
You received this message because you are subscribed to the Google Groups
"Jailhouse" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/jailhouse-dev/20210125120044.56794-24-andrea.bastoni%40tum.de.