Samuel Thibault, le Mon 19 Nov 2007 15:20:16 +0000, a écrit :
> Qemu currently uses 6 65k tables of pointers for handling ioports, which
> makes 3MB on 64bit machines. There's a comment that says "XXX: use a two
> level table to limit memory usage". But wouldn't it be more simple and
> effective to just allocate them through mmap() and when a NULL pointer
> is read, call the default handlers?

For the ioport_opaque array (500KB on 64bit), it's much simpler, as the
attached patch suggests.

Samuel
diff -r 6a6eace79e93 tools/ioemu/vl.c
--- qemu/vl.c   Mon Nov 19 15:04:05 2007 +0000
+++ qemu/vl.c   Mon Nov 19 15:31:35 2007 +0000
@@ -139,7 +139,7 @@
 
 const char *bios_dir = CONFIG_QEMU_SHAREDIR;
 char phys_ram_file[1024];
-void *ioport_opaque[MAX_IOPORTS];
+void **ioport_opaque;
 IOPortReadFunc *ioport_read_table[3][MAX_IOPORTS];
 IOPortWriteFunc *ioport_write_table[3][MAX_IOPORTS];
 /* Note: bs_table[MAX_DISKS] is a dummy block driver if none available
@@ -265,6 +265,7 @@ void init_ioports(void)
 {
     int i;
 
+    ioport_opaque = malloc(MAX_IOPORTS * sizeof(*ioport_opaque));
     for(i = 0; i < MAX_IOPORTS; i++) {
         ioport_read_table[0][i] = default_ioport_readb;
         ioport_write_table[0][i] = default_ioport_writeb;

Reply via email to