xref: /qemu/hw/i386/xen/xen_apic.c (revision ff6986ce618c69f988e4419efd67ea5cbf7792a5)
19468e9c4SWei Liu /*
29468e9c4SWei Liu  * Xen basic APIC support
39468e9c4SWei Liu  *
49468e9c4SWei Liu  * Copyright (c) 2012 Citrix
59468e9c4SWei Liu  *
69468e9c4SWei Liu  * Authors:
79468e9c4SWei Liu  *  Wei Liu <wei.liu2@citrix.com>
89468e9c4SWei Liu  *
99468e9c4SWei Liu  * This work is licensed under the terms of the GNU GPL version 2 or
109468e9c4SWei Liu  * later. See the COPYING file in the top-level directory.
119468e9c4SWei Liu  */
120d09e41aSPaolo Bonzini #include "hw/i386/apic_internal.h"
13a2cb15b0SMichael S. Tsirkin #include "hw/pci/msi.h"
140d09e41aSPaolo Bonzini #include "hw/xen/xen.h"
159468e9c4SWei Liu 
16a8170e5eSAvi Kivity static uint64_t xen_apic_mem_read(void *opaque, hwaddr addr,
179468e9c4SWei Liu                                   unsigned size)
189468e9c4SWei Liu {
199468e9c4SWei Liu     return ~(uint64_t)0;
209468e9c4SWei Liu }
219468e9c4SWei Liu 
22a8170e5eSAvi Kivity static void xen_apic_mem_write(void *opaque, hwaddr addr,
239468e9c4SWei Liu                                uint64_t data, unsigned size)
249468e9c4SWei Liu {
259468e9c4SWei Liu     if (size != sizeof(uint32_t)) {
269468e9c4SWei Liu         fprintf(stderr, "Xen: APIC write data size = %d, invalid\n", size);
279468e9c4SWei Liu         return;
289468e9c4SWei Liu     }
299468e9c4SWei Liu 
309468e9c4SWei Liu     xen_hvm_inject_msi(addr, data);
319468e9c4SWei Liu }
329468e9c4SWei Liu 
339468e9c4SWei Liu static const MemoryRegionOps xen_apic_io_ops = {
349468e9c4SWei Liu     .read = xen_apic_mem_read,
359468e9c4SWei Liu     .write = xen_apic_mem_write,
369468e9c4SWei Liu     .endianness = DEVICE_NATIVE_ENDIAN,
379468e9c4SWei Liu };
389468e9c4SWei Liu 
39*ff6986ceSxiaoqiang zhao static void xen_apic_realize(DeviceState *dev, Error **errp)
409468e9c4SWei Liu {
41*ff6986ceSxiaoqiang zhao     APICCommonState *s = APIC_COMMON(dev);
42*ff6986ceSxiaoqiang zhao 
4322fc860bSPaolo Bonzini     memory_region_init_io(&s->io_memory, OBJECT(s), &xen_apic_io_ops, s,
4422fc860bSPaolo Bonzini                           "xen-apic-msi", APIC_SPACE_SIZE);
4508a82ac0SJan Kiszka 
4608a82ac0SJan Kiszka #if defined(CONFIG_XEN_CTRL_INTERFACE_VERSION) \
4708a82ac0SJan Kiszka     && CONFIG_XEN_CTRL_INTERFACE_VERSION >= 420
4808a82ac0SJan Kiszka     msi_supported = true;
4908a82ac0SJan Kiszka #endif
509468e9c4SWei Liu }
519468e9c4SWei Liu 
529468e9c4SWei Liu static void xen_apic_set_base(APICCommonState *s, uint64_t val)
539468e9c4SWei Liu {
549468e9c4SWei Liu }
559468e9c4SWei Liu 
569468e9c4SWei Liu static void xen_apic_set_tpr(APICCommonState *s, uint8_t val)
579468e9c4SWei Liu {
589468e9c4SWei Liu }
599468e9c4SWei Liu 
609468e9c4SWei Liu static uint8_t xen_apic_get_tpr(APICCommonState *s)
619468e9c4SWei Liu {
629468e9c4SWei Liu     return 0;
639468e9c4SWei Liu }
649468e9c4SWei Liu 
659468e9c4SWei Liu static void xen_apic_vapic_base_update(APICCommonState *s)
669468e9c4SWei Liu {
679468e9c4SWei Liu }
689468e9c4SWei Liu 
699468e9c4SWei Liu static void xen_apic_external_nmi(APICCommonState *s)
709468e9c4SWei Liu {
719468e9c4SWei Liu }
729468e9c4SWei Liu 
739468e9c4SWei Liu static void xen_apic_class_init(ObjectClass *klass, void *data)
749468e9c4SWei Liu {
759468e9c4SWei Liu     APICCommonClass *k = APIC_COMMON_CLASS(klass);
769468e9c4SWei Liu 
77*ff6986ceSxiaoqiang zhao     k->realize = xen_apic_realize;
789468e9c4SWei Liu     k->set_base = xen_apic_set_base;
799468e9c4SWei Liu     k->set_tpr = xen_apic_set_tpr;
809468e9c4SWei Liu     k->get_tpr = xen_apic_get_tpr;
819468e9c4SWei Liu     k->vapic_base_update = xen_apic_vapic_base_update;
829468e9c4SWei Liu     k->external_nmi = xen_apic_external_nmi;
839468e9c4SWei Liu }
849468e9c4SWei Liu 
858c43a6f0SAndreas Färber static const TypeInfo xen_apic_info = {
869468e9c4SWei Liu     .name = "xen-apic",
879468e9c4SWei Liu     .parent = TYPE_APIC_COMMON,
889468e9c4SWei Liu     .instance_size = sizeof(APICCommonState),
899468e9c4SWei Liu     .class_init = xen_apic_class_init,
909468e9c4SWei Liu };
919468e9c4SWei Liu 
929468e9c4SWei Liu static void xen_apic_register_types(void)
939468e9c4SWei Liu {
949468e9c4SWei Liu     type_register_static(&xen_apic_info);
959468e9c4SWei Liu }
969468e9c4SWei Liu 
979468e9c4SWei Liu type_init(xen_apic_register_types)
98