[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 4/5] backdoor: [softmmu] Add QEMU-side proxy to
From: |
Blue Swirl |
Subject: |
Re: [Qemu-devel] [PATCH 4/5] backdoor: [softmmu] Add QEMU-side proxy to "libbackdoor.a" |
Date: |
Thu, 29 Sep 2011 20:42:07 +0000 |
2011/9/29 Lluís Vilanova <address@hidden>:
> Uses a virtual device to proxy uses of the backdoor communication channel to
> the
> user-provided code.
>
> Signed-off-by: Lluís Vilanova <address@hidden>
> ---
> 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 <address@hidden>
> + *
> + * 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;
Please use BackdoorState.
> +
> +
> +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];
I don't think these lines do what you mean, but I'm also not sure what
it is supposed to mean.
> +}
> +
> +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);
> + }
Same here.
> +}
> +
> +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
>
>
>
>
[Qemu-devel] [PATCH 3/5] backdoor: [*-user] Add QEMU-side proxy to "libbackdoor.a", Lluís Vilanova, 2011/09/29
[Qemu-devel] [PATCH 5/5] backdoor: Add guest-side library, Lluís Vilanova, 2011/09/29
Re: [Qemu-devel] [RFC][PATCH 0/5] backdoor: lightweight guest-to-QEMU backdoor channel, Anthony Liguori, 2011/09/29