xref: /qemu/hw/i386/xen/xen_apic.c (revision 9468e9c41a89b1c9f3a905b8959e1dd3f055c732)
1*9468e9c4SWei Liu /*
2*9468e9c4SWei Liu  * Xen basic APIC support
3*9468e9c4SWei Liu  *
4*9468e9c4SWei Liu  * Copyright (c) 2012 Citrix
5*9468e9c4SWei Liu  *
6*9468e9c4SWei Liu  * Authors:
7*9468e9c4SWei Liu  *  Wei Liu <wei.liu2@citrix.com>
8*9468e9c4SWei Liu  *
9*9468e9c4SWei Liu  * This work is licensed under the terms of the GNU GPL version 2 or
10*9468e9c4SWei Liu  * later. See the COPYING file in the top-level directory.
11*9468e9c4SWei Liu  */
12*9468e9c4SWei Liu #include "hw/apic_internal.h"
13*9468e9c4SWei Liu #include "hw/msi.h"
14*9468e9c4SWei Liu #include "xen.h"
15*9468e9c4SWei Liu 
16*9468e9c4SWei Liu static uint64_t xen_apic_mem_read(void *opaque, target_phys_addr_t addr,
17*9468e9c4SWei Liu                                   unsigned size)
18*9468e9c4SWei Liu {
19*9468e9c4SWei Liu     return ~(uint64_t)0;
20*9468e9c4SWei Liu }
21*9468e9c4SWei Liu 
22*9468e9c4SWei Liu static void xen_apic_mem_write(void *opaque, target_phys_addr_t addr,
23*9468e9c4SWei Liu                                uint64_t data, unsigned size)
24*9468e9c4SWei Liu {
25*9468e9c4SWei Liu     if (size != sizeof(uint32_t)) {
26*9468e9c4SWei Liu         fprintf(stderr, "Xen: APIC write data size = %d, invalid\n", size);
27*9468e9c4SWei Liu         return;
28*9468e9c4SWei Liu     }
29*9468e9c4SWei Liu 
30*9468e9c4SWei Liu     xen_hvm_inject_msi(addr, data);
31*9468e9c4SWei Liu }
32*9468e9c4SWei Liu 
33*9468e9c4SWei Liu static const MemoryRegionOps xen_apic_io_ops = {
34*9468e9c4SWei Liu     .read = xen_apic_mem_read,
35*9468e9c4SWei Liu     .write = xen_apic_mem_write,
36*9468e9c4SWei Liu     .endianness = DEVICE_NATIVE_ENDIAN,
37*9468e9c4SWei Liu };
38*9468e9c4SWei Liu 
39*9468e9c4SWei Liu static void xen_apic_init(APICCommonState *s)
40*9468e9c4SWei Liu {
41*9468e9c4SWei Liu     memory_region_init_io(&s->io_memory, &xen_apic_io_ops, s, "xen-apic-msi",
42*9468e9c4SWei Liu                           MSI_SPACE_SIZE);
43*9468e9c4SWei Liu }
44*9468e9c4SWei Liu 
45*9468e9c4SWei Liu static void xen_apic_set_base(APICCommonState *s, uint64_t val)
46*9468e9c4SWei Liu {
47*9468e9c4SWei Liu }
48*9468e9c4SWei Liu 
49*9468e9c4SWei Liu static void xen_apic_set_tpr(APICCommonState *s, uint8_t val)
50*9468e9c4SWei Liu {
51*9468e9c4SWei Liu }
52*9468e9c4SWei Liu 
53*9468e9c4SWei Liu static uint8_t xen_apic_get_tpr(APICCommonState *s)
54*9468e9c4SWei Liu {
55*9468e9c4SWei Liu     return 0;
56*9468e9c4SWei Liu }
57*9468e9c4SWei Liu 
58*9468e9c4SWei Liu static void xen_apic_vapic_base_update(APICCommonState *s)
59*9468e9c4SWei Liu {
60*9468e9c4SWei Liu }
61*9468e9c4SWei Liu 
62*9468e9c4SWei Liu static void xen_apic_external_nmi(APICCommonState *s)
63*9468e9c4SWei Liu {
64*9468e9c4SWei Liu }
65*9468e9c4SWei Liu 
66*9468e9c4SWei Liu static void xen_apic_class_init(ObjectClass *klass, void *data)
67*9468e9c4SWei Liu {
68*9468e9c4SWei Liu     APICCommonClass *k = APIC_COMMON_CLASS(klass);
69*9468e9c4SWei Liu 
70*9468e9c4SWei Liu     k->init = xen_apic_init;
71*9468e9c4SWei Liu     k->set_base = xen_apic_set_base;
72*9468e9c4SWei Liu     k->set_tpr = xen_apic_set_tpr;
73*9468e9c4SWei Liu     k->get_tpr = xen_apic_get_tpr;
74*9468e9c4SWei Liu     k->vapic_base_update = xen_apic_vapic_base_update;
75*9468e9c4SWei Liu     k->external_nmi = xen_apic_external_nmi;
76*9468e9c4SWei Liu }
77*9468e9c4SWei Liu 
78*9468e9c4SWei Liu static TypeInfo xen_apic_info = {
79*9468e9c4SWei Liu     .name = "xen-apic",
80*9468e9c4SWei Liu     .parent = TYPE_APIC_COMMON,
81*9468e9c4SWei Liu     .instance_size = sizeof(APICCommonState),
82*9468e9c4SWei Liu     .class_init = xen_apic_class_init,
83*9468e9c4SWei Liu };
84*9468e9c4SWei Liu 
85*9468e9c4SWei Liu static void xen_apic_register_types(void)
86*9468e9c4SWei Liu {
87*9468e9c4SWei Liu     type_register_static(&xen_apic_info);
88*9468e9c4SWei Liu }
89*9468e9c4SWei Liu 
90*9468e9c4SWei Liu type_init(xen_apic_register_types)
91