From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LUi53-0002sD-HH for qemu-devel@nongnu.org; Wed, 04 Feb 2009 08:46:17 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LUi52-0002qy-Il for qemu-devel@nongnu.org; Wed, 04 Feb 2009 08:46:16 -0500 Received: from [199.232.76.173] (port=37319 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LUi52-0002qt-9K for qemu-devel@nongnu.org; Wed, 04 Feb 2009 08:46:16 -0500 Received: from mx2.redhat.com ([66.187.237.31]:34141) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LUi51-0000g1-Lk for qemu-devel@nongnu.org; Wed, 04 Feb 2009 08:46:16 -0500 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n14DkFjl010733 for ; Wed, 4 Feb 2009 08:46:15 -0500 Message-Id: <20090204133924.109715693@localhost.localdomain> References: <20090204133303.113145633@localhost.localdomain> Date: Wed, 04 Feb 2009 11:33:13 -0200 From: Marcelo Tosatti Content-Disposition: inline; filename=cpu-unregister-io-mem Subject: [Qemu-devel] [patch 10/18] qemu: add cpu_unregister_io_memory and make io mem table index dynamic Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Marcelo Tosatti So drivers can clear their mem io table entries on exit back to unassigned state. Also make the io mem index allocation dynamic. Signed-off-by: Marcelo Tosatti Index: trunk/cpu-all.h =================================================================== --- trunk.orig/cpu-all.h +++ trunk/cpu-all.h @@ -909,6 +909,7 @@ int cpu_register_io_memory(int io_index, CPUReadMemoryFunc **mem_read, CPUWriteMemoryFunc **mem_write, void *opaque); +void cpu_unregister_io_memory(int table_address); CPUWriteMemoryFunc **cpu_get_io_memory_write(int io_index); CPUReadMemoryFunc **cpu_get_io_memory_read(int io_index); Index: trunk/exec.c =================================================================== --- trunk.orig/exec.c +++ trunk/exec.c @@ -179,7 +179,7 @@ static void io_mem_init(void); CPUWriteMemoryFunc *io_mem_write[IO_MEM_NB_ENTRIES][4]; CPUReadMemoryFunc *io_mem_read[IO_MEM_NB_ENTRIES][4]; void *io_mem_opaque[IO_MEM_NB_ENTRIES]; -static int io_mem_nb; +char io_mem_used[IO_MEM_NB_ENTRIES]; static int io_mem_watch; #endif @@ -2810,12 +2810,28 @@ static void *subpage_init (target_phys_a return mmio; } +static int get_free_io_mem_idx(void) +{ + int i; + + for (i = 0; i> IO_MEM_SHIFT, error_mem_read, unassigned_mem_write, NULL); cpu_register_io_memory(IO_MEM_UNASSIGNED >> IO_MEM_SHIFT, unassigned_mem_read, unassigned_mem_write, NULL); cpu_register_io_memory(IO_MEM_NOTDIRTY >> IO_MEM_SHIFT, error_mem_read, notdirty_mem_write, NULL); - io_mem_nb = 5; + for (i=0; i<5; i++) + io_mem_used[i] = 1; io_mem_watch = cpu_register_io_memory(0, watch_mem_read, watch_mem_write, NULL); @@ -2840,9 +2856,9 @@ int cpu_register_io_memory(int io_index, int i, subwidth = 0; if (io_index <= 0) { - if (io_mem_nb >= IO_MEM_NB_ENTRIES) - return -1; - io_index = io_mem_nb++; + io_index = get_free_io_mem_idx(); + if (io_index == -1) + return io_index; } else { if (io_index >= IO_MEM_NB_ENTRIES) return -1; @@ -2858,6 +2874,19 @@ int cpu_register_io_memory(int io_index, return (io_index << IO_MEM_SHIFT) | subwidth; } +void cpu_unregister_io_memory(int io_table_address) +{ + int i; + int io_index = io_table_address >> IO_MEM_SHIFT; + + for (i=0;i < 3; i++) { + io_mem_read[io_index][i] = unassigned_mem_read[i]; + io_mem_write[io_index][i] = unassigned_mem_write[i]; + } + io_mem_opaque[io_index] = NULL; + io_mem_used[io_index] = 0; +} + CPUWriteMemoryFunc **cpu_get_io_memory_write(int io_index) { return io_mem_write[io_index >> IO_MEM_SHIFT]; --