qemu/hw/misc/pvpanic-isa.c
<<
>>
Prefs
   1/*
   2 * QEMU simulated pvpanic device.
   3 *
   4 * Copyright Fujitsu, Corp. 2013
   5 *
   6 * Authors:
   7 *     Wen Congyang <wency@cn.fujitsu.com>
   8 *     Hu Tao <hutao@cn.fujitsu.com>
   9 *
  10 * This work is licensed under the terms of the GNU GPL, version 2 or later.
  11 * See the COPYING file in the top-level directory.
  12 *
  13 */
  14
  15#include "qemu/osdep.h"
  16#include "qemu/log.h"
  17#include "qemu/module.h"
  18#include "sysemu/runstate.h"
  19
  20#include "hw/nvram/fw_cfg.h"
  21#include "hw/qdev-properties.h"
  22#include "hw/misc/pvpanic.h"
  23#include "qom/object.h"
  24#include "hw/isa/isa.h"
  25
  26OBJECT_DECLARE_SIMPLE_TYPE(PVPanicISAState, PVPANIC_ISA_DEVICE)
  27
  28/*
  29 * PVPanicISAState for ISA device and
  30 * use ioport.
  31 */
  32struct PVPanicISAState {
  33    ISADevice parent_obj;
  34
  35    uint16_t ioport;
  36    PVPanicState pvpanic;
  37};
  38
  39static void pvpanic_isa_initfn(Object *obj)
  40{
  41    PVPanicISAState *s = PVPANIC_ISA_DEVICE(obj);
  42
  43    pvpanic_setup_io(&s->pvpanic, DEVICE(s), 1);
  44}
  45
  46static void pvpanic_isa_realizefn(DeviceState *dev, Error **errp)
  47{
  48    ISADevice *d = ISA_DEVICE(dev);
  49    PVPanicISAState *s = PVPANIC_ISA_DEVICE(dev);
  50    PVPanicState *ps = &s->pvpanic;
  51    FWCfgState *fw_cfg = fw_cfg_find();
  52    uint16_t *pvpanic_port;
  53
  54    if (!fw_cfg) {
  55        return;
  56    }
  57
  58    pvpanic_port = g_malloc(sizeof(*pvpanic_port));
  59    *pvpanic_port = cpu_to_le16(s->ioport);
  60    fw_cfg_add_file(fw_cfg, "etc/pvpanic-port", pvpanic_port,
  61                    sizeof(*pvpanic_port));
  62
  63    isa_register_ioport(d, &ps->mr, s->ioport);
  64}
  65
  66static Property pvpanic_isa_properties[] = {
  67    DEFINE_PROP_UINT16(PVPANIC_IOPORT_PROP, PVPanicISAState, ioport, 0x505),
  68    DEFINE_PROP_UINT8("events", PVPanicISAState, pvpanic.events, PVPANIC_PANICKED | PVPANIC_CRASHLOADED),
  69    DEFINE_PROP_END_OF_LIST(),
  70};
  71
  72static void pvpanic_isa_class_init(ObjectClass *klass, void *data)
  73{
  74    DeviceClass *dc = DEVICE_CLASS(klass);
  75
  76    dc->realize = pvpanic_isa_realizefn;
  77    device_class_set_props(dc, pvpanic_isa_properties);
  78    set_bit(DEVICE_CATEGORY_MISC, dc->categories);
  79}
  80
  81static TypeInfo pvpanic_isa_info = {
  82    .name          = TYPE_PVPANIC_ISA_DEVICE,
  83    .parent        = TYPE_ISA_DEVICE,
  84    .instance_size = sizeof(PVPanicISAState),
  85    .instance_init = pvpanic_isa_initfn,
  86    .class_init    = pvpanic_isa_class_init,
  87};
  88
  89static void pvpanic_register_types(void)
  90{
  91    type_register_static(&pvpanic_isa_info);
  92}
  93
  94type_init(pvpanic_register_types)
  95