#ifndef __VNET_HOST_H__
#define __VNET_HOST_H__
+#include <vnet/vnet_base.h>
#include <vnet/vnet_vmm.h>
struct vnet_thread {
};
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);
+
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);
/* 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 (*free_pages)(void * page, int num_pages);
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);
};
}
/* 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){
/* 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){
}
}
-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);
}
#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
-\r
+
void init_vnet(struct vnet_host_hooks * hooks);
+void deinit_vnet(void);
#endif