]> rtime.felk.cvut.cz Git - jailhouse.git/commitdiff
core/driver: Introduce jailhouse_cell_mem_regions helper
authorJan Kiszka <jan.kiszka@siemens.com>
Thu, 26 Dec 2013 23:27:33 +0000 (00:27 +0100)
committerJan Kiszka <jan.kiszka@siemens.com>
Fri, 27 Dec 2013 13:39:59 +0000 (14:39 +0100)
Given a cell configuration, this function returns a pointer to the first
memory region. Use it instead of open-coding the address calculation.
This requires marking several pointers to jailhouse_memory as
referencing a constant data structure.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
hypervisor/arch/x86/vmx.c
hypervisor/arch/x86/vtd.c
hypervisor/control.c
hypervisor/include/jailhouse/cell-config.h
hypervisor/include/jailhouse/control.h
main.c

index 30f92f0b6428d5bfc6a0cc4a18b2e77ca6f6b8ca..4aa83ef811a51afe02a3d6bda82a3c7bfe205b2f 100644 (file)
@@ -161,7 +161,7 @@ void vmx_init(void)
 }
 
 static int vmx_map_memory_region(struct cell *cell,
-                                struct jailhouse_memory *mem)
+                                const struct jailhouse_memory *mem)
 {
        u32 table_flags, page_flags = EPT_FLAG_WB_TYPE;
 
@@ -181,7 +181,8 @@ static int vmx_map_memory_region(struct cell *cell,
 int vmx_cell_init(struct cell *cell)
 {
        struct jailhouse_cell_desc *config = cell->config;
-       struct jailhouse_memory *mem;
+       const struct jailhouse_memory *mem =
+               jailhouse_cell_mem_regions(config);
        u32 pio_bitmap_size, size;
        u8 *pio_bitmap;
        int n, err;
@@ -191,9 +192,6 @@ int vmx_cell_init(struct cell *cell)
        if (!cell->vmx.ept)
                return -ENOMEM;
 
-       mem = (void *)config + sizeof(struct jailhouse_cell_desc) +
-               config->cpu_set_size;
-
        for (n = 0; n < config->num_memory_regions; n++, mem++) {
                err = vmx_map_memory_region(cell, mem);
                if (err)
@@ -230,14 +228,12 @@ int vmx_cell_init(struct cell *cell)
 
 void vmx_linux_cell_shrink(struct jailhouse_cell_desc *config)
 {
-       struct jailhouse_memory *mem;
+       const struct jailhouse_memory *mem =
+               jailhouse_cell_mem_regions(config);
        u32 pio_bitmap_size;
        u8 *pio_bitmap, *b;
        int n;
 
-       mem = (void *)config + sizeof(struct jailhouse_cell_desc) +
-               config->cpu_set_size;
-
        for (n = 0; n < config->num_memory_regions; n++, mem++)
                page_map_destroy(linux_cell.vmx.ept, mem->phys_start,
                                 mem->size, PAGE_DIR_LEVELS,
@@ -255,21 +251,19 @@ void vmx_linux_cell_shrink(struct jailhouse_cell_desc *config)
 }
 
 static bool address_in_region(unsigned long addr,
-                             struct jailhouse_memory *region)
+                             const struct jailhouse_memory *region)
 {
        return addr >= region->phys_start &&
               addr < (region->phys_start + region->size);
 }
 
-static void vmx_remap_to_linux(struct jailhouse_memory *mem)
+static void vmx_remap_to_linux(const struct jailhouse_memory *mem)
 {
-       struct jailhouse_memory *linux_mem, overlap;
+       const struct jailhouse_memory *linux_mem =
+               jailhouse_cell_mem_regions(linux_cell.config);
+       struct jailhouse_memory overlap;
        int n, err;
 
-       linux_mem = (void *)linux_cell.config +
-               sizeof(struct jailhouse_cell_desc) +
-               linux_cell.config->cpu_set_size;
-
        for (n = 0; n < linux_cell.config->num_memory_regions;
             n++, linux_mem++) {
                if (address_in_region(mem->phys_start, linux_mem)) {
@@ -301,14 +295,12 @@ static void vmx_remap_to_linux(struct jailhouse_memory *mem)
 void vmx_cell_exit(struct cell *cell)
 {
        struct jailhouse_cell_desc *config = cell->config;
+       const struct jailhouse_memory *mem =
+               jailhouse_cell_mem_regions(config);
        u8 *pio_bitmap, *linux_pio_bitmap, *b;
-       struct jailhouse_memory *mem;
        u32 pio_bitmap_size;
        int n;
 
-       mem = (void *)config + sizeof(struct jailhouse_cell_desc) +
-               config->cpu_set_size;
-
        for (n = 0; n < config->num_memory_regions; n++, mem++) {
                page_map_destroy(cell->vmx.ept, mem->virt_start, mem->size,
                                 PAGE_DIR_LEVELS, PAGE_MAP_NON_COHERENT);
index 92ce5e700cf8d8a4cdb507432a43bfb071d404ee..9a87e0fffca784e05a0b6af2dc69e1b3a81a1ac0 100644 (file)
@@ -179,9 +179,10 @@ static bool vtd_add_device_to_cell(struct cell *cell,
 int vtd_cell_init(struct cell *cell)
 {
        struct jailhouse_cell_desc *config = cell->config;
+       const struct jailhouse_memory *mem =
+               jailhouse_cell_mem_regions(config);
        struct jailhouse_pci_device *dev;
        void *reg_base = dmar_reg_base;
-       struct jailhouse_memory *mem;
        u32 page_flags;
        int n, err;
 
@@ -196,9 +197,6 @@ int vtd_cell_init(struct cell *cell)
        if (!cell->vtd.page_table)
                return -ENOMEM;
 
-       mem = (void *)config + sizeof(struct jailhouse_cell_desc) +
-               config->cpu_set_size;
-
        for (n = 0; n < config->num_memory_regions; n++, mem++) {
                if (!(mem->access_flags & JAILHOUSE_MEM_DMA))
                        continue;
@@ -273,9 +271,8 @@ static void vtd_remove_device_from_cell(struct cell *cell,
 
 void vtd_linux_cell_shrink(struct jailhouse_cell_desc *config)
 {
-       struct jailhouse_memory *mem =
-               (void *)config + sizeof(struct jailhouse_cell_desc) +
-               config->cpu_set_size;
+       const struct jailhouse_memory *mem =
+               jailhouse_cell_mem_regions(config);
        struct jailhouse_pci_device *dev;
        unsigned int n;
 
index 7152d47309bc84eae55ecfffa345ff002b7bc5fb..5e92bcbe54ebec873666a0457d4c936623bde6f9 100644 (file)
@@ -70,9 +70,8 @@ int cell_init(struct cell *cell, bool copy_cpu_set)
                (unsigned long *)(((void *)cell->config) +
                                  sizeof(struct jailhouse_cell_desc));
        unsigned long cpu_set_size = cell->config->cpu_set_size;
-       struct jailhouse_memory *config_ram =
-               (struct jailhouse_memory *)(((void *)config_cpu_set) +
-                                           cpu_set_size);
+       const struct jailhouse_memory *config_ram =
+               jailhouse_cell_mem_regions(cell->config);
        struct cpu_set *cpu_set;
 
        cell->id = get_free_cell_id();
@@ -115,14 +114,12 @@ static struct cell *cell_find(const char *name)
        return cell;
 }
 
-int check_mem_regions(struct jailhouse_cell_desc *config)
+int check_mem_regions(const struct jailhouse_cell_desc *config)
 {
-       struct jailhouse_memory *mem;
+       const struct jailhouse_memory *mem =
+               jailhouse_cell_mem_regions(config);
        unsigned int n;
 
-       mem = (void *)config + sizeof(struct jailhouse_cell_desc) +
-               config->cpu_set_size;
-
        for (n = 0; n < config->num_memory_regions; n++, mem++) {
                if (mem->phys_start & ~PAGE_MASK ||
                    mem->virt_start & ~PAGE_MASK ||
index 820dd7ef03df5efac98e7f7de456f4d921cb7ae6..fac4fffe9326ea6086b5dde2dd0084049efbd3ca 100644 (file)
@@ -85,4 +85,11 @@ jailhouse_system_config_size(struct jailhouse_system *system)
                jailhouse_cell_config_size(&system->system);
 }
 
+static inline const struct jailhouse_memory *
+jailhouse_cell_mem_regions(const struct jailhouse_cell_desc *cell)
+{
+       return (const struct jailhouse_memory *)((void *)cell +
+               sizeof(struct jailhouse_cell_desc) + cell->cpu_set_size);
+}
+
 #endif /* !_JAILHOUSE_CELL_CONFIG_H */
index 121f6b94934075946fb7be277675cd55697b3d7f..f040db5e92cf58ee7befd372ee3e3eb96d1653e0 100644 (file)
@@ -31,7 +31,7 @@ unsigned int next_cpu(unsigned int cpu, struct cpu_set *cpu_set,
             (cpu) <= (set)->max_cpu_id;                        \
            )
 
-int check_mem_regions(struct jailhouse_cell_desc *config);
+int check_mem_regions(const struct jailhouse_cell_desc *config);
 int cell_init(struct cell *cell, bool copy_cpu_set);
 
 int cell_create(struct per_cpu *cpu_data, unsigned long config_address);
diff --git a/main.c b/main.c
index 6bdb0725453b3094993e4d8a6fb8ffea26b88179..3e283da1dc6d166e43bd839a9dcf3fe5b1a620da 100644 (file)
--- a/main.c
+++ b/main.c
@@ -271,7 +271,7 @@ static int jailhouse_cell_create(struct jailhouse_new_cell __user *arg)
        struct jailhouse_new_cell *cell = &cell_buffer.cell;
        struct jailhouse_preload_image *image = &cell->image[0];
        struct jailhouse_cell_desc *config;
-       struct jailhouse_memory *ram;
+       const struct jailhouse_memory *ram;
        unsigned int cpu;
        void *cell_mem;
        int err;
@@ -297,8 +297,7 @@ static int jailhouse_cell_create(struct jailhouse_new_cell __user *arg)
        }
        config->name[JAILHOUSE_CELL_NAME_MAXLEN] = 0;
 
-       ram = ((void *)config) + sizeof(struct jailhouse_cell_desc) +
-               config->cpu_set_size;
+       ram = jailhouse_cell_mem_regions(config);
        if (config->num_memory_regions < 1 || ram->size < 1024 * 1024 ||
            image->target_address + image->size > ram->size) {
                err = -EINVAL;