X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Finclude%2Fvnet%2Fvnet_host.h;h=ec6a28ceb4467ddda7785bf2a0c83dfe99ac6f90;hb=de5c2110458436a9300aa0a171dbbe83e415ee4d;hp=f237417f4e1bc34b379a9c8122788b475c917266;hpb=457148fd9d25d45b8048ae558adbc607512b5fbf;p=palacios.git diff --git a/palacios/include/vnet/vnet_host.h b/palacios/include/vnet/vnet_host.h index f237417..ec6a28c 100644 --- a/palacios/include/vnet/vnet_host.h +++ b/palacios/include/vnet/vnet_host.h @@ -20,6 +20,7 @@ #ifndef __VNET_HOST_H__ #define __VNET_HOST_H__ +#include #include struct vnet_thread { @@ -31,17 +32,24 @@ struct vnet_timer { }; typedef unsigned long vnet_lock_t; - +typedef void *vnet_intr_flags_t; struct vnet_host_hooks { - void *(*thread_start)(int (*fn)(void * arg), void * arg, char * thread_name); + void *(*thread_start)(int (*fn)(void * arg), + void * arg, + char * thread_name, + v3_resource_control_t *resource_control); + void (*thread_sleep)(long timeout); void (*thread_wakeup)(void * thread); void (*thread_stop)(void * thread); int (*thread_should_stop)(void); - void *(*timer_create)(unsigned long interval, void (* timer_fun)(void * priv_data), void * data); + void *(*timer_create)(unsigned long interval, + void (* timer_fun)(void * priv_data), + void * data); + void (*timer_del)(void * timer); void (*timer_start)(void * timer); void (*timer_stop)(void * timer); @@ -51,10 +59,10 @@ struct vnet_host_hooks { /* duplicate part from os_hooks */ void (*yield_cpu)(void); - void (*print)(const char * format, ...) - __attribute__ ((format (printf, 1, 2))); + void (*print)(void *vm , int core, const char * format, ...) + __attribute__ ((format (printf, 3, 4))); - void *(*allocate_pages)(int num_pages, unsigned int alignment); + void *(*allocate_pages)(int num_pages, unsigned int alignment, int node_id); void (*free_pages)(void * page, int num_pages); void *(*malloc)(unsigned int size); @@ -67,6 +75,8 @@ struct vnet_host_hooks { void (*mutex_free)(void * mutex); void (*mutex_lock)(void * mutex, int must_spin); void (*mutex_unlock)(void * mutex); + vnet_intr_flags_t (*mutex_lock_irqsave)(void * mutex, int must_spin); + void (*mutex_unlock_irqrestore)(void * mutex, vnet_intr_flags_t flags); }; @@ -83,7 +93,7 @@ extern struct vnet_host_hooks * host_hooks; /* 4KB-aligned */ static inline void * Vnet_AllocPages(int num_pages){ if ((host_hooks) && host_hooks->allocate_pages) { - return host_hooks->allocate_pages(num_pages, PAGE_SIZE_4KB); + return host_hooks->allocate_pages(num_pages, PAGE_SIZE_4KB,-1); } return NULL; @@ -133,7 +143,7 @@ static inline void Vnet_Yield(void){ } /* THREAD FUNCTIONS */ -struct vnet_thread * vnet_start_thread(int (*func)(void *), void * arg, char * name); +struct vnet_thread * vnet_start_thread(int (*func)(void *), void *arg, char * name); static inline void vnet_thread_sleep(long timeout){ if((host_hooks) && host_hooks->thread_sleep){ @@ -170,7 +180,9 @@ static inline void vnet_udelay(unsigned long usecs){ /* TIMER FUNCTIONS */ /* interval, in jittes */ -struct vnet_timer * vnet_create_timer(unsigned long interval, void (* timer_fun)(void * priv_data), void * pri_data); +struct vnet_timer * vnet_create_timer(unsigned long interval, + void (* timer_fun)(void * priv_data), + void * pri_data); static inline void vnet_del_timer(struct vnet_timer * timer){ if((host_hooks) && host_hooks->timer_del){ @@ -191,7 +203,8 @@ static inline void vnet_stop_timer(struct vnet_timer * timer){ } } -static inline void vnet_reset_timer(struct vnet_timer * timer, unsigned long new_interval){ +static inline void vnet_reset_timer(struct vnet_timer * timer, + unsigned long new_interval){ if((host_hooks) && host_hooks->timer_reset){ host_hooks->timer_reset(timer->host_timer, new_interval); } @@ -200,60 +213,79 @@ static inline void vnet_reset_timer(struct vnet_timer * timer, unsigned long new #define Vnet_Print(level, fmt, args...) \ - do { \ - extern int vnet_debug; \ - if(level <= vnet_debug) { \ + do { \ + extern int net_debug; \ + if(level <= net_debug) { \ extern struct vnet_host_hooks * host_hooks; \ if ((host_hooks) && (host_hooks)->print) { \ - (host_hooks)->print((fmt), ##args); \ - } \ - } \ + (host_hooks)->print(0, -1, (fmt), ##args); \ + } \ + } \ } while (0) -#define Vnet_Debug(fmt, args...) \ - do { \ +#define Vnet_Debug(fmt, args...) \ + do { \ extern struct vnet_host_hooks * host_hooks; \ if ((host_hooks) && (host_hooks)->print) { \ - (host_hooks)->print((fmt), ##args); \ - } \ + (host_hooks)->print(0, -1, (fmt), ##args); \ + } \ } while (0) /* Lock Utilities */ -int vnet_lock_init(vnet_lock_t * lock); +static inline int vnet_lock_init(vnet_lock_t * lock) { + if((host_hooks) && host_hooks->mutex_alloc){ + *lock = (addr_t)(host_hooks->mutex_alloc()); + if (*lock) { + return 0; + } + } + return -1; +} static inline void vnet_lock_deinit(vnet_lock_t * lock) { - host_hooks->mutex_free((void *)*lock); - *lock = 0; + if (host_hooks && (host_hooks->mutex_free)) { + host_hooks->mutex_free((void *)*lock); + *lock = 0; + } } static inline void vnet_lock(vnet_lock_t lock) { - host_hooks->mutex_lock((void *)lock, 0); + if (host_hooks && (host_hooks->mutex_lock)) { + host_hooks->mutex_lock((void *)lock,0); + } } static inline void vnet_unlock(vnet_lock_t lock) { - host_hooks->mutex_unlock((void *)lock); + if (host_hooks && (host_hooks->mutex_lock)) { + host_hooks->mutex_unlock((void *)lock); + } } -static inline unsigned long vnet_lock_irqsave(vnet_lock_t lock) { - //addr_t irq_state = v3_irq_save(); - host_hooks->mutex_lock((void *)lock, 1); - return 0; +static inline vnet_intr_flags_t vnet_lock_irqsave(vnet_lock_t lock) +{ + if (host_hooks && host_hooks->mutex_lock_irqsave) { + return (host_hooks->mutex_lock_irqsave((void *)lock, 1)); + } else { + return NULL; + } } -static inline void vnet_unlock_irqrestore(vnet_lock_t lock, addr_t irq_state) { - host_hooks->mutex_unlock((void *)lock); - //v3_irq_restore(irq_state); +static inline void vnet_unlock_irqrestore(vnet_lock_t lock, vnet_intr_flags_t irq_state) +{ + if (host_hooks && (host_hooks->mutex_unlock_irqrestore)) { + host_hooks->mutex_unlock_irqrestore((void *)lock,irq_state); + } } - #endif - + void init_vnet(struct vnet_host_hooks * hooks); +void deinit_vnet(void); #endif