From patchwork Thu Sep 29 13:47:49 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Llu=C3=ADs_Vilanova?= X-Patchwork-Id: 116957 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 B7ABBB6F84 for ; Fri, 30 Sep 2011 00:05:48 +1000 (EST) Received: from localhost ([::1]:34501 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R9GyC-0004hH-FN for incoming@patchwork.ozlabs.org; Thu, 29 Sep 2011 09:48:12 -0400 Received: from eggs.gnu.org ([140.186.70.92]:58702) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R9Gxu-0003tk-O2 for qemu-devel@nongnu.org; Thu, 29 Sep 2011 09:47:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1R9Gxq-0004HA-5o for qemu-devel@nongnu.org; Thu, 29 Sep 2011 09:47:54 -0400 Received: from gw.ac.upc.edu ([147.83.30.3]:51006) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R9Gxp-0004Fw-RR for qemu-devel@nongnu.org; Thu, 29 Sep 2011 09:47:50 -0400 Received: from localhost (unknown [84.88.53.92]) by gw.ac.upc.edu (Postfix) with ESMTP id BD7C76B01DA; Thu, 29 Sep 2011 15:47:48 +0200 (CEST) To: qemu-devel@nongnu.org From: =?utf-8?b?TGx1w61z?= Vilanova Date: Thu, 29 Sep 2011 15:47:49 +0200 Message-ID: <20110929134749.19559.26774.stgit@ginnungagap.bsc.es> In-Reply-To: <20110929134727.19559.54734.stgit@ginnungagap.bsc.es> References: <20110929134727.19559.54734.stgit@ginnungagap.bsc.es> User-Agent: StGit/0.15 MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-Received-From: 147.83.30.3 Cc: Zhi Yong Wu Subject: [Qemu-devel] [PATCH 4/5] backdoor: [softmmu] Add QEMU-side proxy to "libbackdoor.a" 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 Uses a virtual device to proxy uses of the backdoor communication channel to the user-provided code. Signed-off-by: Lluís Vilanova --- Makefile.objs | 1 backdoor/qemu/softmmu.c | 124 +++++++++++++++++++++++++++++++++++++++++++++++ hw/pci.h | 1 3 files changed, 126 insertions(+), 0 deletions(-) create mode 100644 backdoor/qemu/softmmu.c diff --git a/Makefile.objs b/Makefile.objs index d39074d..5f54d10 100644 --- a/Makefile.objs +++ b/Makefile.objs @@ -398,6 +398,7 @@ $(trace-obj-y): $(GENERATED_HEADERS) # backdoor backdoor-nested-$(CONFIG_USER_ONLY) += user.o +backdoor-nested-$(CONFIG_SOFTMMU) += softmmu.o backdoor-obj-y += $(addprefix backdoor/qemu/, $(backdoor-nested-y)) diff --git a/backdoor/qemu/softmmu.c b/backdoor/qemu/softmmu.c new file mode 100644 index 0000000..fdd3a25 --- /dev/null +++ b/backdoor/qemu/softmmu.c @@ -0,0 +1,124 @@ +/* + * QEMU-side management of backdoor channels in softmmu emulation. + * + * Copyright (C) 2011 Lluís Vilanova + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ + +#include "hw/pci.h" +#include "backdoor/qemu/qemu-backdoor.h" + + +#define PAGE_SIZE TARGET_PAGE_SIZE +#define CTRL_BYTES sizeof(uint64_t) + + +typedef struct State +{ + PCIDevice dev; + + uint8_t pages; + uint64_t size; + + uint64_t cmd; + + void *data_ptr; + MemoryRegion data; + MemoryRegion control; +} State; + + +static uint64_t control_io_read(void *opaque, target_phys_addr_t addr, unsigned size) +{ + State *s = opaque; + + uint64_t res = ldq_p(&s->size); + uint8_t *resb = (uint8_t*)&res; + return resb[addr % CTRL_BYTES]; +} + +static void control_io_write(void *opaque, target_phys_addr_t addr, uint64_t data, unsigned size) +{ + State *s = opaque; + + uint8_t *cmdb = (uint8_t*)&s->cmd; + cmdb[addr % CTRL_BYTES] = (uint8_t)data; + + if ((addr + size) % CTRL_BYTES == 0) { + qemu_backdoor(ldq_p(&s->cmd), s->data_ptr); + } +} + +static const MemoryRegionOps control_ops = { + .read = control_io_read, + .write = control_io_write, + .endianness = DEVICE_NATIVE_ENDIAN, + .impl = { + .min_access_size = 1, + .max_access_size = 1, + }, +}; + + +static int init(PCIDevice *dev) +{ + State *s = DO_UPCAST(State, dev, dev); + + if (s->pages < 1) { + fprintf(stderr, "error: backdoor: " + "the data channel must have one or more pages\n"); + return -1; + } + s->size = s->pages * PAGE_SIZE; + + pci_set_word(s->dev.config + PCI_COMMAND, + PCI_COMMAND_IO | PCI_COMMAND_MEMORY); + + memory_region_init_io(&s->control, &control_ops, s, "backdoor.control", + PAGE_SIZE); + pci_register_bar(&s->dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->control); + + memory_region_init_ram(&s->data, &s->dev.qdev, "backdoor.data", + s->size); + pci_register_bar(&s->dev, 1, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->data); + s->data_ptr = qemu_get_ram_ptr(s->data.ram_addr); + + qemu_backdoor_init(s->size); + + return 0; +} + +static int fini(PCIDevice *dev) +{ + State *s = DO_UPCAST(State, dev, dev); + + memory_region_destroy(&s->data); + memory_region_destroy(&s->control); + + return 0; +} + + +static PCIDeviceInfo info = { + .qdev.name = "backdoor", + .qdev.desc = "Backdoor communication channel", + .qdev.size = sizeof(State), + .init = init, + .exit = fini, + .vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET, + .device_id = PCI_DEVICE_ID_BACKDOOR, + .class_id = PCI_CLASS_MEMORY_RAM, + .qdev.props = (Property[]) { + DEFINE_PROP_UINT8("pages", State, pages, 1), + DEFINE_PROP_END_OF_LIST(), + } +}; + +static void register_device(void) +{ + pci_qdev_register(&info); +} + +device_init(register_device) diff --git a/hw/pci.h b/hw/pci.h index 86a81c8..4d7d161 100644 --- a/hw/pci.h +++ b/hw/pci.h @@ -75,6 +75,7 @@ #define PCI_DEVICE_ID_VIRTIO_BLOCK 0x1001 #define PCI_DEVICE_ID_VIRTIO_BALLOON 0x1002 #define PCI_DEVICE_ID_VIRTIO_CONSOLE 0x1003 +#define PCI_DEVICE_ID_BACKDOOR 0x1004 #define FMT_PCIBUS PRIx64