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_device.h"
24 #include "standard-headers/linux/pvpanic.h"
26 OBJECT_DECLARE_SIMPLE_TYPE(PVPanicPCIState
, PVPANIC_PCI_DEVICE
)
29 * PVPanicPCIState for PCI device
31 typedef struct PVPanicPCIState
{
36 static const VMStateDescription vmstate_pvpanic_pci
= {
37 .name
= "pvpanic-pci",
39 .minimum_version_id
= 1,
40 .fields
= (const VMStateField
[]) {
41 VMSTATE_PCI_DEVICE(dev
, PVPanicPCIState
),
46 static void pvpanic_pci_realizefn(PCIDevice
*dev
, Error
**errp
)
48 PVPanicPCIState
*s
= PVPANIC_PCI_DEVICE(dev
);
49 PVPanicState
*ps
= &s
->pvpanic
;
51 pvpanic_setup_io(&s
->pvpanic
, DEVICE(s
), 2);
53 pci_register_bar(dev
, 0, PCI_BASE_ADDRESS_SPACE_MEMORY
, &ps
->mr
);
56 static Property pvpanic_pci_properties
[] = {
57 DEFINE_PROP_UINT8("events", PVPanicPCIState
, pvpanic
.events
,
58 PVPANIC_PANICKED
| PVPANIC_CRASH_LOADED
),
59 DEFINE_PROP_END_OF_LIST(),
62 static void pvpanic_pci_class_init(ObjectClass
*klass
, void *data
)
64 DeviceClass
*dc
= DEVICE_CLASS(klass
);
65 PCIDeviceClass
*pc
= PCI_DEVICE_CLASS(klass
);
67 device_class_set_props(dc
, pvpanic_pci_properties
);
69 pc
->realize
= pvpanic_pci_realizefn
;
70 pc
->vendor_id
= PCI_VENDOR_ID_REDHAT
;
71 pc
->device_id
= PCI_DEVICE_ID_REDHAT_PVPANIC
;
73 pc
->class_id
= PCI_CLASS_SYSTEM_OTHER
;
74 dc
->vmsd
= &vmstate_pvpanic_pci
;
76 set_bit(DEVICE_CATEGORY_MISC
, dc
->categories
);
79 static const TypeInfo pvpanic_pci_info
= {
80 .name
= TYPE_PVPANIC_PCI_DEVICE
,
81 .parent
= TYPE_PCI_DEVICE
,
82 .instance_size
= sizeof(PVPanicPCIState
),
83 .class_init
= pvpanic_pci_class_init
,
84 .interfaces
= (InterfaceInfo
[]) {
85 { INTERFACE_CONVENTIONAL_PCI_DEVICE
},
90 static void pvpanic_register_types(void)
92 type_register_static(&pvpanic_pci_info
);
95 type_init(pvpanic_register_types
);