[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] Save 3MB ioport table memory
From: |
Samuel Thibault |
Subject: |
Re: [Qemu-devel] [PATCH] Save 3MB ioport table memory |
Date: |
Wed, 23 Jul 2008 11:58:21 +0100 |
User-agent: |
Mutt/1.5.12-2006-07-14 |
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 <address@hidden>
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);
- [Qemu-devel] [PATCH] Save 3MB ioport table memory, Samuel Thibault, 2008/07/21
- Re: [Qemu-devel] [PATCH] Save 3MB ioport table memory, Anthony Liguori, 2008/07/22
- Re: [Qemu-devel] [PATCH] Save 3MB ioport table memory,
Samuel Thibault <=
- Re: [Qemu-devel] [PATCH] Save 3MB ioport table memory, Paul Brook, 2008/07/23
- Re: [Qemu-devel] [PATCH] Save 3MB ioport table memory, Samuel Thibault, 2008/07/23
- Re: [Qemu-devel] [PATCH] Save 3MB ioport table memory, Anthony Liguori, 2008/07/23
- Re: [Qemu-devel] [PATCH] Save 3MB ioport table memory, Paul Brook, 2008/07/23
- Re: [Qemu-devel] [PATCH] Save 3MB ioport table memory, Anthony Liguori, 2008/07/23