qemu/hw/misc/pvpanic-pci.c
<<
>>
Prefs
   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
  14#include "qemu/osdep.h"
  15#include "qemu/module.h"
  16#include "sysemu/runstate.h"
  17
  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"
  24#include "standard-headers/linux/pvpanic.h"
  25
  26OBJECT_DECLARE_SIMPLE_TYPE(PVPanicPCIState, PVPANIC_PCI_DEVICE)
  27
  28/*
  29 * PVPanicPCIState for PCI device
  30 */
  31typedef struct PVPanicPCIState {
  32    PCIDevice dev;
  33    PVPanicState pvpanic;
  34} PVPanicPCIState;
  35
  36static const VMStateDescription vmstate_pvpanic_pci = {
  37    .name = "pvpanic-pci",
  38    .version_id = 1,
  39    .minimum_version_id = 1,
  40    .fields = (VMStateField[]) {
  41        VMSTATE_PCI_DEVICE(dev, PVPanicPCIState),
  42        VMSTATE_END_OF_LIST()
  43    }
  44};
  45
  46static void pvpanic_pci_realizefn(PCIDevice *dev, Error **errp)
  47{
  48    PVPanicPCIState *s = PVPANIC_PCI_DEVICE(dev);
  49    PVPanicState *ps = &s->pvpanic;
  50
  51    pvpanic_setup_io(&s->pvpanic, DEVICE(s), 2);
  52
  53    pci_register_bar(dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &ps->mr);
  54}
  55
  56static Property pvpanic_pci_properties[] = {
  57    DEFINE_PROP_UINT8("events", PVPanicPCIState, pvpanic.events,
  58                      PVPANIC_PANICKED | PVPANIC_CRASH_LOADED),
  59    DEFINE_PROP_END_OF_LIST(),
  60};
  61
  62static void pvpanic_pci_class_init(ObjectClass *klass, void *data)
  63{
  64    DeviceClass *dc = DEVICE_CLASS(klass);
  65    PCIDeviceClass *pc = PCI_DEVICE_CLASS(klass);
  66
  67    device_class_set_props(dc, pvpanic_pci_properties);
  68
  69    pc->realize = pvpanic_pci_realizefn;
  70    pc->vendor_id = PCI_VENDOR_ID_REDHAT;
  71    pc->device_id = PCI_DEVICE_ID_REDHAT_PVPANIC;
  72    pc->revision = 1;
  73    pc->class_id = PCI_CLASS_SYSTEM_OTHER;
  74    dc->vmsd = &vmstate_pvpanic_pci;
  75
  76    set_bit(DEVICE_CATEGORY_MISC, dc->categories);
  77}
  78
  79static 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 },
  86        { }
  87    }
  88};
  89
  90static void pvpanic_register_types(void)
  91{
  92    type_register_static(&pvpanic_pci_info);
  93}
  94
  95type_init(pvpanic_register_types);
  96