X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=linux_module%2Fpalacios.h;h=f9927c24d3a44dcb1b9b3cc3f1eb1e05d7c13aba;hb=c17cafcb6db943bd5bbb31d86f0392c113b2d668;hp=a172adbb2e734d458a6f1afdc5537df05d76f558;hpb=acaadd79c597c8d5180fbfbec79c01fef3dff003;p=palacios.git diff --git a/linux_module/palacios.h b/linux_module/palacios.h index a172adb..f9927c2 100644 --- a/linux_module/palacios.h +++ b/linux_module/palacios.h @@ -52,9 +52,18 @@ struct v3_guest_img { char name[128]; } __attribute__((packed)); +typedef enum { PREALLOCATED=0, // user space-allocated (e.g. hot remove) + REQUESTED, // kernel will attempt allocation (anywhere) + REQUESTED32, // kernel will attempt allocation (<4GB) + +} v3_mem_region_type_t; + struct v3_mem_region { - unsigned long long base_addr; - unsigned long long num_pages; + v3_mem_region_type_t type; // + int node; // numa node for REQUESTED (-1 = any) + unsigned long long base_addr; // region start (hpa) for PREALLOCATED + unsigned long long num_pages; // size for PREALLOCATED or request size for REQUESTED + // should be power of 2 and > V3_CONFIG_MEM_BLOCK } __attribute__((packed)); struct v3_debug_cmd { @@ -70,6 +79,12 @@ struct v3_core_move_cmd { struct v3_chkpt_info { char store[128]; char url[256]; /* This might need to be bigger... */ + unsigned long long opts; +#define V3_CHKPT_OPT_NONE 0 +#define V3_CHKPT_OPT_SKIP_MEM 1 // don't write memory to store +#define V3_CHKPT_OPT_SKIP_DEVS 2 // don't write devices to store +#define V3_CHKPT_OPT_SKIP_CORES 4 // don't write core arch ind data to store +#define V3_CHKPT_OPT_SKIP_ARCHDEP 8 // don't write core arch dep data to store } __attribute__((packed)); @@ -114,7 +129,7 @@ struct v3_guest { -int palacios_vmm_init( void ); +int palacios_vmm_init( char *options ); int palacios_vmm_exit( void ); @@ -125,11 +140,17 @@ struct proc_dir_entry *palacios_get_procdir(void); // The idea is that everything uses the same stubs void palacios_print_scoped(void *vm, int vcore, const char *fmt, ...); #define palacios_print(...) palacios_print_scoped(0,-1, __VA_ARGS__) -void *palacios_allocate_pages(int num_pages, unsigned int alignment); +void *palacios_allocate_pages(int num_pages, unsigned int alignment, int node_id); void palacios_free_pages(void *page_addr, int num_pages); void *palacios_alloc(unsigned int size); void *palacios_alloc_extended(unsigned int size, unsigned int flags); +// FIX +// NEED A palacios_alloc_node wrapper +// +#define palacios_alloc_node_extended(size, flags, node) kmalloc_node(size,flags,node) void palacios_free(void *); +void *palacios_valloc(unsigned int size); // use instead of vmalloc +void palacios_vfree(void *); // use instead of vfree void *palacios_vaddr_to_paddr(void *vaddr); void *palacios_paddr_to_vaddr(void *paddr); void *palacios_start_kernel_thread(int (*fn)(void * arg), void *arg, char *thread_name); @@ -139,13 +160,23 @@ void palacios_yield_cpu(void); void palacios_yield_cpu_timed(unsigned int us); unsigned int palacios_get_cpu(void); unsigned int palacios_get_cpu_khz(void); -void *palacios_mutex_alloc(void); -void palacios_mutex_free(void *mutex); +void *palacios_mutex_alloc(void); // allocates and inits a lock +void palacios_mutex_init(void *mutex); // only inits a lock +void palacios_mutex_deinit(void *mutex); // only deinits a lock +void palacios_mutex_free(void *mutex); // deinits and frees a lock void palacios_mutex_lock(void *mutex, int must_spin); void palacios_mutex_unlock(void *mutex); void *palacios_mutex_lock_irqsave(void *mutex, int must_spin); void palacios_mutex_unlock_irqrestore(void *mutex, void *flags); - +// Macros for spin-locks in the module code +// By using these macros, the lock checker will be able +// to see the module code as well as the core VMM +#define palacios_spinlock_init(l) palacios_mutex_init(l) +#define palacios_spinlock_deinit(l) palacios_mutex_deinit(l) +#define palacios_spinlock_lock(l) palacios_mutex_lock(l,0) +#define palacios_spinlock_unlock(l) palacios_mutex_unlock(l) +#define palacios_spinlock_lock_irqsave(l,f) do { f=(unsigned long)palacios_mutex_lock_irqsave(l,0); } while (0) +#define palacios_spinlock_unlock_irqrestore(l,f) palacios_mutex_unlock_irqrestore(l,(void*)f) // Palacios Printing Support