void add_io_hook(vmm_io_map_t * io_map, vmm_io_hook_t * io_hook);
-
+void remove_io_hook(vmm_io_map_t * io_map, vmm_io_hook_t * io_hook);
vmm_io_hook_t * get_io_hook(vmm_io_map_t * io_map, uint_t port);
int (*write)(ushort_t port, void * src, uint_t length, void * priv_data),
void * priv_data );
+int unhook_io_port(vmm_io_map_t * io_map, uint_t port);
+
void init_vmm_io_map(vmm_io_map_t * io_map);
void PrintDebugIOMap(vmm_io_map_t * io_map);
}
}
+void remove_io_hook(vmm_io_map_t * io_map, vmm_io_hook_t * io_hook) {
+ if (io_map->head == io_hook) {
+ io_map->head = io_hook->next;
+ } else if (io_hook->prev) {
+ io_hook->prev->next = io_hook->next;
+ } else {
+ // data corruption failure
+ }
+
+ if (io_hook->next) {
+ io_hook->next->prev = io_hook->prev;
+ }
+
+ io_map->num_ports--;
+
+ return;
+}
+
+
void 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),
return;
}
+int unhook_io_port(vmm_io_map_t * io_map, uint_t port) {
+ vmm_io_hook_t * hook = get_io_hook(io_map, port);
+
+ if (hook == NULL) {
+ return -1;
+ }
+
+ remove_io_hook(io_map, hook);
+ return 0;
+}
+
vmm_io_hook_t * get_io_hook(vmm_io_map_t * io_map, uint_t port) {
vmm_io_hook_t * tmp_hook;