From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KLc38-0001yJ-DY for qemu-devel@nongnu.org; Wed, 23 Jul 2008 06:58:26 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KLc37-0001y6-5k for qemu-devel@nongnu.org; Wed, 23 Jul 2008 06:58:25 -0400 Received: from [199.232.76.173] (port=36338 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KLc36-0001y3-Va for qemu-devel@nongnu.org; Wed, 23 Jul 2008 06:58:25 -0400 Received: from smtp.eu.citrix.com ([62.200.22.115]:44438) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1KLc36-0004N6-BM for qemu-devel@nongnu.org; Wed, 23 Jul 2008 06:58:24 -0400 Date: Wed, 23 Jul 2008 11:58:21 +0100 From: Samuel Thibault Subject: Re: [Qemu-devel] [PATCH] Save 3MB ioport table memory Message-ID: <20080723105821.GB4454@implementation.uk.xensource.com> References: <20080721120211.GD4501@implementation.uk.xensource.com> <48868EDB.7010809@codemonkey.ws> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <48868EDB.7010809@codemonkey.ws> Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Anthony Liguori Cc: qemu-devel@nongnu.org Anthony Liguori, le Tue 22 Jul 2008 20:52:27 -0500, a écrit : > You have some whitespace damage (tabs instead of 8 spaces) I need to configure vim to autodetect the tab style according to the already existing content :) > Perhaps you can introduce an accessor? > > That would simplify the rest of the changes significantly. It does indeed. 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 4917) +++ 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 default_ioport_readi(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 default_ioport_writei(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 = default_ioport_readi(0, address); address = (address + 1) & (MAX_IOPORTS - 1); - data |= ioport_read_table[0][address](ioport_opaque[address], address) << 8; + data |= default_ioport_readi(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); + default_ioport_writei(0, address, data & 0xff); address = (address + 1) & (MAX_IOPORTS - 1); - ioport_write_table[0][address](ioport_opaque[address], address, (data >> 8) & 0xff); + default_ioport_writei(0, address, (data >> 8) & 0xff); } static uint32_t default_ioport_readl(void *opaque, uint32_t address) @@ -309,16 +338,6 @@ 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 */ @@ -394,7 +413,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); + default_ioport_writei(0, addr, val); #ifdef USE_KQEMU if (env) env->last_io_time = cpu_get_time_fast(); @@ -407,7 +426,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); + default_ioport_writei(1, addr, val); #ifdef USE_KQEMU if (env) env->last_io_time = cpu_get_time_fast(); @@ -420,7 +439,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); + default_ioport_writei(2, addr, val); #ifdef USE_KQEMU if (env) env->last_io_time = cpu_get_time_fast(); @@ -430,7 +449,7 @@ int cpu_inb(CPUState *env, int addr) { int val; - val = ioport_read_table[0][addr](ioport_opaque[addr], addr); + val = default_ioport_readi(0, addr); #ifdef DEBUG_IOPORT if (loglevel & CPU_LOG_IOPORT) fprintf(logfile, "inb : %04x %02x\n", addr, val); @@ -445,7 +464,7 @@ int cpu_inw(CPUState *env, int addr) { int val; - val = ioport_read_table[1][addr](ioport_opaque[addr], addr); + val = default_ioport_readi(1, addr); #ifdef DEBUG_IOPORT if (loglevel & CPU_LOG_IOPORT) fprintf(logfile, "inw : %04x %04x\n", addr, val); @@ -460,7 +479,7 @@ int cpu_inl(CPUState *env, int addr) { int val; - val = ioport_read_table[2][addr](ioport_opaque[addr], addr); + val = default_ioport_readi(2, addr); #ifdef DEBUG_IOPORT if (loglevel & CPU_LOG_IOPORT) fprintf(logfile, "inl : %04x %08x\n", addr, val);