Am Tue, 8 Aug 2017 09:12:33 -0700 schrieb Gustavo Lima Chaves <gustavo.lima.cha...@intel.com>:
> * Henning Schild <henning.sch...@siemens.com> [2017-08-08 11:33:12 > +0200]: > > > Am Mon, 7 Aug 2017 16:24:47 -0700 > > schrieb Gustavo Lima Chaves <gustavo.lima.cha...@intel.com>: > > > > > With the new JAILHOUSE_CELL_CLEAR_MEM (struct > > > jailhouse_cell_desc's) flag, Jailhouse will cleanup all of the > > > cell's *loadable* memory, on its destruction, before handing that > > > memory region back to the root cell. This prevents the latter > > > from accessing data that the former wanted to keep private. > > > > > > One could argue that cells without passive communication > > > region (no JAILHOUSE_CELL_PASSIVE_COMMREG flag) could use a first > > > attempt to kill them to do any desired cleanup. This does not > > > cover the cases in which the cell developer still wants passive > > > communication region (they don't want to bother adding code to > > > read/write to the comms region address to their logic) but no data > > > leaks whatsoever. This also covers the case in which a cell goes > > > to parked state and never has the chance to do such cleanup: with > > > the new flag, when destroyed the root cell will still be clueless > > > of what happened there memory-wise. > > > > This is adding unneeded complexity to the hypervisor. As you > > described any cell can delay shutdown and clean up itself. If a > > cell crashes while "holding the lock" you will have to reboot, no > > memory will leak to Linux. > > Wait a minute, I was talking about the case of *not* using locks for > being killed at all (JAILHOUSE_CELL_PASSIVE_COMMREG). I even find this > design of using the lock and making the hypervisor locked nuts, but > that's another story (we should handle it with some timer, later). The lock is for safety scenarios where a cell is so important that it can block all modification of the overall system. What the apic demo shows is just a toy. In a real world scenario the cell holding the lock is likely to always say no and the trigger to try and change that would come over a second channel i.e. ivshmem-net. In that case Linux is just a massive bootloader that provides all non-safety functionality like UI. Henning > > > > If something can be done outside the hypervisor it should. Not sure > > how Jan feels about it, but from me it is a No. > > > > How about putting that feature into the inmate lib? > > > > Henning > > > > > Signed-off-by: Gustavo Lima Chaves <gustavo.lima.cha...@intel.com> > > > --- > > > hypervisor/arch/arm/mach-vexpress.c | 2 +- > > > hypervisor/arch/x86/ioapic.c | 2 +- > > > hypervisor/control.c | 28 > > > ++++++++++++++++++- hypervisor/include/jailhouse/cell-config.h | > > > 1 + hypervisor/include/jailhouse/paging.h | 3 ++- > > > hypervisor/paging.c | 43 > > > +++++++++++++++++++++++++----- > > > hypervisor/pci.c | 7 +++-- 7 files > > > changed, 71 insertions(+), 15 deletions(-) > > > > > > diff --git a/hypervisor/arch/arm/mach-vexpress.c > > > b/hypervisor/arch/arm/mach-vexpress.c index 6a2af38..0aaae71 > > > 100644 --- a/hypervisor/arch/arm/mach-vexpress.c > > > +++ b/hypervisor/arch/arm/mach-vexpress.c > > > @@ -65,7 +65,7 @@ int mach_init(void) > > > if (!sysregs_base) > > > return -ENOMEM; > > > root_entry = mmio_read32(sysregs_base + > > > VEXPRESS_FLAGSSET); > > > - paging_unmap_device(SYSREGS_BASE, sysregs_base, > > > PAGE_SIZE); > > > + paging_unmap(SYSREGS_BASE, sysregs_base, PAGE_SIZE); > > > > > > mach_cell_init(&root_cell); > > > > > > diff --git a/hypervisor/arch/x86/ioapic.c > > > b/hypervisor/arch/x86/ioapic.c index bb7dae0..ddc8c48 100644 > > > --- a/hypervisor/arch/x86/ioapic.c > > > +++ b/hypervisor/arch/x86/ioapic.c > > > @@ -262,7 +262,7 @@ done: > > > return 0; > > > > > > error_paging_destroy: > > > - paging_unmap_device(irqchip->address, > > > phys_ioapic->reg_base, PAGE_SIZE); > > > + paging_unmap(irqchip->address, phys_ioapic->reg_base, > > > PAGE_SIZE); return err; > > > } > > > > > > diff --git a/hypervisor/control.c b/hypervisor/control.c > > > index b1beed9..bbe6c0b 100644 > > > --- a/hypervisor/control.c > > > +++ b/hypervisor/control.c > > > @@ -285,6 +285,20 @@ static int remap_to_root_cell(const struct > > > jailhouse_memory *mem, return err; > > > } > > > > > > +static void cell_wipe_out_mem(const struct jailhouse_memory *mem) > > > +{ > > > + void *cell_mem = paging_map(mem->phys_start, mem->size); > > > + > > > + if (!cell_mem) { > > > + paging_dump_stats("Paging memory depleted!"); > > > + panic_printk("FATAL: out of memory on page pools\n"); > > > + panic_stop(); > > > + } > > > + > > > + memset(cell_mem, 0, mem->size); > > > + paging_unmap(mem->phys_start, cell_mem, mem->size); > > > +} > > > + > > > static void cell_destroy_internal(struct per_cpu *cpu_data, > > > struct cell *cell) { > > > const struct jailhouse_memory *mem; > > > @@ -309,8 +323,20 @@ static void cell_destroy_internal(struct > > > per_cpu *cpu_data, struct cell *cell) > > > arch_unmap_memory_region(cell, mem); > > > if (!(mem->flags & (JAILHOUSE_MEM_COMM_REGION | > > > - JAILHOUSE_MEM_ROOTSHARED))) > > > + JAILHOUSE_MEM_ROOTSHARED))) { > > > + if (mem->flags & JAILHOUSE_MEM_LOADABLE > > > && > > > + cell->config->flags & > > > JAILHOUSE_CELL_CLEAR_MEM) > > > + /* > > > + * Clear its memory region when > > > + * destroyed. Note that if a > > > cell is > > > + * parked, the root cell does > > > *not* > > > + * gain access to its memory > > > region > > > + * right away, it only happens at > > > this > > > + * point. > > > + */ > > > + cell_wipe_out_mem(mem); > > > remap_to_root_cell(mem, WARN_ON_ERROR); > > > + } > > > } > > > > > > pci_cell_exit(cell); > > > diff --git a/hypervisor/include/jailhouse/cell-config.h > > > b/hypervisor/include/jailhouse/cell-config.h index > > > 3a003f0..a9bdfdd 100644 --- > > > a/hypervisor/include/jailhouse/cell-config.h +++ > > > b/hypervisor/include/jailhouse/cell-config.h @@ -46,6 +46,7 @@ > > > > > > #define JAILHOUSE_CELL_PASSIVE_COMMREG 0x00000001 > > > #define JAILHOUSE_CELL_DEBUG_CONSOLE 0x00000002 > > > +#define JAILHOUSE_CELL_CLEAR_MEM 0x00000004 > > > > > > #define JAILHOUSE_CELL_DESC_SIGNATURE "JHCELL" > > > > > > diff --git a/hypervisor/include/jailhouse/paging.h > > > b/hypervisor/include/jailhouse/paging.h index 551f73a..f95f832 > > > 100644 --- a/hypervisor/include/jailhouse/paging.h > > > +++ b/hypervisor/include/jailhouse/paging.h > > > @@ -243,8 +243,9 @@ int paging_destroy(const struct > > > paging_structures *pg_structs, unsigned long virt, unsigned long > > > size, enum paging_coherent coherent); > > > > > > +void *paging_map(unsigned long phys, unsigned long size); > > > void *paging_map_device(unsigned long phys, unsigned long size); > > > -void paging_unmap_device(unsigned long phys, void *virt, unsigned > > > long size); +void paging_unmap(unsigned long phys, void *virt, > > > unsigned long size); > > > void *paging_get_guest_pages(const struct guest_paging_structures > > > *pg_structs, unsigned long gaddr, unsigned int num, > > > diff --git a/hypervisor/paging.c b/hypervisor/paging.c > > > index a431550..04c18be 100644 > > > --- a/hypervisor/paging.c > > > +++ b/hypervisor/paging.c > > > @@ -447,11 +447,40 @@ paging_gvirt2gphys(const struct > > > guest_paging_structures *pg_structs, } > > > > > > /** > > > + * Map physical memory into hypervisor address space > > > + * @param phys Physical address of the memory > > > region. > > > + * @param size Size of the memory region. > > > + * > > > + * @return Virtual mapping address of the memory region or NULL, > > > on > > > + * errors. > > > + * > > > + * @see paging_unmap > > > + */ > > > +void *paging_map(unsigned long phys, unsigned long size) > > > +{ > > > + void *virt; > > > + > > > + virt = page_alloc(&remap_pool, PAGES(size)); > > > + if (!virt) > > > + return NULL; > > > + > > > + if (paging_create(&hv_paging_structs, phys, size, > > > (unsigned long)virt, > > > + PAGE_DEFAULT_FLAGS, > > > PAGING_NON_COHERENT) != 0) { > > > + page_free(&remap_pool, virt, PAGES(size)); > > > + return NULL; > > > + } > > > + > > > + return virt; > > > +} > > > + > > > +/** > > > * Map physical device resource into hypervisor address space > > > * @param phys Physical address of the resource. > > > * @param size Size of the resource. > > > * > > > * @return Virtual mapping address of the resource or NULL on > > > error. > > > + * > > > + * @see paging_unmap > > > */ > > > void *paging_map_device(unsigned long phys, unsigned long size) > > > { > > > @@ -472,17 +501,17 @@ void *paging_map_device(unsigned long phys, > > > unsigned long size) } > > > > > > /** > > > - * Unmap physical device resource from hypervisor address space > > > - * @param phys Physical address of the resource. > > > - * @param virt Virtual address of the resource. > > > - * @param size Size of the resource. > > > + * Unmap physical memory from hypervisor address space > > > + * @param phys Physical address to be unmapped. > > > + * @param virt Virtual address to be unmapped. > > > + * @param size Size of memory region. > > > * > > > * @note Unmap must use the same parameters as provided to / > > > returned by > > > - * paging_map_device(). > > > + * paging_map_device()/paging_map(). > > > */ > > > -void paging_unmap_device(unsigned long phys, void *virt, unsigned > > > long size) +void paging_unmap(unsigned long phys, void *virt, > > > unsigned long size) { > > > - /* Cannot fail if paired with paging_map_device. */ > > > + /* Cannot fail if paired with > > > paging_map_device/paging_map. */ > > > paging_destroy(&hv_paging_structs, (unsigned long)virt, size, > > > PAGING_NON_COHERENT); page_free(&remap_pool, virt, PAGES(size)); > > > diff --git a/hypervisor/pci.c b/hypervisor/pci.c > > > index 2f95dd7..be37730 100644 > > > --- a/hypervisor/pci.c > > > +++ b/hypervisor/pci.c > > > @@ -634,8 +634,7 @@ static int pci_add_physical_device(struct cell > > > *cell, struct pci_device *device) return 0; > > > > > > error_unmap_table: > > > - paging_unmap_device(device->info->msix_address, > > > device->msix_table, > > > - size); > > > + paging_unmap(device->info->msix_address, > > > device->msix_table, size); error_remove_dev: > > > arch_pci_remove_physical_device(device); > > > return err; > > > @@ -656,8 +655,8 @@ static void pci_remove_physical_device(struct > > > pci_device *device) if (!device->msix_table) > > > return; > > > > > > - paging_unmap_device(device->info->msix_address, > > > device->msix_table, > > > - device->info->msix_region_size); > > > + paging_unmap(device->info->msix_address, > > > device->msix_table, > > > + device->info->msix_region_size); > > > > > > if (device->msix_vectors != device->msix_vector_array) > > > page_free(&mem_pool, device->msix_vectors, > > > > -- > > 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 > > jailhouse-dev+unsubscr...@googlegroups.com. For more options, visit > > https://groups.google.com/d/optout. > -- 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 jailhouse-dev+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.