+/*
+ * This file is part of the Palacios Virtual Machine Monitor developed
+ * by the V3VEE Project with funding from the United States National
+ * Science Foundation and the Department of Energy.
+ *
+ * The V3VEE Project is a joint project between Northwestern University
+ * and the University of New Mexico. You can find out more at
+ * http://www.v3vee.org
+ *
+ * Copyright (c) 2008, Jack Lange <jarusl@cs.northwestern.edu>
+ * Copyright (c) 2008, The V3VEE Project <http://www.v3vee.org>
+ * All rights reserved.
+ *
+ * Author: Jack Lange <jarusl@cs.northwestern.edu>
+ *
+ * This is free software. You are permitted to use,
+ * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
+ */
+
+
#ifndef __VMM_MEM_H
#define __VMM_MEM_H
+#ifdef __V3VEE__
+
+
#include <palacios/vmm_types.h>
-typedef ulong_t addr_t;
+#include <palacios/vmm_paging.h>
+#include <palacios/vmm_rbtree.h>
+#include <palacios/vmm_list.h>
-/*
+struct guest_info;
+struct v3_vm_info;
+
+
+
+#define V3_MEM_CORE_ANY ((uint16_t)-1)
+
+
+
+typedef struct {
+ union {
+ uint16_t value;
+ struct {
+ uint8_t read : 1;
+ uint8_t write : 1;
+ uint8_t exec : 1;
+ uint8_t base : 1;
+ uint8_t alloced : 1;
+ } __attribute__((packed));
+ } __attribute__((packed));
+} __attribute__((packed)) v3_mem_flags_t;
+
+
+
+struct v3_mem_region {
+ addr_t guest_start;
+ addr_t guest_end;
+
+ v3_mem_flags_t flags;
+
+ addr_t host_addr; // This either points to a host address mapping
+
+ int (*unhandled)(struct guest_info * info, addr_t guest_va, addr_t guest_pa,
+ struct v3_mem_region * reg, pf_error_t access_info);
+
+ void * priv_data;
+
+ int core_id;
- Guest Shadow Host
- Virtual Physical Virtual Physical Virtual Physical
- OK OK
- OK NOK
- NOK OK
- NOK NOK
+ struct rb_node tree_node; // This for memory regions mapped to the global map
+};
-*/
-// These are the types of physical memory address regions
-// from the perspective of the guest
-typedef enum guest_region_type {
- GUEST_REGION_NOTHING,
- GUEST_REGION_PHYSICAL_MEMORY,
- GUEST_REGION_MEMORY_MAPPED_DEVICE} guest_region_type_t;
+struct v3_mem_map {
+ struct v3_mem_region base_region;
-// These are the types of physical memory address regions
-// from the perspective of the HOST
-typedef enum host_region_type {
- HOST_REGION_INVALID, // This region is INVALID (this is a return type, to denote errors)
- HOST_REGION_NOTHING, // This region is mapped as not present (always generate page faults)
- HOST_REGION_PHYSICAL_MEMORY, // Region is a section of host memory
- HOST_REGION_MEMORY_MAPPED_DEVICE, // Region is allocated for DMA
- HOST_REGION_UNALLOCATED, // Region is mapped on demand
- HOST_REGION_REMOTE, // Region is located on a remote machine
- HOST_REGION_SWAPPED, // Region is swapped
-} host_region_type_t;
+ struct rb_root mem_regions;
+};
+int v3_init_mem_map(struct v3_vm_info * vm);
+void v3_delete_mem_map(struct v3_vm_info * vm);
-typedef struct shadow_region {
- guest_region_type_t guest_type;
- addr_t guest_start;
- addr_t guest_end;
- host_region_type_t host_type;
- union host_addr_t {
- struct physical_addr {
- addr_t host_start;
- } phys_addr;
- // Other addresses, like on disk, etc, would go here
- } host_addr;
- struct shadow_region *next, *prev;
-} shadow_region_t;
-typedef struct shadow_map {
- uint_t num_regions;
+struct v3_mem_region * v3_create_mem_region(struct v3_vm_info * vm, uint16_t core_id,
+ addr_t guest_addr_start, addr_t guest_addr_end);
- shadow_region_t * head;
-} shadow_map_t;
+int v3_insert_mem_region(struct v3_vm_info * vm, struct v3_mem_region * reg);
+void v3_delete_mem_region(struct v3_vm_info * vm, struct v3_mem_region * reg);
-void init_shadow_region(shadow_region_t * entry,
- addr_t guest_addr_start,
- addr_t guest_addr_end,
- guest_region_type_t guest_region_type,
- host_region_type_t host_region_type);
-void init_shadow_region_physical(shadow_region_t * entry,
- addr_t guest_addr_start,
- addr_t guest_addr_end,
- guest_region_type_t guest_region_type,
- addr_t host_addr_start,
- host_region_type_t host_region_type);
-
-void init_shadow_map(shadow_map_t * map);
-void free_shadow_map(shadow_map_t * map);
+/* This is a shortcut function for creating + inserting a memory region which redirects to host memory */
+int v3_add_shadow_mem(struct v3_vm_info * vm, uint16_t core_id,
+ addr_t guest_addr_start, addr_t guest_addr_end, addr_t host_addr);
-shadow_region_t * get_shadow_region_by_addr(shadow_map_t * map, addr_t guest_addr);
-shadow_region_t * get_shadow_region_by_index(shadow_map_t * map, uint_t index);
-host_region_type_t lookup_shadow_map_addr(shadow_map_t * map, addr_t guest_addr, addr_t * host_addr);
+struct v3_mem_region * v3_get_mem_region(struct v3_vm_info * vm, uint16_t core_id, addr_t guest_addr);
-// Semantics:
-// Adding a region that overlaps with an existing region results is undefined
-// and will probably fail
-int add_shadow_region(shadow_map_t * map, shadow_region_t * entry);
+uint32_t v3_get_max_page_size(struct guest_info * core, addr_t fault_addr, v3_cpu_mode_t mode);
-// Semantics:
-// Deletions result in splitting
-int delete_shadow_region(shadow_map_t * map,
- addr_t guest_start,
- addr_t guest_end);
+void v3_print_mem_map(struct v3_vm_info * vm);
-void print_shadow_map(shadow_map_t * map);
+#endif /* ! __V3VEE__ */
#endif