Statistics
| Branch: | Revision:

root / hw / ioapic_common.c @ 3bd88451

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 0d09e41a Paolo Bonzini
#include "hw/i386/ioapic.h"
23 0d09e41a Paolo Bonzini
#include "hw/i386/ioapic_internal.h"
24 83c9f4ca Paolo Bonzini
#include "hw/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 8c43a6f0 Andreas Färber
static const 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)