X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=ioport.c;h=a0ac2a0a4145adbaf5d7a04b690a9ab31408614d;hb=8e8aba5054c043027445c880fcb9dbc8f6a217f3;hp=8a474d34928a2e1a6109afd422364f0a983ca0d2;hpb=14655e482bc9ef44b841bdca55d79ab0891058e9;p=qemu.git diff --git a/ioport.c b/ioport.c index 8a474d349..a0ac2a0a4 100644 --- a/ioport.c +++ b/ioport.c @@ -25,9 +25,9 @@ * splitted out ioport related stuffs from vl.c. */ -#include "ioport.h" +#include "exec/ioport.h" #include "trace.h" -#include "memory.h" +#include "exec/memory.h" /***********************************************************/ /* IO Port */ @@ -52,6 +52,7 @@ static void *ioport_opaque[MAX_IOPORTS]; static IOPortReadFunc *ioport_read_table[3][MAX_IOPORTS]; static IOPortWriteFunc *ioport_write_table[3][MAX_IOPORTS]; +static IOPortDestructor *ioport_destructor_table[MAX_IOPORTS]; static IOPortReadFunc default_ioport_readb, default_ioport_readw, default_ioport_readl; static IOPortWriteFunc default_ioport_writeb, default_ioport_writew, default_ioport_writel; @@ -225,6 +226,15 @@ static void ioport_writel_thunk(void *opaque, uint32_t addr, uint32_t data) ioport->ops->write(ioport, addr - ioport->base, 4, data); } +static void iorange_destructor_thunk(void *opaque) +{ + IORange *iorange = opaque; + + if (iorange->ops->destructor) { + iorange->ops->destructor(iorange); + } +} + void ioport_register(IORange *ioport) { register_ioport_read(ioport->base, ioport->len, 1, @@ -239,12 +249,17 @@ void ioport_register(IORange *ioport) ioport_writew_thunk, ioport); register_ioport_write(ioport->base, ioport->len, 4, ioport_writel_thunk, ioport); + ioport_destructor_table[ioport->base] = iorange_destructor_thunk; } void isa_unassign_ioport(pio_addr_t start, int length) { int i; + if (ioport_destructor_table[start]) { + ioport_destructor_table[start](ioport_opaque[start]); + ioport_destructor_table[start] = NULL; + } for(i = start; i < start + length; i++) { ioport_read_table[0][i] = NULL; ioport_read_table[1][i] = NULL; @@ -370,7 +385,7 @@ static void portio_list_add_1(PortioList *piolist, * rather than an offset relative to to start + off_low. */ memory_region_init_io(region, ops, piolist->opaque, piolist->name, - UINT64_MAX); + INT64_MAX); memory_region_init_alias(alias, piolist->name, region, start + off_low, off_high - off_low); memory_region_add_subregion(piolist->address_space,