/* * Remote PCI host device * * Unlike PCI host devices that model physical hardware, the purpose * of this PCI host is to host multi-process QEMU devices. * * Multi-process QEMU extends the PCI host of a QEMU machine into a * remote process. Any PCI device attached to the remote process is * visible in the QEMU guest. This allows existing QEMU device models * to be reused in the remote process. * * This PCI host is purely a container for PCI devices. It's fake in the * sense that the guest never sees this PCI host and has no way of * accessing it. Its job is just to provide the environment that QEMU * PCI device models need when running in a remote process. * * Copyright © 2018, 2021 Oracle and/or its affiliates. * * 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 "qemu/osdep.h" #include "hw/pci/pci.h" #include "hw/pci/pci_host.h" #include "hw/pci/pcie_host.h" #include "hw/qdev-properties.h" #include "hw/pci-host/remote.h" #include "exec/memory.h" static const char *remote_pcihost_root_bus_path(PCIHostState *host_bridge, PCIBus *rootbus) { return "0000:00"; } static void remote_pcihost_realize(DeviceState *dev, Error **errp) { PCIHostState *pci = PCI_HOST_BRIDGE(dev); RemotePCIHost *s = REMOTE_PCIHOST(dev); pci->bus = pci_root_bus_new(DEVICE(s), "remote-pci", s->mr_pci_mem, s->mr_sys_io, 0, TYPE_PCIE_BUS); } static void remote_pcihost_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); PCIHostBridgeClass *hc = PCI_HOST_BRIDGE_CLASS(klass); hc->root_bus_path = remote_pcihost_root_bus_path; dc->realize = remote_pcihost_realize; dc->user_creatable = false; set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories); dc->fw_name = "pci"; } static const TypeInfo remote_pcihost_info = { .name = TYPE_REMOTE_PCIHOST, .parent = TYPE_PCIE_HOST_BRIDGE, .instance_size = sizeof(RemotePCIHost), .class_init = remote_pcihost_class_init, }; static void remote_pcihost_register(void) { type_register_static(&remote_pcihost_info); } type_init(remote_pcihost_register)