From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KLdcY-0005VT-RZ for qemu-devel@nongnu.org; Wed, 23 Jul 2008 08:39:06 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KLdcY-0005UM-1x for qemu-devel@nongnu.org; Wed, 23 Jul 2008 08:39:06 -0400 Received: from [199.232.76.173] (port=54675 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KLdcX-0005U9-Tf for qemu-devel@nongnu.org; Wed, 23 Jul 2008 08:39:05 -0400 Received: from smtp.eu.citrix.com ([62.200.22.115]:21505) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1KLdcX-0006sl-9a for qemu-devel@nongnu.org; Wed, 23 Jul 2008 08:39:05 -0400 Date: Wed, 23 Jul 2008 13:39:04 +0100 From: Samuel Thibault Subject: Re: [Qemu-devel] [PATCH] Save 3MB ioport table memory Message-ID: <20080723123904.GI4454@implementation.uk.xensource.com> References: <20080721120211.GD4501@implementation.uk.xensource.com> <48868EDB.7010809@codemonkey.ws> <20080723105821.GB4454@implementation.uk.xensource.com> <200807231315.43892.paul@codesourcery.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <200807231315.43892.paul@codesourcery.com> Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paul Brook Cc: qemu-devel@nongnu.org Paul Brook, le Wed 23 Jul 2008 13:15:42 +0100, a écrit : > Why are you leaving empty functions? In case somebody wants to fill it again? :) > > +static uint32_t default_ioport_readi(int index, uint32_t address) > > While the abstraction is good, I don't like the name of this function. > I'd expect this to be a direct wrapper round default_ioport_read[bwl], not > something that calls the actual IO port handler. Ah, right, here is an updated patch. Samuel Save 1.5MB (32bit) or 3MB (64bit) memory by keeping ioport tables sparse and use a test against NULL instead. Signed-off-by: Samuel Thibault Index: vl.c =================================================================== --- vl.c (révision 4924) +++ vl.c (copie de travail) @@ -260,6 +260,35 @@ target_phys_addr_t isa_mem_base = 0; PicState2 *isa_pic; +static IOPortReadFunc default_ioport_readb, default_ioport_readw, default_ioport_readl; +static IOPortWriteFunc default_ioport_writeb, default_ioport_writew, default_ioport_writel; + +static uint32_t ioport_read(int index, uint32_t address) +{ + static IOPortReadFunc *default_func[3] = { + default_ioport_readb, + default_ioport_readw, + default_ioport_readl + }; + IOPortReadFunc *func = ioport_read_table[index][address]; + if (!func) + func = default_func[index]; + return func(ioport_opaque[address], address); +} + +static void ioport_write(int index, uint32_t address, uint32_t data) +{ + static IOPortWriteFunc *default_func[3] = { + default_ioport_writeb, + default_ioport_writew, + default_ioport_writel + }; + IOPortWriteFunc *func = ioport_write_table[index][address]; + if (!func) + func = default_func[index]; + func(ioport_opaque[address], address, data); +} + static uint32_t default_ioport_readb(void *opaque, uint32_t address) { #ifdef DEBUG_UNUSED_IOPORT @@ -279,17 +308,17 @@ static uint32_t default_ioport_readw(void *opaque, uint32_t address) { uint32_t data; - data = ioport_read_table[0][address](ioport_opaque[address], address); + data = ioport_read(0, address); address = (address + 1) & (MAX_IOPORTS - 1); - data |= ioport_read_table[0][address](ioport_opaque[address], address) << 8; + data |= ioport_read(0, address) << 8; return data; } static void default_ioport_writew(void *opaque, uint32_t address, uint32_t data) { - ioport_write_table[0][address](ioport_opaque[address], address, data & 0xff); + ioport_write(0, address, data & 0xff); address = (address + 1) & (MAX_IOPORTS - 1); - ioport_write_table[0][address](ioport_opaque[address], address, (data >> 8) & 0xff); + ioport_write(0, address, (data >> 8) & 0xff); } static uint32_t default_ioport_readl(void *opaque, uint32_t address) @@ -307,20 +336,6 @@ #endif } -static void init_ioports(void) -{ - int i; - - for(i = 0; i < MAX_IOPORTS; i++) { - ioport_read_table[0][i] = default_ioport_readb; - ioport_write_table[0][i] = default_ioport_writeb; - ioport_read_table[1][i] = default_ioport_readw; - ioport_write_table[1][i] = default_ioport_writew; - ioport_read_table[2][i] = default_ioport_readl; - ioport_write_table[2][i] = default_ioport_writel; - } -} - /* size is the word size in byte */ int register_ioport_read(int start, int length, int size, IOPortReadFunc *func, void *opaque) @@ -394,7 +409,7 @@ if (loglevel & CPU_LOG_IOPORT) fprintf(logfile, "outb: %04x %02x\n", addr, val); #endif - ioport_write_table[0][addr](ioport_opaque[addr], addr, val); + ioport_write(0, addr, val); #ifdef USE_KQEMU if (env) env->last_io_time = cpu_get_time_fast(); @@ -407,7 +422,7 @@ if (loglevel & CPU_LOG_IOPORT) fprintf(logfile, "outw: %04x %04x\n", addr, val); #endif - ioport_write_table[1][addr](ioport_opaque[addr], addr, val); + ioport_write(1, addr, val); #ifdef USE_KQEMU if (env) env->last_io_time = cpu_get_time_fast(); @@ -420,7 +435,7 @@ if (loglevel & CPU_LOG_IOPORT) fprintf(logfile, "outl: %04x %08x\n", addr, val); #endif - ioport_write_table[2][addr](ioport_opaque[addr], addr, val); + ioport_write(2, addr, val); #ifdef USE_KQEMU if (env) env->last_io_time = cpu_get_time_fast(); @@ -430,7 +445,7 @@ int cpu_inb(CPUState *env, int addr) { int val; - val = ioport_read_table[0][addr](ioport_opaque[addr], addr); + val = ioport_read(0, addr); #ifdef DEBUG_IOPORT if (loglevel & CPU_LOG_IOPORT) fprintf(logfile, "inb : %04x %02x\n", addr, val); @@ -445,7 +460,7 @@ int cpu_inw(CPUState *env, int addr) { int val; - val = ioport_read_table[1][addr](ioport_opaque[addr], addr); + val = ioport_read(1, addr); #ifdef DEBUG_IOPORT if (loglevel & CPU_LOG_IOPORT) fprintf(logfile, "inw : %04x %04x\n", addr, val); @@ -460,7 +475,7 @@ int cpu_inl(CPUState *env, int addr) { int val; - val = ioport_read_table[2][addr](ioport_opaque[addr], addr); + val = ioport_read(2, addr); #ifdef DEBUG_IOPORT if (loglevel & CPU_LOG_IOPORT) fprintf(logfile, "inl : %04x %08x\n", addr, val); @@ -8832,8 +8847,6 @@ register_savevm("timer", 0, 2, timer_save, timer_load, NULL); register_savevm("ram", 0, 2, ram_save, ram_load, NULL); - init_ioports(); - /* terminal init */ memset(&display_state, 0, sizeof(display_state)); if (nographic) {