qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
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) {
>   

  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).