xref: /qemu/hw/i386/xen/xen_apic.c (revision 226419d6153048cdba2fe722636220b01a1f9e96)
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  */
12b6a0aa05SPeter Maydell #include "qemu/osdep.h"
130d09e41aSPaolo Bonzini #include "hw/i386/apic_internal.h"
14a2cb15b0SMichael S. Tsirkin #include "hw/pci/msi.h"
150d09e41aSPaolo Bonzini #include "hw/xen/xen.h"
169468e9c4SWei Liu 
17a8170e5eSAvi Kivity static uint64_t xen_apic_mem_read(void *opaque, hwaddr addr,
189468e9c4SWei Liu                                   unsigned size)
199468e9c4SWei Liu {
209468e9c4SWei Liu     return ~(uint64_t)0;
219468e9c4SWei Liu }
229468e9c4SWei Liu 
23a8170e5eSAvi Kivity static void xen_apic_mem_write(void *opaque, hwaddr addr,
249468e9c4SWei Liu                                uint64_t data, unsigned size)
259468e9c4SWei Liu {
269468e9c4SWei Liu     if (size != sizeof(uint32_t)) {
279468e9c4SWei Liu         fprintf(stderr, "Xen: APIC write data size = %d, invalid\n", size);
289468e9c4SWei Liu         return;
299468e9c4SWei Liu     }
309468e9c4SWei Liu 
319468e9c4SWei Liu     xen_hvm_inject_msi(addr, data);
329468e9c4SWei Liu }
339468e9c4SWei Liu 
349468e9c4SWei Liu static const MemoryRegionOps xen_apic_io_ops = {
359468e9c4SWei Liu     .read = xen_apic_mem_read,
369468e9c4SWei Liu     .write = xen_apic_mem_write,
379468e9c4SWei Liu     .endianness = DEVICE_NATIVE_ENDIAN,
389468e9c4SWei Liu };
399468e9c4SWei Liu 
40ff6986ceSxiaoqiang zhao static void xen_apic_realize(DeviceState *dev, Error **errp)
419468e9c4SWei Liu {
42ff6986ceSxiaoqiang zhao     APICCommonState *s = APIC_COMMON(dev);
43ff6986ceSxiaoqiang zhao 
44b33a5bbfSChunyan Liu     s->vapic_control = 0;
4522fc860bSPaolo Bonzini     memory_region_init_io(&s->io_memory, OBJECT(s), &xen_apic_io_ops, s,
4622fc860bSPaolo Bonzini                           "xen-apic-msi", APIC_SPACE_SIZE);
47*226419d6SMichael S. Tsirkin     msi_nonbroken = true;
489468e9c4SWei Liu }
499468e9c4SWei Liu 
509468e9c4SWei Liu static void xen_apic_set_base(APICCommonState *s, uint64_t val)
519468e9c4SWei Liu {
529468e9c4SWei Liu }
539468e9c4SWei Liu 
549468e9c4SWei Liu static void xen_apic_set_tpr(APICCommonState *s, uint8_t val)
559468e9c4SWei Liu {
569468e9c4SWei Liu }
579468e9c4SWei Liu 
589468e9c4SWei Liu static uint8_t xen_apic_get_tpr(APICCommonState *s)
599468e9c4SWei Liu {
609468e9c4SWei Liu     return 0;
619468e9c4SWei Liu }
629468e9c4SWei Liu 
639468e9c4SWei Liu static void xen_apic_vapic_base_update(APICCommonState *s)
649468e9c4SWei Liu {
659468e9c4SWei Liu }
669468e9c4SWei Liu 
679468e9c4SWei Liu static void xen_apic_external_nmi(APICCommonState *s)
689468e9c4SWei Liu {
699468e9c4SWei Liu }
709468e9c4SWei Liu 
719468e9c4SWei Liu static void xen_apic_class_init(ObjectClass *klass, void *data)
729468e9c4SWei Liu {
739468e9c4SWei Liu     APICCommonClass *k = APIC_COMMON_CLASS(klass);
749468e9c4SWei Liu 
75ff6986ceSxiaoqiang zhao     k->realize = xen_apic_realize;
769468e9c4SWei Liu     k->set_base = xen_apic_set_base;
779468e9c4SWei Liu     k->set_tpr = xen_apic_set_tpr;
789468e9c4SWei Liu     k->get_tpr = xen_apic_get_tpr;
799468e9c4SWei Liu     k->vapic_base_update = xen_apic_vapic_base_update;
809468e9c4SWei Liu     k->external_nmi = xen_apic_external_nmi;
819468e9c4SWei Liu }
829468e9c4SWei Liu 
838c43a6f0SAndreas Färber static const TypeInfo xen_apic_info = {
849468e9c4SWei Liu     .name = "xen-apic",
859468e9c4SWei Liu     .parent = TYPE_APIC_COMMON,
869468e9c4SWei Liu     .instance_size = sizeof(APICCommonState),
879468e9c4SWei Liu     .class_init = xen_apic_class_init,
889468e9c4SWei Liu };
899468e9c4SWei Liu 
909468e9c4SWei Liu static void xen_apic_register_types(void)
919468e9c4SWei Liu {
929468e9c4SWei Liu     type_register_static(&xen_apic_info);
939468e9c4SWei Liu }
949468e9c4SWei Liu 
959468e9c4SWei Liu type_init(xen_apic_register_types)
96