#include <palacios/vm_guest.h>
#include <palacios/vmm_mem.h>
#include <palacios/vmm_types.h>
-#include <devices/vnic.h>
+
#ifdef __V3VEE__
+#define V3_CREATE_THREAD(fn, arg, name) \
+ do { \
+ extern struct v3_os_hooks * os_hooks; \
+ if ((os_hooks) && (os_hooks)->start_kernel_thread) { \
+ (os_hooks)->start_kernel_thread(fn, arg, name); \
+ } \
+ } while (0)
+
+
#define V3_Hook_Interrupt(irq, opaque) ({ \
int ret = 0; \
extern struct v3_os_hooks * os_hooks; \
ret; \
}) \
+
+#define V3_ACK_IRQ(irq) \
+ do { \
+ extern struct v3_os_hooks * os_hooks; \
+ if ((os_hooks) && (os_hooks)->ack_irq) { \
+ (os_hooks)->ack_irq(irq); \
+ } \
+ } while (0)
+
+
#define V3_Yield(addr) \
do { \
extern struct v3_os_hooks * os_hooks; \
} while(0) \
-#define V3_REGISTER_PKT_DELIVERY(x) ({ \
- int ret = 0; \
- extern struct v3_os_hooks * os_hooks; \
- if ((os_hooks) && (os_hooks)->register_pkt_delivery) { \
- ret = (os_hooks)->register_pkt_delivery(x); \
- } \
- ret; \
- })
-
-#define V3_SEND_PKT(x, y) ({ \
- int ret = 0; \
- extern struct v3_os_hooks * os_hooks; \
- if ((os_hooks) && (os_hooks)->ne2k_send_packet) { \
- ret = (os_hooks)->ne2k_send_packet(x, y); \
- } \
- ret; \
- })
#define VMM_INVALID_CPU 0
typedef enum v3_cpu_arch {V3_INVALID_CPU, V3_SVM_CPU, V3_SVM_REV3_CPU, V3_VMX_CPU} v3_cpu_arch_t;
+v3_cpu_mode_t v3_get_host_cpu_mode();
+
+
#endif //!__V3VEE__
void *(*paddr_to_vaddr)(void *addr);
void *(*vaddr_to_paddr)(void *addr);
- // int (*hook_interrupt)(struct guest_info *s, int irq);
-
int (*hook_interrupt)(struct guest_info * vm, unsigned int irq);
int (*ack_irq)(int irq);
-
unsigned int (*get_cpu_khz)(void);
+ void (*start_kernel_thread)(int (*fn)(void * arg), void * arg, char * thread_name);
- void (*start_kernel_thread)(void); // include pointer to function
-
- void (*yield_cpu)(void);
+ void (*yield_cpu)(void);
- //function by network card driver
- int (*register_pkt_delivery)(int (*rcvd_fn)(uchar_t *packet, uint_t size));
- int (*ne2k_send_packet)(uchar_t *packet, uint_t size);
-
+ void *(*mutex_alloc)(void);
+ void (*mutex_free)(void * mutex);
+ void (*mutex_lock)(void * mutex, int must_spin);
+ void (*mutex_unlock)(void * mutex);
};
+
+typedef enum {NONE, HARDDRIVE, CDROM} v3_disk_type_t;
+typedef enum {RAM, NETWORK} v3_disk_connection_t;
+
+union v3_disk_info {
+ struct {
+ void * data_ptr;
+ int size;
+ } ram;
+
+ struct {
+ char * ip_str;
+ int port;
+ char * disk_name;
+ } net;
+};
+
struct v3_vm_config {
void * rombios;
int rombios_size;
// so we can specify maximum physical address size
// (We're screwed if we want to do 32 bit host/64 bit guest)
-
int enable_profiling;
+ int enable_nested_paging;
- int use_ramdisk;
- void * ramdisk;
- int ramdisk_size;
+ int enable_pci;
+
+ v3_disk_type_t pri_disk_type;
+ v3_disk_connection_t pri_disk_con;
+ union v3_disk_info pri_disk_info;
+
+ v3_disk_type_t sec_disk_type;
+ v3_disk_connection_t sec_disk_con;
+ union v3_disk_info sec_disk_info;
};
struct v3_ctrl_ops {
struct guest_info *(*allocate_guest)(void);
- int (*config_guest)(struct guest_info * info, struct v3_vm_config * config_ptr);
- int (*init_guest)(struct guest_info * info);
+ int (*init_guest)(struct guest_info * info, struct v3_vm_config * config_ptr);
int (*start_guest)(struct guest_info * info);
// int (*stop_vm)(uint_t vm_id);
void Init_V3(struct v3_os_hooks * hooks, struct v3_ctrl_ops * vmm_ops);
int v3_deliver_irq(struct guest_info * vm, struct v3_interrupt * intr);
-int v3_deliver_keyboard_evt(struct guest_info * vm);
+
#endif