}
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;
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;
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)
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,
}
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)) {
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);
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;
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;
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;
(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();
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 ||
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;
}
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;