From patchwork Sat Aug 20 14:56:32 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Herv=C3=A9_Poussineau?= X-Patchwork-Id: 110775 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id A0AB8B6F6F for ; Sun, 21 Aug 2011 00:56:56 +1000 (EST) Received: from localhost ([::1]:45733 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qumyj-0006oq-Th for incoming@patchwork.ozlabs.org; Sat, 20 Aug 2011 10:56:53 -0400 Received: from eggs.gnu.org ([140.186.70.92]:49127) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qumya-0006gW-4j for qemu-devel@nongnu.org; Sat, 20 Aug 2011 10:56:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QumyX-0007XS-Te for qemu-devel@nongnu.org; Sat, 20 Aug 2011 10:56:44 -0400 Received: from smtp5-g21.free.fr ([212.27.42.5]:49312) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QumyX-0007X6-6x for qemu-devel@nongnu.org; Sat, 20 Aug 2011 10:56:41 -0400 Received: from localhost.localdomain (unknown [88.171.126.33]) by smtp5-g21.free.fr (Postfix) with ESMTP id 33393D4801A; Sat, 20 Aug 2011 16:56:34 +0200 (CEST) From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= To: qemu-devel@nongnu.org Date: Sat, 20 Aug 2011 16:56:32 +0200 Message-Id: <1313852195-23081-4-git-send-email-hpoussin@reactos.org> X-Mailer: git-send-email 1.7.5.4 In-Reply-To: <1313852195-23081-1-git-send-email-hpoussin@reactos.org> References: <1313852195-23081-1-git-send-email-hpoussin@reactos.org> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-Received-From: 212.27.42.5 Cc: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Subject: [Qemu-devel] [RFC 3/6] isa: add isa_address_space() method X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Signed-off-by: Hervé Poussineau --- hw/isa-bus.c | 24 ++++++++++++++++++++++++ hw/isa.h | 2 ++ 2 files changed, 26 insertions(+), 0 deletions(-) diff --git a/hw/isa-bus.c b/hw/isa-bus.c index 4757ff9..2bc384a 100644 --- a/hw/isa-bus.c +++ b/hw/isa-bus.c @@ -20,10 +20,12 @@ #include "monitor.h" #include "sysbus.h" #include "isa.h" +#include "exec-memory.h" static ISABus *isabus; target_phys_addr_t isa_mem_base = 0; static qemu_irq *isa_bus_default_irqs; +static MemoryRegion *isa_bus_default_mem; static void isabus_dev_print(Monitor *mon, DeviceState *dev, int indent); static char *isabus_get_fw_dev_path(DeviceState *dev); @@ -48,9 +50,23 @@ static qemu_irq isa_bus_default_get_irq(ISABus *bus, int isairq) return isa_bus_default_irqs[isairq]; } +static MemoryRegion *isa_bus_default_get_address_space(ISABus *bus) +{ + if (!isa_bus_default_mem) { + /* First call to this method, initialize memory region */ + isa_bus_default_mem = (MemoryRegion *)qemu_malloc(sizeof(MemoryRegion)); + memory_region_init(isa_bus_default_mem, "isa-memory", 0x00100000); + memory_region_add_subregion(get_system_memory(), + isa_mem_base, + isa_bus_default_mem); + } + return isa_bus_default_mem; +} + static ISABusOps isa_bus_default_ops = { .set_irqs = isa_bus_default_set_irqs, .get_irq = isa_bus_default_get_irq, + .get_address_space = isa_bus_default_get_address_space, }; ISABus *isa_bus_bridge_init(DeviceState *dev) @@ -102,6 +118,14 @@ qemu_irq isa_get_irq(int isairq) return isabus->ops->get_irq(isabus, isairq); } +MemoryRegion *isa_address_space(void) +{ + if (!isabus || !isabus->ops->get_address_space) { + hw_error("Tried to get isa address space with no isa bus present."); + } + return isabus->ops->get_address_space(isabus); +} + void isa_init_irq(ISADevice *dev, qemu_irq *p, int isairq) { assert(dev->nirqs < ARRAY_SIZE(dev->isairq)); diff --git a/hw/isa.h b/hw/isa.h index 8c1583f..19c4720 100644 --- a/hw/isa.h +++ b/hw/isa.h @@ -36,6 +36,7 @@ struct ISABus { struct ISABusOps { void (*set_irqs)(ISABus *bus, qemu_irq *irqs); qemu_irq (*get_irq)(ISABus *bus, int isairq); + MemoryRegion *(*get_address_space)(ISABus *bus); }; ISABus *isa_bus_bridge_init(DeviceState *dev); @@ -43,6 +44,7 @@ ISABus *isa_bus_bridge_init(DeviceState *dev); void isa_bus_new(ISABus *bus, ISABusOps *ops, DeviceState *host); void isa_bus_irqs(qemu_irq *irqs); qemu_irq isa_get_irq(int isairq); +MemoryRegion *isa_address_space(void); void isa_init_irq(ISADevice *dev, qemu_irq *p, int isairq); void isa_init_ioport(ISADevice *dev, uint16_t ioport); void isa_init_ioport_range(ISADevice *dev, uint16_t start, uint16_t length);