#include <palacios/vmm_string.h>
#include <palacios/vmm.h>
-extern struct vmm_os_hooks * os_hooks;
+#ifndef DEBUG_IO
+#undef PrintDebug
+#define PrintDebug(fmt, args...)
+#endif
-void init_vmm_io_map(vmm_io_map_t * io_map) {
+void init_vmm_io_map(struct guest_info * info) {
+ struct vmm_io_map * io_map = &(info->io_map);
io_map->num_ports = 0;
io_map->head = NULL;
}
-int add_io_hook(vmm_io_map_t * io_map, vmm_io_hook_t * io_hook) {
+
+
+static int add_io_hook(struct vmm_io_map * io_map, struct vmm_io_hook * io_hook) {
if (!(io_map->head)) {
io_map->head = io_hook;
return 0;
} else {
- vmm_io_hook_t * tmp_hook = io_map->head;
+ struct vmm_io_hook * tmp_hook = io_map->head;
while ((tmp_hook->next) &&
(tmp_hook->next->port <= io_hook->port)) {
if (tmp_hook->port == io_hook->port) {
//tmp_hook->read = io_hook->read;
//tmp_hook->write = io_hook->write;
-
- //VMMFree(io_hook);
+ //V3_Free(io_hook);
return -1;
} else {
io_hook->prev = tmp_hook;
return -1;
}
-int remove_io_hook(vmm_io_map_t * io_map, vmm_io_hook_t * io_hook) {
+static int remove_io_hook(struct vmm_io_map * io_map, struct vmm_io_hook * io_hook) {
if (io_map->head == io_hook) {
io_map->head = io_hook->next;
} else if (io_hook->prev) {
return 0;
}
-int hook_io_port(vmm_io_map_t * io_map, uint_t port,
- int (*read)(ushort_t port, void * dst, uint_t length, void * priv_data),
- int (*write)(ushort_t port, void * src, uint_t length, void * priv_data),
- void * priv_data) {
- vmm_io_hook_t * io_hook = os_hooks->malloc(sizeof(vmm_io_hook_t));
+int v3_hook_io_port(struct guest_info * info, uint_t port,
+ int (*read)(ushort_t port, void * dst, uint_t length, void * priv_data),
+ int (*write)(ushort_t port, void * src, uint_t length, void * priv_data),
+ void * priv_data) {
+ struct vmm_io_map * io_map = &(info->io_map);
+ struct vmm_io_hook * io_hook = (struct vmm_io_hook *)V3_Malloc(sizeof(struct vmm_io_hook));
io_hook->port = port;
io_hook->priv_data = priv_data;
if (add_io_hook(io_map, io_hook) != 0) {
- VMMFree(io_hook);
+ V3_Free(io_hook);
return -1;
}
return 0;
}
-int unhook_io_port(vmm_io_map_t * io_map, uint_t port) {
- vmm_io_hook_t * hook = get_io_hook(io_map, port);
+int v3_unhook_io_port(struct guest_info * info, uint_t port) {
+ struct vmm_io_map * io_map = &(info->io_map);
+ struct vmm_io_hook * hook = v3_get_io_hook(io_map, port);
if (hook == NULL) {
return -1;
}
-vmm_io_hook_t * get_io_hook(vmm_io_map_t * io_map, uint_t port) {
- vmm_io_hook_t * tmp_hook;
+struct vmm_io_hook * v3_get_io_hook(struct vmm_io_map * io_map, uint_t port) {
+ struct vmm_io_hook * tmp_hook;
FOREACH_IO_HOOK(*io_map, tmp_hook) {
if (tmp_hook->port == port) {
return tmp_hook;
-void PrintDebugIOMap(vmm_io_map_t * io_map) {
- vmm_io_hook_t * iter = io_map->head;
+void PrintDebugIOMap(struct vmm_io_map * io_map) {
+ struct vmm_io_hook * iter = io_map->head;
PrintDebug("VMM IO Map (Entries=%d)\n", io_map->num_ports);