From: Jack Lange Date: Fri, 11 Apr 2008 22:46:46 +0000 (+0000) Subject: *** empty log message *** X-Git-Tag: working-cdboot-physical-but-not-qemu~21 X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=a27a60b911afe29329cf93b23e274e0ef182093e *** empty log message *** --- diff --git a/palacios/include/palacios/vmm_io.h b/palacios/include/palacios/vmm_io.h index df58367..14c2e76 100644 --- a/palacios/include/palacios/vmm_io.h +++ b/palacios/include/palacios/vmm_io.h @@ -37,7 +37,7 @@ typedef struct vmm_io_map { 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); @@ -48,6 +48,8 @@ void hook_io_port(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); diff --git a/palacios/src/palacios/vmm_io.c b/palacios/src/palacios/vmm_io.c index bd5648d..350eb29 100644 --- a/palacios/src/palacios/vmm_io.c +++ b/palacios/src/palacios/vmm_io.c @@ -51,6 +51,25 @@ 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) { + 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), @@ -70,6 +89,17 @@ void hook_io_port(vmm_io_map_t * io_map, uint_t port, 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;