2 * QEMU simulated PCI pvpanic device.
4 * Copyright (C) 2020 Oracle
7 * Mihai Carabas <mihai.carabas@oracle.com>
9 * This work is licensed under the terms of the GNU GPL, version 2 or later.
10 * See the COPYING file in the top-level directory.
14 #include "qemu/osdep.h"
15 #include "qemu/module.h"
16 #include "sysemu/runstate.h"
18 #include "hw/nvram/fw_cfg.h"
19 #include "hw/qdev-properties.h"
20 #include "migration/vmstate.h"
21 #include "hw/misc/pvpanic.h"
22 #include "qom/object.h"
23 #include "hw/pci/pci.h"
25 OBJECT_DECLARE_SIMPLE_TYPE(PVPanicPCIState
, PVPANIC_PCI_DEVICE
)
28 * PVPanicPCIState for PCI device
30 typedef struct PVPanicPCIState
{
35 static const VMStateDescription vmstate_pvpanic_pci
= {
36 .name
= "pvpanic-pci",
38 .minimum_version_id
= 1,
39 .fields
= (VMStateField
[]) {
40 VMSTATE_PCI_DEVICE(dev
, PVPanicPCIState
),
45 static void pvpanic_pci_realizefn(PCIDevice
*dev
, Error
**errp
)
47 PVPanicPCIState
*s
= PVPANIC_PCI_DEVICE(dev
);
48 PVPanicState
*ps
= &s
->pvpanic
;
50 pvpanic_setup_io(&s
->pvpanic
, DEVICE(s
), 2);
52 pci_register_bar(dev
, 0, PCI_BASE_ADDRESS_SPACE_MEMORY
, &ps
->mr
);
55 static Property pvpanic_pci_properties
[] = {
56 DEFINE_PROP_UINT8("events", PVPanicPCIState
, pvpanic
.events
, PVPANIC_PANICKED
| PVPANIC_CRASHLOADED
),
57 DEFINE_PROP_END_OF_LIST(),
60 static void pvpanic_pci_class_init(ObjectClass
*klass
, void *data
)
62 DeviceClass
*dc
= DEVICE_CLASS(klass
);
63 PCIDeviceClass
*pc
= PCI_DEVICE_CLASS(klass
);
65 device_class_set_props(dc
, pvpanic_pci_properties
);
67 pc
->realize
= pvpanic_pci_realizefn
;
68 pc
->vendor_id
= PCI_VENDOR_ID_REDHAT
;
69 pc
->device_id
= PCI_DEVICE_ID_REDHAT_PVPANIC
;
71 pc
->class_id
= PCI_CLASS_SYSTEM_OTHER
;
72 dc
->vmsd
= &vmstate_pvpanic_pci
;
74 set_bit(DEVICE_CATEGORY_MISC
, dc
->categories
);
77 static TypeInfo pvpanic_pci_info
= {
78 .name
= TYPE_PVPANIC_PCI_DEVICE
,
79 .parent
= TYPE_PCI_DEVICE
,
80 .instance_size
= sizeof(PVPanicPCIState
),
81 .class_init
= pvpanic_pci_class_init
,
82 .interfaces
= (InterfaceInfo
[]) {
83 { INTERFACE_CONVENTIONAL_PCI_DEVICE
},
88 static void pvpanic_register_types(void)
90 type_register_static(&pvpanic_pci_info
);
93 type_init(pvpanic_register_types
);