/* utility definitions */
-#if VMM_DEBUG
+#ifdef VMM_DEBUG
#define PrintDebug(fmt, args...) \
do { \
extern struct vmm_os_hooks * os_hooks; \
-#if VMM_INFO
+#ifdef VMM_INFO
#define PrintInfo(fmt, args...) \
do { \
extern struct vmm_os_hooks * os_hooks; \
#endif
-#if VMM_TRACE
+#ifdef VMM_TRACE
#define PrintTrace(fmt, args...) \
do { \
extern struct vmm_os_hooks * os_hooks; \
ret; \
}) \
+#define V3_Yield(addr) \
+ do { \
+ extern struct vmm_os_hooks * os_hooks; \
+ if ((os_hooks) && (os_hooks)->yield_cpu) { \
+ (os_hooks)->yield_cpu(); \
+ } \
+ } while (0) \
+
+
+
+
/* ** */
-//
-//
-// This is the interrupt state that the VMM's interrupt handlers need to see
-//
-struct vmm_intr_state {
- unsigned int irq;
- unsigned int error;
-
- unsigned int should_ack; // Should the vmm ack this interrupt, or will
- // the host OS do it?
-
- // This is the value given when the interrupt is hooked.
- // This will never be NULL
- void * opaque;
-};
-
-void deliver_interrupt_to_vmm(struct vmm_intr_state * state);
-
+struct guest_info;
/* This will contain function pointers that provide OS services */
struct vmm_os_hooks {
// int (*hook_interrupt)(struct guest_info *s, int irq);
- int (*hook_interrupt)(unsigned int irq, void *opaque);
+ int (*hook_interrupt)(struct guest_info * vm, unsigned int irq);
int (*ack_irq)(int irq);
void (*start_kernel_thread)(); // include pointer to function
+ void (*yield_cpu)();
+};
+
+struct v3_vm_config {
+ void * vm_kernel;
+ int use_ramdisk;
+ void * ramdisk;
+ int ramdisk_size;
};
+
/* This will contain Function pointers that control the VMs */
struct vmm_ctrl_ops {
struct guest_info *(*allocate_guest)();
- int (*config_guest)(struct guest_info * info, void * config_ptr);
+ int (*config_guest)(struct guest_info * info, struct v3_vm_config * config_ptr);
int (*init_guest)(struct guest_info * info);
int (*start_guest)(struct guest_info * info);
// int (*stop_vm)(uint_t vm_id);
-void Init_V3(struct vmm_os_hooks * hooks, struct vmm_ctrl_ops * vmm_ops);
+//
+//
+// This is the interrupt state that the VMM's interrupt handlers need to see
+//
+struct v3_interrupt {
+ unsigned int irq;
+ unsigned int error;
+ unsigned int should_ack; // Should the vmm ack this interrupt, or will
+ // the host OS do it?
+};
+void Init_V3(struct vmm_os_hooks * hooks, struct vmm_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