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