X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_io.c;h=4dbd61d5a97542a7d4b33d6f42fd552c1601ab25;hb=82b8b87c344fcd1eab22e3f3be5ad54cbb3f8f68;hp=e3820b900aa792ca3bfcb76d947fbb3317589cce;hpb=a6865d183eedbdf3e5510e4be89dcb5ce51b5953;p=palacios.git diff --git a/palacios/src/palacios/vmm_io.c b/palacios/src/palacios/vmm_io.c index e3820b9..4dbd61d 100644 --- a/palacios/src/palacios/vmm_io.c +++ b/palacios/src/palacios/vmm_io.c @@ -24,26 +24,29 @@ -#ifndef DEBUG_IO +#ifndef CONFIG_DEBUG_IO #undef PrintDebug #define PrintDebug(fmt, args...) #endif -static int default_write(ushort_t port, void *src, uint_t length, void * priv_data); -static int default_read(ushort_t port, void * dst, uint_t length, void * priv_data); +static int default_write(uint16_t port, void *src, uint_t length, void * priv_data); +static int default_read(uint16_t port, void * dst, uint_t length, void * priv_data); void v3_init_io_map(struct guest_info * info) { - info->io_map.rb_node = NULL; -} + info->io_map.map.rb_node = NULL; + info->io_map.arch_data = NULL; + info->io_map.update_map = NULL; + +} static inline struct v3_io_hook * __insert_io_hook(struct guest_info * info, struct v3_io_hook * hook) { - struct rb_node ** p = &(info->io_map.rb_node); + struct rb_node ** p = &(info->io_map.map.rb_node); struct rb_node * parent = NULL; struct v3_io_hook * tmp_hook = NULL; @@ -72,14 +75,14 @@ static inline struct v3_io_hook * insert_io_hook(struct guest_info * info, struc return ret; } - v3_rb_insert_color(&(hook->tree_node), &(info->io_map)); + v3_rb_insert_color(&(hook->tree_node), &(info->io_map.map)); return NULL; } struct v3_io_hook * v3_get_io_hook(struct guest_info * info, uint_t port) { - struct rb_node * n = info->io_map.rb_node; + struct rb_node * n = info->io_map.map.rb_node; struct v3_io_hook * hook = NULL; while (n) { @@ -103,8 +106,8 @@ struct v3_io_hook * v3_get_io_hook(struct guest_info * info, uint_t port) { 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), + int (*read)(uint16_t port, void * dst, uint_t length, void * priv_data), + int (*write)(uint16_t port, void * src, uint_t length, void * priv_data), void * priv_data) { struct v3_io_hook * io_hook = (struct v3_io_hook *)V3_Malloc(sizeof(struct v3_io_hook)); @@ -126,10 +129,21 @@ int v3_hook_io_port(struct guest_info * info, uint_t port, io_hook->priv_data = priv_data; if (insert_io_hook(info, io_hook)) { - V3_Free(io_hook); - return -1; + PrintError("Could not insert IO hook for port %d\n", port); + V3_Free(io_hook); + return -1; + } + + + if (info->io_map.update_map(info, port, + ((read == NULL) ? 0 : 1), + ((write == NULL) ? 0 : 1)) == -1) { + PrintError("Could not update IO map for port %d\n", port); + V3_Free(io_hook); + return -1; } + return 0; } @@ -140,7 +154,12 @@ int v3_unhook_io_port(struct guest_info * info, uint_t port) { return -1; } - v3_rb_erase(&(hook->tree_node), &(info->io_map)); + v3_rb_erase(&(hook->tree_node), &(info->io_map.map)); + + // set the arch map to default (this should be 1, 1) + info->io_map.update_map(info, port, 0, 0); + + V3_Free(hook); return 0; } @@ -152,9 +171,9 @@ int v3_unhook_io_port(struct guest_info * info, uint_t port) { void v3_print_io_map(struct guest_info * info) { struct v3_io_hook * tmp_hook = NULL; - struct rb_node * node = v3_rb_first(&(info->io_map)); + struct rb_node * node = v3_rb_first(&(info->io_map.map)); - PrintDebug("VMM IO Map (Entries=%d)\n", io_map->num_ports); + PrintDebug("VMM IO Map\n"); do { tmp_hook = rb_entry(node, struct v3_io_hook, tree_node); @@ -170,7 +189,7 @@ void v3_print_io_map(struct guest_info * info) { /* * Write a byte to an I/O port. */ -void v3_outb(ushort_t port, uchar_t value) { +void v3_outb(uint16_t port, uint8_t value) { __asm__ __volatile__ ( "outb %b0, %w1" : @@ -181,8 +200,8 @@ void v3_outb(ushort_t port, uchar_t value) { /* * Read a byte from an I/O port. */ -uchar_t v3_inb(ushort_t port) { - uchar_t value; +uint8_t v3_inb(uint16_t port) { + uint8_t value; __asm__ __volatile__ ( "inb %w1, %b0" @@ -196,7 +215,7 @@ uchar_t v3_inb(ushort_t port) { /* * Write a word to an I/O port. */ -void v3_outw(ushort_t port, ushort_t value) { +void v3_outw(uint16_t port, uint16_t value) { __asm__ __volatile__ ( "outw %w0, %w1" : @@ -207,8 +226,8 @@ void v3_outw(ushort_t port, ushort_t value) { /* * Read a word from an I/O port. */ -ushort_t v3_inw(ushort_t port) { - ushort_t value; +uint16_t v3_inw(uint16_t port) { + uint16_t value; __asm__ __volatile__ ( "inw %w1, %w0" @@ -222,7 +241,7 @@ ushort_t v3_inw(ushort_t port) { /* * Write a double word to an I/O port. */ -void v3_outdw(ushort_t port, uint_t value) { +void v3_outdw(uint16_t port, uint_t value) { __asm__ __volatile__ ( "outl %0, %1" : @@ -233,7 +252,7 @@ void v3_outdw(ushort_t port, uint_t value) { /* * Read a double word from an I/O port. */ -uint_t v3_indw(ushort_t port) { +uint_t v3_indw(uint16_t port) { uint_t value; __asm__ __volatile__ ( @@ -249,7 +268,7 @@ uint_t v3_indw(ushort_t port) { /* FIX ME */ -static int default_write(ushort_t port, void *src, uint_t length, void * priv_data) { +static int default_write(uint16_t port, void *src, uint_t length, void * priv_data) { /* if (length == 1) { @@ -275,10 +294,10 @@ static int default_write(ushort_t port, void *src, uint_t length, void * priv_da return 0; } -static int default_read(ushort_t port, void * dst, uint_t length, void * priv_data) { +static int default_read(uint16_t port, void * dst, uint_t length, void * priv_data) { /* - uchar_t value; + uint8_t value; __asm__ __volatile__ ( "inb %w1, %b0"