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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.