Xen queue
- fix for xen-block segv - Resolve TYPE_PIIX3_XEN_DEVICE - Xen emulation build/Coverity fixes -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEE+AwAYwjiLP2KkueYDPVXL9f7Va8FAmSAkU0ACgkQDPVXL9f7 Va/mMQf9Hs8pFGz7qRMc8RbuBvwVNGcdqOKZN+sbBKPb2pp9X8gkP5EV5SMLF/eu CjaoZU+SsZcVLZ0HZ/TevAEuMrflZeeRfneJzEcl58cwOxo5l18puRwy9iDxfh6m goqGGxQA2OmUa5eVZ7WX2JXo0wG/RQqqc/pChKbPAsTT9/QE23irOQBdUDf7sbGP WFI/LoLR0c6NNbQyZNWSP0e/+es8ztq+Is7Bl6d1fdG/6YeXK2yVaro1gyMmxKAm EKuvI9qva2ilV5RJEc/gB/x4PuIVCPizkrbB8XClQ81Szo49x55ChPdnpT5i7Sqd qjFWO2plgV/gXri1/RTCzyBujeuCOA== =E1Qb -----END PGP SIGNATURE----- Merge tag 'pull-xen-20230607' of https://xenbits.xen.org/git-http/people/aperard/qemu-dm into staging Xen queue - fix for xen-block segv - Resolve TYPE_PIIX3_XEN_DEVICE - Xen emulation build/Coverity fixes # -----BEGIN PGP SIGNATURE----- # # iQEzBAABCgAdFiEE+AwAYwjiLP2KkueYDPVXL9f7Va8FAmSAkU0ACgkQDPVXL9f7 # Va/mMQf9Hs8pFGz7qRMc8RbuBvwVNGcdqOKZN+sbBKPb2pp9X8gkP5EV5SMLF/eu # CjaoZU+SsZcVLZ0HZ/TevAEuMrflZeeRfneJzEcl58cwOxo5l18puRwy9iDxfh6m # goqGGxQA2OmUa5eVZ7WX2JXo0wG/RQqqc/pChKbPAsTT9/QE23irOQBdUDf7sbGP # WFI/LoLR0c6NNbQyZNWSP0e/+es8ztq+Is7Bl6d1fdG/6YeXK2yVaro1gyMmxKAm # EKuvI9qva2ilV5RJEc/gB/x4PuIVCPizkrbB8XClQ81Szo49x55ChPdnpT5i7Sqd # qjFWO2plgV/gXri1/RTCzyBujeuCOA== # =E1Qb # -----END PGP SIGNATURE----- # gpg: Signature made Wed 07 Jun 2023 07:16:45 AM PDT # gpg: using RSA key F80C006308E22CFD8A92E7980CF5572FD7FB55AF # gpg: Good signature from "Anthony PERARD <anthony.perard@gmail.com>" [unknown] # gpg: aka "Anthony PERARD <anthony.perard@citrix.com>" [unknown] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 5379 2F71 024C 600F 778A 7161 D8D5 7199 DF83 42C8 # Subkey fingerprint: F80C 0063 08E2 2CFD 8A92 E798 0CF5 572F D7FB 55AF * tag 'pull-xen-20230607' of https://xenbits.xen.org/git-http/people/aperard/qemu-dm: xen-block: fix segv on unrealize hw/isa/piix3: Resolve redundant TYPE_PIIX3_XEN_DEVICE hw/isa/piix3: Resolve redundant k->config_write assignments hw/isa/piix3: Avoid Xen-specific variant of piix3_write_config() hw/isa/piix3: Wire up Xen PCI IRQ handling outside of PIIX3 hw/isa/piix3: Reuse piix3_realize() in piix3_xen_realize() hw/pci/pci.c: Don't leak PCIBus::irq_count[] in pci_bus_irqs() include/hw/xen/xen: Rename xen_piix3_set_irq() to xen_intx_set_irq() hw/xen: Fix broken check for invalid state in xs_be_open() xen: Drop support for Xen versions below 4.7.1 hw/xen: Fix memory leak in libxenstore_open() for Xen hw/xen: Simplify emulated Xen platform init Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
commit
4f65e89f8c
@ -147,7 +147,10 @@ struct XenEvtchnState {
|
||||
QemuMutex port_lock;
|
||||
uint32_t nr_ports;
|
||||
XenEvtchnPort port_table[EVTCHN_2L_NR_CHANNELS];
|
||||
qemu_irq gsis[IOAPIC_NUM_PINS];
|
||||
|
||||
/* Connected to the system GSIs for raising callback as GSI / INTx */
|
||||
unsigned int nr_callback_gsis;
|
||||
qemu_irq *callback_gsis;
|
||||
|
||||
struct xenevtchn_handle *be_handles[EVTCHN_2L_NR_CHANNELS];
|
||||
|
||||
@ -299,7 +302,7 @@ static void gsi_assert_bh(void *opaque)
|
||||
}
|
||||
}
|
||||
|
||||
void xen_evtchn_create(void)
|
||||
void xen_evtchn_create(unsigned int nr_gsis, qemu_irq *system_gsis)
|
||||
{
|
||||
XenEvtchnState *s = XEN_EVTCHN(sysbus_create_simple(TYPE_XEN_EVTCHN,
|
||||
-1, NULL));
|
||||
@ -310,8 +313,19 @@ void xen_evtchn_create(void)
|
||||
qemu_mutex_init(&s->port_lock);
|
||||
s->gsi_bh = aio_bh_new(qemu_get_aio_context(), gsi_assert_bh, s);
|
||||
|
||||
for (i = 0; i < IOAPIC_NUM_PINS; i++) {
|
||||
sysbus_init_irq(SYS_BUS_DEVICE(s), &s->gsis[i]);
|
||||
/*
|
||||
* These are the *output* GSI from event channel support, for
|
||||
* signalling CPU0's events via GSI or PCI INTx instead of the
|
||||
* per-CPU vector. We create a *set* of irqs and connect one to
|
||||
* each of the system GSIs which were passed in from the platform
|
||||
* code, and then just trigger the right one as appropriate from
|
||||
* xen_evtchn_set_callback_level().
|
||||
*/
|
||||
s->nr_callback_gsis = nr_gsis;
|
||||
s->callback_gsis = g_new0(qemu_irq, nr_gsis);
|
||||
for (i = 0; i < nr_gsis; i++) {
|
||||
sysbus_init_irq(SYS_BUS_DEVICE(s), &s->callback_gsis[i]);
|
||||
sysbus_connect_irq(SYS_BUS_DEVICE(s), i, system_gsis[i]);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -336,20 +350,6 @@ void xen_evtchn_create(void)
|
||||
xen_evtchn_ops = &emu_evtchn_backend_ops;
|
||||
}
|
||||
|
||||
void xen_evtchn_connect_gsis(qemu_irq *system_gsis)
|
||||
{
|
||||
XenEvtchnState *s = xen_evtchn_singleton;
|
||||
int i;
|
||||
|
||||
if (!s) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < IOAPIC_NUM_PINS; i++) {
|
||||
sysbus_connect_irq(SYS_BUS_DEVICE(s), i, system_gsis[i]);
|
||||
}
|
||||
}
|
||||
|
||||
static void xen_evtchn_register_types(void)
|
||||
{
|
||||
type_register_static(&xen_evtchn_info);
|
||||
@ -430,8 +430,8 @@ void xen_evtchn_set_callback_level(int level)
|
||||
return;
|
||||
}
|
||||
|
||||
if (s->callback_gsi && s->callback_gsi < IOAPIC_NUM_PINS) {
|
||||
qemu_set_irq(s->gsis[s->callback_gsi], level);
|
||||
if (s->callback_gsi && s->callback_gsi < s->nr_callback_gsis) {
|
||||
qemu_set_irq(s->callback_gsis[s->callback_gsi], level);
|
||||
if (level) {
|
||||
/* Ensure the vCPU polls for deassertion */
|
||||
kvm_xen_set_callback_asserted();
|
||||
|
@ -16,10 +16,9 @@
|
||||
|
||||
typedef uint32_t evtchn_port_t;
|
||||
|
||||
void xen_evtchn_create(void);
|
||||
void xen_evtchn_create(unsigned int nr_gsis, qemu_irq *system_gsis);
|
||||
int xen_evtchn_soft_reset(void);
|
||||
int xen_evtchn_set_callback_param(uint64_t param);
|
||||
void xen_evtchn_connect_gsis(qemu_irq *system_gsis);
|
||||
void xen_evtchn_set_callback_level(int level);
|
||||
|
||||
int xen_evtchn_set_port(uint16_t port);
|
||||
|
@ -1688,7 +1688,7 @@ static struct qemu_xs_handle *xs_be_open(void)
|
||||
XenXenstoreState *s = xen_xenstore_singleton;
|
||||
struct qemu_xs_handle *h;
|
||||
|
||||
if (!s && !s->impl) {
|
||||
if (!s || !s->impl) {
|
||||
errno = -ENOSYS;
|
||||
return NULL;
|
||||
}
|
||||
|
13
hw/i386/pc.c
13
hw/i386/pc.c
@ -1332,7 +1332,10 @@ void pc_basic_device_init(struct PCMachineState *pcms,
|
||||
|
||||
#ifdef CONFIG_XEN_EMU
|
||||
if (xen_mode == XEN_EMULATE) {
|
||||
xen_evtchn_connect_gsis(gsi);
|
||||
xen_overlay_create();
|
||||
xen_evtchn_create(IOAPIC_NUM_PINS, gsi);
|
||||
xen_gnttab_create();
|
||||
xen_xenstore_create();
|
||||
if (pcms->bus) {
|
||||
pci_create_simple(pcms->bus, -1, "xen-platform");
|
||||
}
|
||||
@ -1882,14 +1885,6 @@ static void pc_machine_initfn(Object *obj)
|
||||
|
||||
int pc_machine_kvm_type(MachineState *machine, const char *kvm_type)
|
||||
{
|
||||
#ifdef CONFIG_XEN_EMU
|
||||
if (xen_mode == XEN_EMULATE) {
|
||||
xen_overlay_create();
|
||||
xen_evtchn_create();
|
||||
xen_gnttab_create();
|
||||
xen_xenstore_create();
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -71,6 +71,7 @@
|
||||
#include "kvm/kvm-cpu.h"
|
||||
|
||||
#define MAX_IDE_BUS 2
|
||||
#define XEN_IOAPIC_NUM_PIRQS 128ULL
|
||||
|
||||
#ifdef CONFIG_IDE_ISA
|
||||
static const int ide_iobase[MAX_IDE_BUS] = { 0x1f0, 0x170 };
|
||||
@ -89,6 +90,21 @@ static int pc_pci_slot_get_pirq(PCIDevice *pci_dev, int pci_intx)
|
||||
return (pci_intx + slot_addend) & 3;
|
||||
}
|
||||
|
||||
static void piix_intx_routing_notifier_xen(PCIDevice *dev)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* Scan for updates to PCI link routes (0x60-0x63). */
|
||||
for (i = 0; i < PIIX_NUM_PIRQS; i++) {
|
||||
uint8_t v = dev->config_read(dev, PIIX_PIRQCA + i, 1);
|
||||
if (v & 0x80) {
|
||||
v = 0;
|
||||
}
|
||||
v &= 0xf;
|
||||
xen_set_pci_link_route(i, v);
|
||||
}
|
||||
}
|
||||
|
||||
/* PC hardware initialisation */
|
||||
static void pc_init1(MachineState *machine,
|
||||
const char *host_type, const char *pci_type)
|
||||
@ -223,8 +239,6 @@ static void pc_init1(MachineState *machine,
|
||||
if (pcmc->pci_enabled) {
|
||||
PIIX3State *piix3;
|
||||
PCIDevice *pci_dev;
|
||||
const char *type = xen_enabled() ? TYPE_PIIX3_XEN_DEVICE
|
||||
: TYPE_PIIX3_DEVICE;
|
||||
|
||||
pci_bus = i440fx_init(pci_type,
|
||||
i440fx_host,
|
||||
@ -237,7 +251,23 @@ static void pc_init1(MachineState *machine,
|
||||
: pc_pci_slot_get_pirq);
|
||||
pcms->bus = pci_bus;
|
||||
|
||||
pci_dev = pci_create_simple_multifunction(pci_bus, -1, true, type);
|
||||
pci_dev = pci_create_simple_multifunction(pci_bus, -1, true,
|
||||
TYPE_PIIX3_DEVICE);
|
||||
|
||||
if (xen_enabled()) {
|
||||
pci_device_set_intx_routing_notifier(
|
||||
pci_dev, piix_intx_routing_notifier_xen);
|
||||
|
||||
/*
|
||||
* Xen supports additional interrupt routes from the PCI devices to
|
||||
* the IOAPIC: the four pins of each PCI device on the bus are also
|
||||
* connected to the IOAPIC directly.
|
||||
* These additional routes can be discovered through ACPI.
|
||||
*/
|
||||
pci_bus_irqs(pci_bus, xen_intx_set_irq, pci_dev,
|
||||
XEN_IOAPIC_NUM_PIRQS);
|
||||
}
|
||||
|
||||
piix3 = PIIX3_PCI_DEVICE(pci_dev);
|
||||
piix3->pic = x86ms->gsi;
|
||||
piix3_devfn = piix3->dev.devfn;
|
||||
|
@ -143,7 +143,7 @@ int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num)
|
||||
return irq_num + (PCI_SLOT(pci_dev->devfn) << 2);
|
||||
}
|
||||
|
||||
void xen_piix3_set_irq(void *opaque, int irq_num, int level)
|
||||
void xen_intx_set_irq(void *opaque, int irq_num, int level)
|
||||
{
|
||||
xen_set_pci_intx_level(xen_domid, 0, 0, irq_num >> 2,
|
||||
irq_num & 3, level);
|
||||
|
@ -30,13 +30,10 @@
|
||||
#include "hw/irq.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
#include "hw/isa/isa.h"
|
||||
#include "hw/xen/xen.h"
|
||||
#include "sysemu/runstate.h"
|
||||
#include "migration/vmstate.h"
|
||||
#include "hw/acpi/acpi_aml_interface.h"
|
||||
|
||||
#define XEN_PIIX_NUM_PIRQS 128ULL
|
||||
|
||||
static void piix3_set_irq_pic(PIIX3State *piix3, int pic_irq)
|
||||
{
|
||||
qemu_set_irq(piix3->pic[pic_irq],
|
||||
@ -124,26 +121,6 @@ static void piix3_write_config(PCIDevice *dev,
|
||||
}
|
||||
}
|
||||
|
||||
static void piix3_write_config_xen(PCIDevice *dev,
|
||||
uint32_t address, uint32_t val, int len)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* Scan for updates to PCI link routes (0x60-0x63). */
|
||||
for (i = 0; i < len; i++) {
|
||||
uint8_t v = (val >> (8 * i)) & 0xff;
|
||||
if (v & 0x80) {
|
||||
v = 0;
|
||||
}
|
||||
v &= 0xf;
|
||||
if (((address + i) >= PIIX_PIRQCA) && ((address + i) <= PIIX_PIRQCD)) {
|
||||
xen_set_pci_link_route(address + i - PIIX_PIRQCA, v);
|
||||
}
|
||||
}
|
||||
|
||||
piix3_write_config(dev, address, val, len);
|
||||
}
|
||||
|
||||
static void piix3_reset(DeviceState *dev)
|
||||
{
|
||||
PIIX3State *d = PIIX3_PCI_DEVICE(dev);
|
||||
@ -344,6 +321,7 @@ static void pci_piix3_class_init(ObjectClass *klass, void *data)
|
||||
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
|
||||
AcpiDevAmlIfClass *adevc = ACPI_DEV_AML_IF_CLASS(klass);
|
||||
|
||||
k->config_write = piix3_write_config;
|
||||
dc->reset = piix3_reset;
|
||||
dc->desc = "ISA bridge";
|
||||
dc->vmsd = &vmstate_piix3;
|
||||
@ -393,7 +371,6 @@ static void piix3_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
|
||||
|
||||
k->config_write = piix3_write_config;
|
||||
k->realize = piix3_realize;
|
||||
}
|
||||
|
||||
@ -403,45 +380,10 @@ static const TypeInfo piix3_info = {
|
||||
.class_init = piix3_class_init,
|
||||
};
|
||||
|
||||
static void piix3_xen_realize(PCIDevice *dev, Error **errp)
|
||||
{
|
||||
ERRP_GUARD();
|
||||
PIIX3State *piix3 = PIIX3_PCI_DEVICE(dev);
|
||||
PCIBus *pci_bus = pci_get_bus(dev);
|
||||
|
||||
pci_piix3_realize(dev, errp);
|
||||
if (*errp) {
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Xen supports additional interrupt routes from the PCI devices to
|
||||
* the IOAPIC: the four pins of each PCI device on the bus are also
|
||||
* connected to the IOAPIC directly.
|
||||
* These additional routes can be discovered through ACPI.
|
||||
*/
|
||||
pci_bus_irqs(pci_bus, xen_piix3_set_irq, piix3, XEN_PIIX_NUM_PIRQS);
|
||||
}
|
||||
|
||||
static void piix3_xen_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
|
||||
|
||||
k->config_write = piix3_write_config_xen;
|
||||
k->realize = piix3_xen_realize;
|
||||
}
|
||||
|
||||
static const TypeInfo piix3_xen_info = {
|
||||
.name = TYPE_PIIX3_XEN_DEVICE,
|
||||
.parent = TYPE_PIIX3_PCI_DEVICE,
|
||||
.class_init = piix3_xen_class_init,
|
||||
};
|
||||
|
||||
static void piix3_register_types(void)
|
||||
{
|
||||
type_register_static(&piix3_pci_type_info);
|
||||
type_register_static(&piix3_info);
|
||||
type_register_static(&piix3_xen_info);
|
||||
}
|
||||
|
||||
type_init(piix3_register_types)
|
||||
|
@ -560,6 +560,7 @@ void pci_bus_irqs(PCIBus *bus, pci_set_irq_fn set_irq,
|
||||
bus->set_irq = set_irq;
|
||||
bus->irq_opaque = irq_opaque;
|
||||
bus->nirq = nirq;
|
||||
g_free(bus->irq_count);
|
||||
bus->irq_count = g_malloc0(nirq * sizeof(bus->irq_count[0]));
|
||||
}
|
||||
|
||||
@ -575,6 +576,7 @@ void pci_bus_irqs_cleanup(PCIBus *bus)
|
||||
bus->irq_opaque = NULL;
|
||||
bus->nirq = 0;
|
||||
g_free(bus->irq_count);
|
||||
bus->irq_count = NULL;
|
||||
}
|
||||
|
||||
PCIBus *pci_register_root_bus(DeviceState *parent, const char *name,
|
||||
|
@ -923,8 +923,10 @@ void xen_device_unbind_event_channel(XenDevice *xendev,
|
||||
|
||||
QLIST_REMOVE(channel, list);
|
||||
|
||||
aio_set_fd_handler(channel->ctx, qemu_xen_evtchn_fd(channel->xeh),
|
||||
NULL, NULL, NULL, NULL, NULL);
|
||||
if (channel->ctx) {
|
||||
aio_set_fd_handler(channel->ctx, qemu_xen_evtchn_fd(channel->xeh),
|
||||
NULL, NULL, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
if (qemu_xen_evtchn_unbind(channel->xeh, channel->local_port) < 0) {
|
||||
error_setg_errno(errp, errno, "xenevtchn_unbind failed");
|
||||
|
@ -28,46 +28,13 @@
|
||||
#include <xenctrl.h>
|
||||
|
||||
/*
|
||||
* We don't support Xen prior to 4.2.0.
|
||||
* We don't support Xen prior to 4.7.1.
|
||||
*/
|
||||
|
||||
/* Xen 4.2 through 4.6 */
|
||||
#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 40701
|
||||
|
||||
typedef xc_evtchn xenevtchn_handle;
|
||||
typedef evtchn_port_or_error_t xenevtchn_port_or_error_t;
|
||||
|
||||
#define xenevtchn_open(l, f) xc_evtchn_open(l, f);
|
||||
#define xenevtchn_close(h) xc_evtchn_close(h)
|
||||
#define xenevtchn_fd(h) xc_evtchn_fd(h)
|
||||
#define xenevtchn_pending(h) xc_evtchn_pending(h)
|
||||
#define xenevtchn_notify(h, p) xc_evtchn_notify(h, p)
|
||||
#define xenevtchn_bind_interdomain(h, d, p) xc_evtchn_bind_interdomain(h, d, p)
|
||||
#define xenevtchn_unmask(h, p) xc_evtchn_unmask(h, p)
|
||||
#define xenevtchn_unbind(h, p) xc_evtchn_unbind(h, p)
|
||||
|
||||
typedef xc_gnttab xengnttab_handle;
|
||||
|
||||
#define xengnttab_open(l, f) xc_gnttab_open(l, f)
|
||||
#define xengnttab_close(h) xc_gnttab_close(h)
|
||||
#define xengnttab_set_max_grants(h, n) xc_gnttab_set_max_grants(h, n)
|
||||
#define xengnttab_map_grant_ref(h, d, r, p) xc_gnttab_map_grant_ref(h, d, r, p)
|
||||
#define xengnttab_unmap(h, a, n) xc_gnttab_munmap(h, a, n)
|
||||
#define xengnttab_map_grant_refs(h, c, d, r, p) \
|
||||
xc_gnttab_map_grant_refs(h, c, d, r, p)
|
||||
#define xengnttab_map_domain_grant_refs(h, c, d, r, p) \
|
||||
xc_gnttab_map_domain_grant_refs(h, c, d, r, p)
|
||||
|
||||
typedef xc_interface xenforeignmemory_handle;
|
||||
|
||||
#else /* CONFIG_XEN_CTRL_INTERFACE_VERSION >= 40701 */
|
||||
|
||||
#include <xenevtchn.h>
|
||||
#include <xengnttab.h>
|
||||
#include <xenforeignmemory.h>
|
||||
|
||||
#endif
|
||||
|
||||
/* Xen before 4.8 */
|
||||
|
||||
static int libxengnttab_fallback_grant_copy(xengnttab_handle *xgt,
|
||||
@ -223,26 +190,6 @@ static struct gnttab_backend_ops libxengnttab_backend_ops = {
|
||||
.unmap = libxengnttab_backend_unmap,
|
||||
};
|
||||
|
||||
#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 40701
|
||||
|
||||
static void *libxenforeignmem_backend_map(uint32_t dom, void *addr, int prot,
|
||||
size_t pages, xfn_pfn_t *pfns,
|
||||
int *errs)
|
||||
{
|
||||
if (errs) {
|
||||
return xc_map_foreign_bulk(xen_xc, dom, prot, pfns, errs, pages);
|
||||
} else {
|
||||
return xc_map_foreign_pages(xen_xc, dom, prot, pfns, pages);
|
||||
}
|
||||
}
|
||||
|
||||
static int libxenforeignmem_backend_unmap(void *addr, size_t pages)
|
||||
{
|
||||
return munmap(addr, pages * XC_PAGE_SIZE);
|
||||
}
|
||||
|
||||
#else /* CONFIG_XEN_CTRL_INTERFACE_VERSION >= 40701 */
|
||||
|
||||
static void *libxenforeignmem_backend_map(uint32_t dom, void *addr, int prot,
|
||||
size_t pages, xen_pfn_t *pfns,
|
||||
int *errs)
|
||||
@ -256,8 +203,6 @@ static int libxenforeignmem_backend_unmap(void *addr, size_t pages)
|
||||
return xenforeignmemory_unmap(xen_fmem, addr, pages);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
struct foreignmem_backend_ops libxenforeignmem_backend_ops = {
|
||||
.map = libxenforeignmem_backend_map,
|
||||
.unmap = libxenforeignmem_backend_unmap,
|
||||
@ -287,7 +232,7 @@ static void watch_event(void *opaque)
|
||||
static struct qemu_xs_handle *libxenstore_open(void)
|
||||
{
|
||||
struct xs_handle *xsh = xs_open(0);
|
||||
struct qemu_xs_handle *h = g_new0(struct qemu_xs_handle, 1);
|
||||
struct qemu_xs_handle *h;
|
||||
|
||||
if (!xsh) {
|
||||
return NULL;
|
||||
|
@ -67,7 +67,6 @@ DECLARE_INSTANCE_CHECKER(PIIX3State, PIIX3_PCI_DEVICE,
|
||||
TYPE_PIIX3_PCI_DEVICE)
|
||||
|
||||
#define TYPE_PIIX3_DEVICE "PIIX3"
|
||||
#define TYPE_PIIX3_XEN_DEVICE "PIIX3-xen"
|
||||
#define TYPE_PIIX4_PCI_DEVICE "piix4-isa"
|
||||
|
||||
#endif
|
||||
|
@ -39,7 +39,7 @@ extern bool xen_domid_restrict;
|
||||
|
||||
int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num);
|
||||
int xen_set_pci_link_route(uint8_t link, uint8_t irq);
|
||||
void xen_piix3_set_irq(void *opaque, int irq_num, int level);
|
||||
void xen_intx_set_irq(void *opaque, int irq_num, int level);
|
||||
void xen_hvm_inject_msi(uint64_t addr, uint32_t data);
|
||||
int xen_is_pirq_msi(uint32_t msi_data);
|
||||
|
||||
|
@ -24,23 +24,11 @@
|
||||
extern xc_interface *xen_xc;
|
||||
|
||||
/*
|
||||
* We don't support Xen prior to 4.2.0.
|
||||
* We don't support Xen prior to 4.7.1.
|
||||
*/
|
||||
|
||||
/* Xen 4.2 through 4.6 */
|
||||
#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 40701
|
||||
|
||||
typedef xc_interface xenforeignmemory_handle;
|
||||
|
||||
#define xenforeignmemory_open(l, f) xen_xc
|
||||
#define xenforeignmemory_close(h)
|
||||
|
||||
#else /* CONFIG_XEN_CTRL_INTERFACE_VERSION >= 40701 */
|
||||
|
||||
#include <xenforeignmemory.h>
|
||||
|
||||
#endif
|
||||
|
||||
extern xenforeignmemory_handle *xen_fmem;
|
||||
|
||||
#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 40900
|
||||
@ -148,8 +136,6 @@ static inline xendevicemodel_handle *xendevicemodel_open(
|
||||
return xen_xc;
|
||||
}
|
||||
|
||||
#if CONFIG_XEN_CTRL_INTERFACE_VERSION >= 40500
|
||||
|
||||
static inline int xendevicemodel_create_ioreq_server(
|
||||
xendevicemodel_handle *dmod, domid_t domid, int handle_bufioreq,
|
||||
ioservid_t *id)
|
||||
@ -211,8 +197,6 @@ static inline int xendevicemodel_set_ioreq_server_state(
|
||||
return xc_hvm_set_ioreq_server_state(dmod, domid, id, enabled);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_XEN_CTRL_INTERFACE_VERSION >= 40500 */
|
||||
|
||||
static inline int xendevicemodel_set_pci_intx_level(
|
||||
xendevicemodel_handle *dmod, domid_t domid, uint16_t segment,
|
||||
uint8_t bus, uint8_t device, uint8_t intx, unsigned int level)
|
||||
@ -340,15 +324,6 @@ static inline int xen_get_vmport_regs_pfn(xc_interface *xc, domid_t dom,
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Xen before 4.6 */
|
||||
#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 40600
|
||||
|
||||
#ifndef HVM_IOREQSRV_BUFIOREQ_ATOMIC
|
||||
#define HVM_IOREQSRV_BUFIOREQ_ATOMIC 2
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
static inline int xen_get_default_ioreq_server_info(domid_t dom,
|
||||
xen_pfn_t *ioreq_pfn,
|
||||
xen_pfn_t *bufioreq_pfn,
|
||||
@ -386,84 +361,6 @@ static inline int xen_get_default_ioreq_server_info(domid_t dom,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Xen before 4.5 */
|
||||
#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 40500
|
||||
|
||||
#ifndef HVM_PARAM_BUFIOREQ_EVTCHN
|
||||
#define HVM_PARAM_BUFIOREQ_EVTCHN 26
|
||||
#endif
|
||||
|
||||
#define IOREQ_TYPE_PCI_CONFIG 2
|
||||
|
||||
typedef uint16_t ioservid_t;
|
||||
|
||||
static inline void xen_map_memory_section(domid_t dom,
|
||||
ioservid_t ioservid,
|
||||
MemoryRegionSection *section)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void xen_unmap_memory_section(domid_t dom,
|
||||
ioservid_t ioservid,
|
||||
MemoryRegionSection *section)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void xen_map_io_section(domid_t dom,
|
||||
ioservid_t ioservid,
|
||||
MemoryRegionSection *section)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void xen_unmap_io_section(domid_t dom,
|
||||
ioservid_t ioservid,
|
||||
MemoryRegionSection *section)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void xen_map_pcidev(domid_t dom,
|
||||
ioservid_t ioservid,
|
||||
PCIDevice *pci_dev)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void xen_unmap_pcidev(domid_t dom,
|
||||
ioservid_t ioservid,
|
||||
PCIDevice *pci_dev)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void xen_create_ioreq_server(domid_t dom,
|
||||
ioservid_t *ioservid)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void xen_destroy_ioreq_server(domid_t dom,
|
||||
ioservid_t ioservid)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int xen_get_ioreq_server_info(domid_t dom,
|
||||
ioservid_t ioservid,
|
||||
xen_pfn_t *ioreq_pfn,
|
||||
xen_pfn_t *bufioreq_pfn,
|
||||
evtchn_port_t *bufioreq_evtchn)
|
||||
{
|
||||
return xen_get_default_ioreq_server_info(dom, ioreq_pfn,
|
||||
bufioreq_pfn,
|
||||
bufioreq_evtchn);
|
||||
}
|
||||
|
||||
static inline int xen_set_ioreq_server_state(domid_t dom,
|
||||
ioservid_t ioservid,
|
||||
bool enable)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Xen 4.5 */
|
||||
#else
|
||||
|
||||
static bool use_default_ioreq_server;
|
||||
|
||||
static inline void xen_map_memory_section(domid_t dom,
|
||||
@ -624,6 +521,4 @@ static inline int xen_set_ioreq_server_state(domid_t dom,
|
||||
enable);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* QEMU_HW_XEN_NATIVE_H */
|
||||
|
@ -1683,16 +1683,13 @@ if get_option('xen').enabled() or (get_option('xen').auto() and have_system)
|
||||
endif
|
||||
endif
|
||||
if not xen.found()
|
||||
xen_tests = [ '4.11.0', '4.10.0', '4.9.0', '4.8.0', '4.7.1', '4.6.0', '4.5.0', '4.2.0' ]
|
||||
xen_tests = [ '4.11.0', '4.10.0', '4.9.0', '4.8.0', '4.7.1' ]
|
||||
xen_libs = {
|
||||
'4.11.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
|
||||
'4.10.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
|
||||
'4.9.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
|
||||
'4.8.0': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
|
||||
'4.7.1': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
|
||||
'4.6.0': [ 'xenstore', 'xenctrl' ],
|
||||
'4.5.0': [ 'xenstore', 'xenctrl' ],
|
||||
'4.2.0': [ 'xenstore', 'xenctrl' ],
|
||||
}
|
||||
xen_deps = {}
|
||||
foreach ver: xen_tests
|
||||
|
@ -138,66 +138,6 @@
|
||||
return 0;
|
||||
}
|
||||
|
||||
#elif CONFIG_XEN_CTRL_INTERFACE_VERSION == 40600
|
||||
#include <xenctrl.h>
|
||||
#include <xenstore.h>
|
||||
#include <stdint.h>
|
||||
#include <xen/hvm/hvm_info_table.h>
|
||||
#if !defined(HVM_MAX_VCPUS)
|
||||
# error HVM_MAX_VCPUS not defined
|
||||
#endif
|
||||
int main(void) {
|
||||
xc_interface *xc;
|
||||
xs_daemon_open();
|
||||
xc = xc_interface_open(0, 0, 0);
|
||||
xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
|
||||
xc_gnttab_open(NULL, 0);
|
||||
xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
|
||||
xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
|
||||
xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
|
||||
xc_reserved_device_memory_map(xc, 0, 0, 0, 0, NULL, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#elif CONFIG_XEN_CTRL_INTERFACE_VERSION == 40500
|
||||
#include <xenctrl.h>
|
||||
#include <xenstore.h>
|
||||
#include <stdint.h>
|
||||
#include <xen/hvm/hvm_info_table.h>
|
||||
#if !defined(HVM_MAX_VCPUS)
|
||||
# error HVM_MAX_VCPUS not defined
|
||||
#endif
|
||||
int main(void) {
|
||||
xc_interface *xc;
|
||||
xs_daemon_open();
|
||||
xc = xc_interface_open(0, 0, 0);
|
||||
xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
|
||||
xc_gnttab_open(NULL, 0);
|
||||
xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
|
||||
xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
|
||||
xc_hvm_create_ioreq_server(xc, 0, 0, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#elif CONFIG_XEN_CTRL_INTERFACE_VERSION == 40200
|
||||
#include <xenctrl.h>
|
||||
#include <xenstore.h>
|
||||
#include <stdint.h>
|
||||
#include <xen/hvm/hvm_info_table.h>
|
||||
#if !defined(HVM_MAX_VCPUS)
|
||||
# error HVM_MAX_VCPUS not defined
|
||||
#endif
|
||||
int main(void) {
|
||||
xc_interface *xc;
|
||||
xs_daemon_open();
|
||||
xc = xc_interface_open(0, 0, 0);
|
||||
xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
|
||||
xc_gnttab_open(NULL, 0);
|
||||
xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
|
||||
xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
#error invalid CONFIG_XEN_CTRL_INTERFACE_VERSION
|
||||
#endif
|
||||
|
@ -15,7 +15,7 @@ int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num)
|
||||
return -1;
|
||||
}
|
||||
|
||||
void xen_piix3_set_irq(void *opaque, int irq_num, int level)
|
||||
void xen_intx_set_irq(void *opaque, int irq_num, int level)
|
||||
{
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user