pvpanic-pci.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /*
  2. * QEMU simulated PCI pvpanic device.
  3. *
  4. * Copyright (C) 2020 Oracle
  5. *
  6. * Authors:
  7. * Mihai Carabas <mihai.carabas@oracle.com>
  8. *
  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.
  11. *
  12. */
  13. #include "qemu/osdep.h"
  14. #include "qemu/module.h"
  15. #include "sysemu/runstate.h"
  16. #include "hw/nvram/fw_cfg.h"
  17. #include "hw/qdev-properties.h"
  18. #include "migration/vmstate.h"
  19. #include "hw/misc/pvpanic.h"
  20. #include "qom/object.h"
  21. #include "hw/pci/pci.h"
  22. OBJECT_DECLARE_SIMPLE_TYPE(PVPanicPCIState, PVPANIC_PCI_DEVICE)
  23. /*
  24. * PVPanicPCIState for PCI device
  25. */
  26. typedef struct PVPanicPCIState {
  27. PCIDevice dev;
  28. PVPanicState pvpanic;
  29. } PVPanicPCIState;
  30. static const VMStateDescription vmstate_pvpanic_pci = {
  31. .name = "pvpanic-pci",
  32. .version_id = 1,
  33. .minimum_version_id = 1,
  34. .fields = (VMStateField[]) {
  35. VMSTATE_PCI_DEVICE(dev, PVPanicPCIState),
  36. VMSTATE_END_OF_LIST()
  37. }
  38. };
  39. static void pvpanic_pci_realizefn(PCIDevice *dev, Error **errp)
  40. {
  41. PVPanicPCIState *s = PVPANIC_PCI_DEVICE(dev);
  42. PVPanicState *ps = &s->pvpanic;
  43. pvpanic_setup_io(&s->pvpanic, DEVICE(s), 2);
  44. pci_register_bar(dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &ps->mr);
  45. }
  46. static Property pvpanic_pci_properties[] = {
  47. DEFINE_PROP_UINT8("events", PVPanicPCIState, pvpanic.events, PVPANIC_PANICKED | PVPANIC_CRASHLOADED),
  48. DEFINE_PROP_END_OF_LIST(),
  49. };
  50. static void pvpanic_pci_class_init(ObjectClass *klass, void *data)
  51. {
  52. DeviceClass *dc = DEVICE_CLASS(klass);
  53. PCIDeviceClass *pc = PCI_DEVICE_CLASS(klass);
  54. device_class_set_props(dc, pvpanic_pci_properties);
  55. pc->realize = pvpanic_pci_realizefn;
  56. pc->vendor_id = PCI_VENDOR_ID_REDHAT;
  57. pc->device_id = PCI_DEVICE_ID_REDHAT_PVPANIC;
  58. pc->revision = 1;
  59. pc->class_id = PCI_CLASS_SYSTEM_OTHER;
  60. dc->vmsd = &vmstate_pvpanic_pci;
  61. set_bit(DEVICE_CATEGORY_MISC, dc->categories);
  62. }
  63. static const TypeInfo pvpanic_pci_info = {
  64. .name = TYPE_PVPANIC_PCI_DEVICE,
  65. .parent = TYPE_PCI_DEVICE,
  66. .instance_size = sizeof(PVPanicPCIState),
  67. .class_init = pvpanic_pci_class_init,
  68. .interfaces = (InterfaceInfo[]) {
  69. { INTERFACE_CONVENTIONAL_PCI_DEVICE },
  70. { }
  71. }
  72. };
  73. static void pvpanic_register_types(void)
  74. {
  75. type_register_static(&pvpanic_pci_info);
  76. }
  77. type_init(pvpanic_register_types);