From: Anthony Liguori <anthony@codemonkey.ws>
To: Samuel Thibault <samuel.thibault@eu.citrix.com>
Cc: Paul Brook <paul@codesourcery.com>, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] Save 3MB ioport table memory
Date: Wed, 23 Jul 2008 10:21:15 -0500 [thread overview]
Message-ID: <48874C6B.5080807@codemonkey.ws> (raw)
In-Reply-To: <20080723123904.GI4454@implementation.uk.xensource.com>
Samuel Thibault wrote:
> 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 <samuel.thibault@eu.citrix.com>
>
Applied. Thanks.
In the future, please make your patches apply with -p1 and resubmit
patches as a top-level post with an indication of the patch version
(v3). It's easy to miss a patch that's deep within a thread.
Regards,
Anthony Liguori
> 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) {
>
next prev parent reply other threads:[~2008-07-23 15:21 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-07-21 12:02 [Qemu-devel] [PATCH] Save 3MB ioport table memory Samuel Thibault
2008-07-23 1:52 ` Anthony Liguori
2008-07-23 10:58 ` Samuel Thibault
2008-07-23 12:15 ` Paul Brook
2008-07-23 12:39 ` Samuel Thibault
2008-07-23 15:21 ` Anthony Liguori [this message]
2008-07-23 15:50 ` Paul Brook
2008-07-23 16:11 ` Anthony Liguori
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=48874C6B.5080807@codemonkey.ws \
--to=anthony@codemonkey.ws \
--cc=paul@codesourcery.com \
--cc=qemu-devel@nongnu.org \
--cc=samuel.thibault@eu.citrix.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).