root / hw / ioapic_common.c @ 0cdd3d14
History | View | Annotate | Download (3.3 kB)
1 | 244ac3af | Jan Kiszka | /*
|
---|---|---|---|
2 | 244ac3af | Jan Kiszka | * IOAPIC emulation logic - common bits of emulated and KVM kernel model
|
3 | 244ac3af | Jan Kiszka | *
|
4 | 244ac3af | Jan Kiszka | * Copyright (c) 2004-2005 Fabrice Bellard
|
5 | 244ac3af | Jan Kiszka | * Copyright (c) 2009 Xiantao Zhang, Intel
|
6 | 244ac3af | Jan Kiszka | * Copyright (c) 2011 Jan Kiszka, Siemens AG
|
7 | 244ac3af | Jan Kiszka | *
|
8 | 244ac3af | Jan Kiszka | * This library is free software; you can redistribute it and/or
|
9 | 244ac3af | Jan Kiszka | * modify it under the terms of the GNU Lesser General Public
|
10 | 244ac3af | Jan Kiszka | * License as published by the Free Software Foundation; either
|
11 | 244ac3af | Jan Kiszka | * version 2 of the License, or (at your option) any later version.
|
12 | 244ac3af | Jan Kiszka | *
|
13 | 244ac3af | Jan Kiszka | * This library is distributed in the hope that it will be useful,
|
14 | 244ac3af | Jan Kiszka | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
15 | 244ac3af | Jan Kiszka | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
16 | 244ac3af | Jan Kiszka | * Lesser General Public License for more details.
|
17 | 244ac3af | Jan Kiszka | *
|
18 | 244ac3af | Jan Kiszka | * You should have received a copy of the GNU Lesser General Public
|
19 | 244ac3af | Jan Kiszka | * License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
20 | 244ac3af | Jan Kiszka | */
|
21 | 244ac3af | Jan Kiszka | |
22 | 244ac3af | Jan Kiszka | #include "ioapic.h" |
23 | 244ac3af | Jan Kiszka | #include "ioapic_internal.h" |
24 | 244ac3af | Jan Kiszka | #include "sysbus.h" |
25 | 244ac3af | Jan Kiszka | |
26 | 244ac3af | Jan Kiszka | void ioapic_reset_common(DeviceState *dev)
|
27 | 244ac3af | Jan Kiszka | { |
28 | 999e12bb | Anthony Liguori | IOAPICCommonState *s = IOAPIC_COMMON(dev); |
29 | 244ac3af | Jan Kiszka | int i;
|
30 | 244ac3af | Jan Kiszka | |
31 | 244ac3af | Jan Kiszka | s->id = 0;
|
32 | 244ac3af | Jan Kiszka | s->ioregsel = 0;
|
33 | 244ac3af | Jan Kiszka | s->irr = 0;
|
34 | 244ac3af | Jan Kiszka | for (i = 0; i < IOAPIC_NUM_PINS; i++) { |
35 | 244ac3af | Jan Kiszka | s->ioredtbl[i] = 1 << IOAPIC_LVT_MASKED_SHIFT;
|
36 | 244ac3af | Jan Kiszka | } |
37 | 244ac3af | Jan Kiszka | } |
38 | 244ac3af | Jan Kiszka | |
39 | 244ac3af | Jan Kiszka | static void ioapic_dispatch_pre_save(void *opaque) |
40 | 244ac3af | Jan Kiszka | { |
41 | 999e12bb | Anthony Liguori | IOAPICCommonState *s = IOAPIC_COMMON(opaque); |
42 | 999e12bb | Anthony Liguori | IOAPICCommonClass *info = IOAPIC_COMMON_GET_CLASS(s); |
43 | 244ac3af | Jan Kiszka | |
44 | 244ac3af | Jan Kiszka | if (info->pre_save) {
|
45 | 244ac3af | Jan Kiszka | info->pre_save(s); |
46 | 244ac3af | Jan Kiszka | } |
47 | 244ac3af | Jan Kiszka | } |
48 | 244ac3af | Jan Kiszka | |
49 | 244ac3af | Jan Kiszka | static int ioapic_dispatch_post_load(void *opaque, int version_id) |
50 | 244ac3af | Jan Kiszka | { |
51 | 999e12bb | Anthony Liguori | IOAPICCommonState *s = IOAPIC_COMMON(opaque); |
52 | 999e12bb | Anthony Liguori | IOAPICCommonClass *info = IOAPIC_COMMON_GET_CLASS(s); |
53 | 244ac3af | Jan Kiszka | |
54 | 244ac3af | Jan Kiszka | if (info->post_load) {
|
55 | 244ac3af | Jan Kiszka | info->post_load(s); |
56 | 244ac3af | Jan Kiszka | } |
57 | 244ac3af | Jan Kiszka | return 0; |
58 | 244ac3af | Jan Kiszka | } |
59 | 244ac3af | Jan Kiszka | |
60 | 244ac3af | Jan Kiszka | static int ioapic_init_common(SysBusDevice *dev) |
61 | 244ac3af | Jan Kiszka | { |
62 | 244ac3af | Jan Kiszka | IOAPICCommonState *s = FROM_SYSBUS(IOAPICCommonState, dev); |
63 | 999e12bb | Anthony Liguori | IOAPICCommonClass *info; |
64 | 244ac3af | Jan Kiszka | static int ioapic_no; |
65 | 244ac3af | Jan Kiszka | |
66 | 244ac3af | Jan Kiszka | if (ioapic_no >= MAX_IOAPICS) {
|
67 | 244ac3af | Jan Kiszka | return -1; |
68 | 244ac3af | Jan Kiszka | } |
69 | 244ac3af | Jan Kiszka | |
70 | 999e12bb | Anthony Liguori | info = IOAPIC_COMMON_GET_CLASS(s); |
71 | 244ac3af | Jan Kiszka | info->init(s, ioapic_no); |
72 | 244ac3af | Jan Kiszka | |
73 | 244ac3af | Jan Kiszka | sysbus_init_mmio(&s->busdev, &s->io_memory); |
74 | 244ac3af | Jan Kiszka | ioapic_no++; |
75 | 244ac3af | Jan Kiszka | |
76 | 244ac3af | Jan Kiszka | return 0; |
77 | 244ac3af | Jan Kiszka | } |
78 | 244ac3af | Jan Kiszka | |
79 | 244ac3af | Jan Kiszka | static const VMStateDescription vmstate_ioapic_common = { |
80 | 244ac3af | Jan Kiszka | .name = "ioapic",
|
81 | 244ac3af | Jan Kiszka | .version_id = 3,
|
82 | 244ac3af | Jan Kiszka | .minimum_version_id = 1,
|
83 | 244ac3af | Jan Kiszka | .minimum_version_id_old = 1,
|
84 | 244ac3af | Jan Kiszka | .pre_save = ioapic_dispatch_pre_save, |
85 | 244ac3af | Jan Kiszka | .post_load = ioapic_dispatch_post_load, |
86 | 244ac3af | Jan Kiszka | .fields = (VMStateField[]) { |
87 | 244ac3af | Jan Kiszka | VMSTATE_UINT8(id, IOAPICCommonState), |
88 | 244ac3af | Jan Kiszka | VMSTATE_UINT8(ioregsel, IOAPICCommonState), |
89 | 244ac3af | Jan Kiszka | VMSTATE_UNUSED_V(2, 8), /* to account for qemu-kvm's v2 format */ |
90 | 244ac3af | Jan Kiszka | VMSTATE_UINT32_V(irr, IOAPICCommonState, 2),
|
91 | 244ac3af | Jan Kiszka | VMSTATE_UINT64_ARRAY(ioredtbl, IOAPICCommonState, IOAPIC_NUM_PINS), |
92 | 244ac3af | Jan Kiszka | VMSTATE_END_OF_LIST() |
93 | 244ac3af | Jan Kiszka | } |
94 | 244ac3af | Jan Kiszka | }; |
95 | 244ac3af | Jan Kiszka | |
96 | 999e12bb | Anthony Liguori | static void ioapic_common_class_init(ObjectClass *klass, void *data) |
97 | 244ac3af | Jan Kiszka | { |
98 | 999e12bb | Anthony Liguori | SysBusDeviceClass *sc = SYS_BUS_DEVICE_CLASS(klass); |
99 | 39bffca2 | Anthony Liguori | DeviceClass *dc = DEVICE_CLASS(klass); |
100 | 999e12bb | Anthony Liguori | |
101 | 999e12bb | Anthony Liguori | sc->init = ioapic_init_common; |
102 | 39bffca2 | Anthony Liguori | dc->vmsd = &vmstate_ioapic_common; |
103 | 39bffca2 | Anthony Liguori | dc->no_user = 1;
|
104 | 999e12bb | Anthony Liguori | } |
105 | 999e12bb | Anthony Liguori | |
106 | 999e12bb | Anthony Liguori | static TypeInfo ioapic_common_type = {
|
107 | 999e12bb | Anthony Liguori | .name = TYPE_IOAPIC_COMMON, |
108 | 999e12bb | Anthony Liguori | .parent = TYPE_SYS_BUS_DEVICE, |
109 | 999e12bb | Anthony Liguori | .instance_size = sizeof(IOAPICCommonState),
|
110 | 999e12bb | Anthony Liguori | .class_size = sizeof(IOAPICCommonClass),
|
111 | 999e12bb | Anthony Liguori | .class_init = ioapic_common_class_init, |
112 | 999e12bb | Anthony Liguori | .abstract = true,
|
113 | 999e12bb | Anthony Liguori | }; |
114 | 999e12bb | Anthony Liguori | |
115 | 83f7d43a | Andreas Färber | static void register_types(void) |
116 | 999e12bb | Anthony Liguori | { |
117 | 999e12bb | Anthony Liguori | type_register_static(&ioapic_common_type); |
118 | 999e12bb | Anthony Liguori | } |
119 | 999e12bb | Anthony Liguori | |
120 | 83f7d43a | Andreas Färber | type_init(register_types) |