From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LtNdr-0000i2-SS for qemu-devel@nongnu.org; Mon, 13 Apr 2009 11:00:12 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LtNdn-0000fo-07 for qemu-devel@nongnu.org; Mon, 13 Apr 2009 11:00:11 -0400 Received: from [199.232.76.173] (port=40353 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LtNdm-0000fj-SI for qemu-devel@nongnu.org; Mon, 13 Apr 2009 11:00:06 -0400 Received: from hartman.uits.indiana.edu ([129.79.1.194]:43201) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LtNdm-0004nI-9R for qemu-devel@nongnu.org; Mon, 13 Apr 2009 11:00:06 -0400 Received: from mail-relay.iu.edu (burns.uits.indiana.edu [129.79.1.202]) by hartman.uits.indiana.edu (8.14.2/8.13.8/IU Messaging Team) with ESMTP id n3DF04Np001678 for ; Mon, 13 Apr 2009 11:00:04 -0400 Received: from [129.79.35.119] (nibbler.dlib.indiana.edu [129.79.35.119]) (authenticated bits=0) by mail-relay.iu.edu (8.14.2/8.13.8/IU Messaging Team Submission) with ESMTP id n3DF02S8015813 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 13 Apr 2009 11:00:03 -0400 From: Brian Wheeler Content-Type: text/plain Date: Mon, 13 Apr 2009 11:00:01 -0400 Message-Id: <1239634801.27750.35.camel@nibbler.dlib.indiana.edu> Mime-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] [PATCH v4] Two-Level IOPort Lookup Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Style cleanups for the patch. Signed-off-by: Brian Wheeler Index: vl.c =================================================================== --- vl.c (revision 7097) +++ vl.c (working copy) @@ -168,8 +168,8 @@ //#define DEBUG_IOPORT //#define DEBUG_NET //#define DEBUG_SLIRP +//#define DEBUG_IOPORT_FIND - #ifdef DEBUG_IOPORT # define LOG_IOPORT(...) qemu_log_mask(CPU_LOG_IOPORT, ## __VA_ARGS__) #else @@ -184,14 +184,31 @@ /* Max number of bluetooth switches on the commandline. */ #define MAX_BT_CMDLINE 10 -/* XXX: use a two level table to limit memory usage */ -#define MAX_IOPORTS 65536 - const char *bios_dir = CONFIG_QEMU_SHAREDIR; const char *bios_name = NULL; -static void *ioport_opaque[MAX_IOPORTS]; -static IOPortReadFunc *ioport_read_table[3][MAX_IOPORTS]; -static IOPortWriteFunc *ioport_write_table[3][MAX_IOPORTS]; + +struct ioport { + void *opaque; + IOPortReadFunc *read[3]; + IOPortWriteFunc *write[3]; + void *pad; +}; +typedef struct ioport IOPort; + +#ifdef TARGET_ALPHA +#define IOPORT_MAXBITS 24 +#define IOPORT_PAGEBITS 12 +#else +#define IOPORT_MAXBITS 16 +#define IOPORT_PAGEBITS 8 +#endif + +#define IOPORT_ENTRYMASK ((1<> IOPORT_PAGEBITS; + uint32_t entry = address & IOPORT_ENTRYMASK; +#ifdef DEBUG_IOPORT_FIND + static int page_count = 0; + if (address >= (1<opaque); + printf(" read: %p, %p, %p\n", p->read[0], p->read[1], p->read[2]); + printf(" write: %p, %p, %p\n", p->write[0], p->write[1], p->write[2]); + + printf(" --- %d pages allocated, %ld bytes used. --- \n", + page_count, + page_count * (sizeof(IOPort) * (1<read[index]; + void *opaque = p->opaque; + if (!func) { + func = ioport_default_func.read[index]; + } + return func(opaque, 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); + IOPort *p = ioport_find(address, 0); + IOPortWriteFunc *func = p->write[index]; + void *opaque = p->opaque; + if (!func) { + func = ioport_default_func.write[index]; + } + func(opaque, address, data); } static uint32_t default_ioport_readb(void *opaque, uint32_t address) @@ -378,10 +443,11 @@ return -1; } for(i = start; i < start + length; i += size) { - ioport_read_table[bsize][i] = func; - if (ioport_opaque[i] != NULL && ioport_opaque[i] != opaque) + IOPort *p = ioport_find(i, 1); + p->read[bsize] = func; + if (p->opaque != NULL && p->opaque != opaque) hw_error("register_ioport_read: invalid opaque"); - ioport_opaque[i] = opaque; + p->opaque = opaque; } return 0; } @@ -403,10 +469,11 @@ return -1; } for(i = start; i < start + length; i += size) { - ioport_write_table[bsize][i] = func; - if (ioport_opaque[i] != NULL && ioport_opaque[i] != opaque) + IOPort *p = ioport_find(i, 1); + p->write[bsize] = func; + if (p->opaque != NULL && p->opaque != opaque) hw_error("register_ioport_write: invalid opaque"); - ioport_opaque[i] = opaque; + p->opaque = opaque; } return 0; } @@ -416,15 +483,16 @@ int i; for(i = start; i < start + length; i++) { - ioport_read_table[0][i] = default_ioport_readb; - ioport_read_table[1][i] = default_ioport_readw; - ioport_read_table[2][i] = default_ioport_readl; + IOPort *p = ioport_find(i, 1); + p->read[0] = default_ioport_readb; + p->read[1] = default_ioport_readw; + p->read[2] = default_ioport_readl; - ioport_write_table[0][i] = default_ioport_writeb; - ioport_write_table[1][i] = default_ioport_writew; - ioport_write_table[2][i] = default_ioport_writel; + p->write[0] = default_ioport_writeb; + p->write[1] = default_ioport_writew; + p->write[2] = default_ioport_writel; - ioport_opaque[i] = NULL; + p->opaque = NULL; } }