mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-07-08 20:17:27 +00:00
Let's vmstatify virtio_ccw_save_config and virtio_ccw_load_config for flexibility (extending using subsections) and for fun. To achieve this we need to hack the config_vector, which is VirtIODevice (that is common virtio) state, in the middle of the VirtioCcwDevice state representation. This is somewhat ugly, but we have no choice because the stream format needs to be preserved. Almost no changes in behavior. Exception is everything that comes with vmstate like extra bookkeeping about what's in the stream, and maybe some extra checks and better error reporting. Signed-off-by: Halil Pasic <pasic@linux.vnet.ibm.com> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Reviewed-by: Juan Quintela <quintela@redhat.com> Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com> Message-Id: <20170703213414.94298-1-pasic@linux.vnet.ibm.com> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
55 lines
1.6 KiB
C
55 lines
1.6 KiB
C
/*
|
|
* Common device infrastructure for devices in the virtual css
|
|
*
|
|
* Copyright 2016 IBM Corp.
|
|
* Author(s): Jing Liu <liujbjl@linux.vnet.ibm.com>
|
|
*
|
|
* This work is licensed under the terms of the GNU GPL, version 2 or (at
|
|
* your option) any later version. See the COPYING file in the top-level
|
|
* directory.
|
|
*/
|
|
|
|
#ifndef HW_S390X_CCW_DEVICE_H
|
|
#define HW_S390X_CCW_DEVICE_H
|
|
#include "qom/object.h"
|
|
#include "hw/qdev-core.h"
|
|
#include "hw/s390x/css.h"
|
|
|
|
typedef struct CcwDevice {
|
|
DeviceState parent_obj;
|
|
SubchDev *sch;
|
|
/* <cssid>.<ssid>.<device number> */
|
|
/* The user-set busid of the virtual ccw device. */
|
|
CssDevId devno;
|
|
/* The actual busid of the virtual ccw device. */
|
|
CssDevId dev_id;
|
|
/* The actual busid of the virtual subchannel. */
|
|
CssDevId subch_id;
|
|
} CcwDevice;
|
|
|
|
extern const VMStateDescription vmstate_ccw_dev;
|
|
#define VMSTATE_CCW_DEVICE(_field, _state) \
|
|
VMSTATE_STRUCT(_field, _state, 1, vmstate_ccw_dev, CcwDevice)
|
|
|
|
typedef struct CCWDeviceClass {
|
|
DeviceClass parent_class;
|
|
void (*unplug)(HotplugHandler *, DeviceState *, Error **);
|
|
void (*realize)(CcwDevice *, Error **);
|
|
void (*refill_ids)(CcwDevice *);
|
|
} CCWDeviceClass;
|
|
|
|
static inline CcwDevice *to_ccw_dev_fast(DeviceState *d)
|
|
{
|
|
return container_of(d, CcwDevice, parent_obj);
|
|
}
|
|
|
|
#define TYPE_CCW_DEVICE "ccw-device"
|
|
|
|
#define CCW_DEVICE(obj) OBJECT_CHECK(CcwDevice, (obj), TYPE_CCW_DEVICE)
|
|
#define CCW_DEVICE_GET_CLASS(obj) \
|
|
OBJECT_GET_CLASS(CCWDeviceClass, (obj), TYPE_CCW_DEVICE)
|
|
#define CCW_DEVICE_CLASS(klass) \
|
|
OBJECT_CLASS_CHECK(CCWDeviceClass, (klass), TYPE_CCW_DEVICE)
|
|
|
|
#endif
|