The first batch of s390x changes for 2.10:
- the new compat machine - several cleanups and optimizations - introspection for css ids -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJY+bZ5AAoJEN7Pa5PG8C+vsfgQAJvMTeJo9iyGYe8t/Xs5x+8J SHIifYCM+d7XMJr5izYcRJ173DxliFekXTmRW+0soZqoLraZ2p8AL/+VWHZlWeN0 AcYFzVduYbR2gub/HAgE4ZS46pjbuD4vTmOsLLz3FBn3J9QAiS9kGJ/eL/kZuHmY tIIXTjR/dQew3kknZiBZ9uD+Zy5ZeWOZUgYyAQwya3HBhqgOZ2ui2WJz8lUNDput PgGf886Cb6eTl5I3kTnvHrsiwFfrWzjpD+5A1zwBMHZtJLfW5hG5fWtNJzTeihqX N1sCUsTSdM7gspp0Xjkg8KpEPHccg0xe7cXGr9QCT9mXodppWnyvh+abowH5aNCd Na1+VwrtWL7kCKQo6JErId8wn0Wbam+9ymvY68occCgrNDcnCAgtmttOQDlgqJFd WyKMM9vnQkRpObZunUCJfH9wEMKx6OlRFBJVftdL40J/A8+DsVWNZ/qMMBkb5Qpg fNkESE1PePlH8kJqkbzs/uyXVpP0vb7/2EEx8+0ilo9lj3iU3Kektp55cGMNRBRL EwM0Ft2kTl3XTxcA8OAyHnF5FgKJpI6Cqh6PYo33uN1Od/SUv5INIG8VfUiFUE6E 8QLUck5ucpEvzFp0FRlU+ZAXE4LFgb3ZTLRE9yUljagy/EC2LL+O3qxnc9/iY4V/ NI07uSLZxb5Bpw8h9/9s =QDBR -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/cohuck/tags/s390x-20170421' into staging The first batch of s390x changes for 2.10: - the new compat machine - several cleanups and optimizations - introspection for css ids # gpg: Signature made Fri 21 Apr 2017 08:36:25 BST # gpg: using RSA key 0xDECF6B93C6F02FAF # gpg: Good signature from "Cornelia Huck <huckc@linux.vnet.ibm.com>" # gpg: aka "Cornelia Huck <cornelia.huck@de.ibm.com>" # Primary key fingerprint: C3D0 D66D C362 4FF6 A8C0 18CE DECF 6B93 C6F0 2FAF * remotes/cohuck/tags/s390x-20170421: s390x: Drop useless casts s390x: register I/O adapters per ISC during init s390x/flic: cache flic in s390_get_flic s390x: initialize flic before I/O subsystems s390x: use enum for adapter type and standardize its naming s390x/css: consolidate the devno property for ccw devices s390x/css: provide introspection for virtual subchannel and device busid s390x/css: introduce read-only property type for device ids s390x/pci: make printf always compile in debug output s390x/kvm: make printf always compile in debug output s390x: introduce 2.10 compat machine Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
b4c963fa82
|
@ -21,11 +21,14 @@
|
||||||
|
|
||||||
S390FLICState *s390_get_flic(void)
|
S390FLICState *s390_get_flic(void)
|
||||||
{
|
{
|
||||||
S390FLICState *fs;
|
static S390FLICState *fs;
|
||||||
|
|
||||||
fs = S390_FLIC_COMMON(object_resolve_path(TYPE_KVM_S390_FLIC, NULL));
|
|
||||||
if (!fs) {
|
if (!fs) {
|
||||||
fs = S390_FLIC_COMMON(object_resolve_path(TYPE_QEMU_S390_FLIC, NULL));
|
fs = S390_FLIC_COMMON(object_resolve_path(TYPE_KVM_S390_FLIC, NULL));
|
||||||
|
if (!fs) {
|
||||||
|
fs = S390_FLIC_COMMON(object_resolve_path(TYPE_QEMU_S390_FLIC,
|
||||||
|
NULL));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return fs;
|
return fs;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,11 +11,51 @@
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "ccw-device.h"
|
#include "ccw-device.h"
|
||||||
|
|
||||||
|
static void ccw_device_refill_ids(CcwDevice *dev)
|
||||||
|
{
|
||||||
|
SubchDev *sch = dev->sch;
|
||||||
|
|
||||||
|
assert(sch);
|
||||||
|
|
||||||
|
dev->dev_id.cssid = sch->cssid;
|
||||||
|
dev->dev_id.ssid = sch->ssid;
|
||||||
|
dev->dev_id.devid = sch->devno;
|
||||||
|
dev->dev_id.valid = true;
|
||||||
|
|
||||||
|
dev->subch_id.cssid = sch->cssid;
|
||||||
|
dev->subch_id.ssid = sch->ssid;
|
||||||
|
dev->subch_id.devid = sch->schid;
|
||||||
|
dev->subch_id.valid = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ccw_device_realize(CcwDevice *dev, Error **errp)
|
||||||
|
{
|
||||||
|
ccw_device_refill_ids(dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Property ccw_device_properties[] = {
|
||||||
|
DEFINE_PROP_CSS_DEV_ID("devno", CcwDevice, devno),
|
||||||
|
DEFINE_PROP_CSS_DEV_ID_RO("dev_id", CcwDevice, dev_id),
|
||||||
|
DEFINE_PROP_CSS_DEV_ID_RO("subch_id", CcwDevice, subch_id),
|
||||||
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
|
};
|
||||||
|
|
||||||
|
static void ccw_device_class_init(ObjectClass *klass, void *data)
|
||||||
|
{
|
||||||
|
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||||
|
CCWDeviceClass *k = CCW_DEVICE_CLASS(klass);
|
||||||
|
|
||||||
|
k->realize = ccw_device_realize;
|
||||||
|
k->refill_ids = ccw_device_refill_ids;
|
||||||
|
dc->props = ccw_device_properties;
|
||||||
|
}
|
||||||
|
|
||||||
static const TypeInfo ccw_device_info = {
|
static const TypeInfo ccw_device_info = {
|
||||||
.name = TYPE_CCW_DEVICE,
|
.name = TYPE_CCW_DEVICE,
|
||||||
.parent = TYPE_DEVICE,
|
.parent = TYPE_DEVICE,
|
||||||
.instance_size = sizeof(CcwDevice),
|
.instance_size = sizeof(CcwDevice),
|
||||||
.class_size = sizeof(CCWDeviceClass),
|
.class_size = sizeof(CCWDeviceClass),
|
||||||
|
.class_init = ccw_device_class_init,
|
||||||
.abstract = true,
|
.abstract = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -19,12 +19,19 @@ typedef struct CcwDevice {
|
||||||
DeviceState parent_obj;
|
DeviceState parent_obj;
|
||||||
SubchDev *sch;
|
SubchDev *sch;
|
||||||
/* <cssid>.<ssid>.<device number> */
|
/* <cssid>.<ssid>.<device number> */
|
||||||
CssDevId bus_id;
|
/* 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;
|
} CcwDevice;
|
||||||
|
|
||||||
typedef struct CCWDeviceClass {
|
typedef struct CCWDeviceClass {
|
||||||
DeviceClass parent_class;
|
DeviceClass parent_class;
|
||||||
void (*unplug)(HotplugHandler *, DeviceState *, Error **);
|
void (*unplug)(HotplugHandler *, DeviceState *, Error **);
|
||||||
|
void (*realize)(CcwDevice *, Error **);
|
||||||
|
void (*refill_ids)(CcwDevice *);
|
||||||
} CCWDeviceClass;
|
} CCWDeviceClass;
|
||||||
|
|
||||||
static inline CcwDevice *to_ccw_dev_fast(DeviceState *d)
|
static inline CcwDevice *to_ccw_dev_fast(DeviceState *d)
|
||||||
|
|
|
@ -107,6 +107,9 @@ VirtualCssBus *virtual_css_bus_init(void)
|
||||||
/* Enable hotplugging */
|
/* Enable hotplugging */
|
||||||
qbus_set_hotplug_handler(bus, dev, &error_abort);
|
qbus_set_hotplug_handler(bus, dev, &error_abort);
|
||||||
|
|
||||||
|
css_register_io_adapters(CSS_IO_ADAPTER_VIRTIO, true, false,
|
||||||
|
&error_abort);
|
||||||
|
|
||||||
return cbus;
|
return cbus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -47,7 +47,6 @@ typedef struct IoAdapter {
|
||||||
uint32_t id;
|
uint32_t id;
|
||||||
uint8_t type;
|
uint8_t type;
|
||||||
uint8_t isc;
|
uint8_t isc;
|
||||||
QTAILQ_ENTRY(IoAdapter) sibling;
|
|
||||||
} IoAdapter;
|
} IoAdapter;
|
||||||
|
|
||||||
typedef struct ChannelSubSys {
|
typedef struct ChannelSubSys {
|
||||||
|
@ -61,7 +60,7 @@ typedef struct ChannelSubSys {
|
||||||
uint64_t chnmon_area;
|
uint64_t chnmon_area;
|
||||||
CssImage *css[MAX_CSSID + 1];
|
CssImage *css[MAX_CSSID + 1];
|
||||||
uint8_t default_cssid;
|
uint8_t default_cssid;
|
||||||
QTAILQ_HEAD(, IoAdapter) io_adapters;
|
IoAdapter *io_adapters[CSS_IO_ADAPTER_TYPE_NUMS][MAX_ISC + 1];
|
||||||
QTAILQ_HEAD(, IndAddr) indicator_addresses;
|
QTAILQ_HEAD(, IndAddr) indicator_addresses;
|
||||||
} ChannelSubSys;
|
} ChannelSubSys;
|
||||||
|
|
||||||
|
@ -72,7 +71,6 @@ static ChannelSubSys channel_subsys = {
|
||||||
.do_crw_mchk = true,
|
.do_crw_mchk = true,
|
||||||
.crws_lost = false,
|
.crws_lost = false,
|
||||||
.chnmon_active = false,
|
.chnmon_active = false,
|
||||||
.io_adapters = QTAILQ_HEAD_INITIALIZER(channel_subsys.io_adapters),
|
|
||||||
.indicator_addresses =
|
.indicator_addresses =
|
||||||
QTAILQ_HEAD_INITIALIZER(channel_subsys.indicator_addresses),
|
QTAILQ_HEAD_INITIALIZER(channel_subsys.indicator_addresses),
|
||||||
};
|
};
|
||||||
|
@ -155,44 +153,67 @@ int css_create_css_image(uint8_t cssid, bool default_image)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int css_register_io_adapter(uint8_t type, uint8_t isc, bool swap,
|
uint32_t css_get_adapter_id(CssIoAdapterType type, uint8_t isc)
|
||||||
bool maskable, uint32_t *id)
|
|
||||||
{
|
{
|
||||||
|
if (type >= CSS_IO_ADAPTER_TYPE_NUMS || isc > MAX_ISC ||
|
||||||
|
!channel_subsys.io_adapters[type][isc]) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return channel_subsys.io_adapters[type][isc]->id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* css_register_io_adapters: Register I/O adapters per ISC during init
|
||||||
|
*
|
||||||
|
* @swap: an indication if byte swap is needed.
|
||||||
|
* @maskable: an indication if the adapter is subject to the mask operation.
|
||||||
|
* @errp: location to store error information.
|
||||||
|
*/
|
||||||
|
void css_register_io_adapters(CssIoAdapterType type, bool swap, bool maskable,
|
||||||
|
Error **errp)
|
||||||
|
{
|
||||||
|
uint32_t id;
|
||||||
|
int ret, isc;
|
||||||
IoAdapter *adapter;
|
IoAdapter *adapter;
|
||||||
bool found = false;
|
|
||||||
int ret;
|
|
||||||
S390FLICState *fs = s390_get_flic();
|
S390FLICState *fs = s390_get_flic();
|
||||||
S390FLICStateClass *fsc = S390_FLIC_COMMON_GET_CLASS(fs);
|
S390FLICStateClass *fsc = S390_FLIC_COMMON_GET_CLASS(fs);
|
||||||
|
|
||||||
*id = 0;
|
/*
|
||||||
QTAILQ_FOREACH(adapter, &channel_subsys.io_adapters, sibling) {
|
* Disallow multiple registrations for the same device type.
|
||||||
if ((adapter->type == type) && (adapter->isc == isc)) {
|
* Report an error if registering for an already registered type.
|
||||||
*id = adapter->id;
|
*/
|
||||||
found = true;
|
if (channel_subsys.io_adapters[type][0]) {
|
||||||
ret = 0;
|
error_setg(errp, "Adapters for type %d already registered", type);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (isc = 0; isc <= MAX_ISC; isc++) {
|
||||||
|
id = (type << 3) | isc;
|
||||||
|
ret = fsc->register_io_adapter(fs, id, isc, swap, maskable);
|
||||||
|
if (ret == 0) {
|
||||||
|
adapter = g_new0(IoAdapter, 1);
|
||||||
|
adapter->id = id;
|
||||||
|
adapter->isc = isc;
|
||||||
|
adapter->type = type;
|
||||||
|
channel_subsys.io_adapters[type][isc] = adapter;
|
||||||
|
} else {
|
||||||
|
error_setg_errno(errp, -ret, "Unexpected error %d when "
|
||||||
|
"registering adapter %d", ret, id);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (adapter->id >= *id) {
|
}
|
||||||
*id = adapter->id + 1;
|
|
||||||
|
/*
|
||||||
|
* No need to free registered adapters in kvm: kvm will clean up
|
||||||
|
* when the machine goes away.
|
||||||
|
*/
|
||||||
|
if (ret) {
|
||||||
|
for (isc--; isc >= 0; isc--) {
|
||||||
|
g_free(channel_subsys.io_adapters[type][isc]);
|
||||||
|
channel_subsys.io_adapters[type][isc] = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (found) {
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
adapter = g_new0(IoAdapter, 1);
|
|
||||||
ret = fsc->register_io_adapter(fs, *id, isc, swap, maskable);
|
|
||||||
if (ret == 0) {
|
|
||||||
adapter->id = *id;
|
|
||||||
adapter->isc = isc;
|
|
||||||
adapter->type = type;
|
|
||||||
QTAILQ_INSERT_TAIL(&channel_subsys.io_adapters, adapter, sibling);
|
|
||||||
} else {
|
|
||||||
g_free(adapter);
|
|
||||||
fprintf(stderr, "Unexpected error %d when registering adapter %d\n",
|
|
||||||
ret, *id);
|
|
||||||
}
|
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void css_clear_io_interrupt(uint16_t subchannel_id,
|
static void css_clear_io_interrupt(uint16_t subchannel_id,
|
||||||
|
@ -1894,6 +1915,13 @@ PropertyInfo css_devid_propinfo = {
|
||||||
.set = set_css_devid,
|
.set = set_css_devid,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
PropertyInfo css_devid_ro_propinfo = {
|
||||||
|
.name = "str",
|
||||||
|
.description = "Read-only identifier of an I/O device in the channel "
|
||||||
|
"subsystem, example: fe.1.23ab",
|
||||||
|
.get = get_css_devid,
|
||||||
|
};
|
||||||
|
|
||||||
SubchDev *css_create_virtual_sch(CssDevId bus_id, Error **errp)
|
SubchDev *css_create_virtual_sch(CssDevId bus_id, Error **errp)
|
||||||
{
|
{
|
||||||
uint16_t schid = 0;
|
uint16_t schid = 0;
|
||||||
|
|
|
@ -23,15 +23,17 @@
|
||||||
#include "hw/pci/msi.h"
|
#include "hw/pci/msi.h"
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
|
|
||||||
/* #define DEBUG_S390PCI_BUS */
|
#ifndef DEBUG_S390PCI_BUS
|
||||||
#ifdef DEBUG_S390PCI_BUS
|
#define DEBUG_S390PCI_BUS 0
|
||||||
#define DPRINTF(fmt, ...) \
|
|
||||||
do { fprintf(stderr, "S390pci-bus: " fmt, ## __VA_ARGS__); } while (0)
|
|
||||||
#else
|
|
||||||
#define DPRINTF(fmt, ...) \
|
|
||||||
do { } while (0)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define DPRINTF(fmt, ...) \
|
||||||
|
do { \
|
||||||
|
if (DEBUG_S390PCI_BUS) { \
|
||||||
|
fprintf(stderr, "S390pci-bus: " fmt, ## __VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
S390pciState *s390_get_phb(void)
|
S390pciState *s390_get_phb(void)
|
||||||
{
|
{
|
||||||
static S390pciState *phb;
|
static S390pciState *phb;
|
||||||
|
@ -579,6 +581,9 @@ static int s390_pcihost_init(SysBusDevice *dev)
|
||||||
s->bus_no = 0;
|
s->bus_no = 0;
|
||||||
QTAILQ_INIT(&s->pending_sei);
|
QTAILQ_INIT(&s->pending_sei);
|
||||||
QTAILQ_INIT(&s->zpci_devs);
|
QTAILQ_INIT(&s->zpci_devs);
|
||||||
|
|
||||||
|
css_register_io_adapters(CSS_IO_ADAPTER_PCI, true, false, &error_abort);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,6 @@
|
||||||
#define FH_MASK_INDEX 0x0000ffff
|
#define FH_MASK_INDEX 0x0000ffff
|
||||||
#define FH_SHM_VFIO 0x00010000
|
#define FH_SHM_VFIO 0x00010000
|
||||||
#define FH_SHM_EMUL 0x00020000
|
#define FH_SHM_EMUL 0x00020000
|
||||||
#define S390_PCIPT_ADAPTER 2
|
|
||||||
#define ZPCI_MAX_FID 0xffffffff
|
#define ZPCI_MAX_FID 0xffffffff
|
||||||
#define ZPCI_MAX_UID 0xffff
|
#define ZPCI_MAX_UID 0xffff
|
||||||
#define UID_UNDEFINED 0
|
#define UID_UNDEFINED 0
|
||||||
|
|
|
@ -20,15 +20,17 @@
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
#include "sysemu/hw_accel.h"
|
#include "sysemu/hw_accel.h"
|
||||||
|
|
||||||
/* #define DEBUG_S390PCI_INST */
|
#ifndef DEBUG_S390PCI_INST
|
||||||
#ifdef DEBUG_S390PCI_INST
|
#define DEBUG_S390PCI_INST 0
|
||||||
#define DPRINTF(fmt, ...) \
|
|
||||||
do { fprintf(stderr, "s390pci-inst: " fmt, ## __VA_ARGS__); } while (0)
|
|
||||||
#else
|
|
||||||
#define DPRINTF(fmt, ...) \
|
|
||||||
do { } while (0)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define DPRINTF(fmt, ...) \
|
||||||
|
do { \
|
||||||
|
if (DEBUG_S390PCI_INST) { \
|
||||||
|
fprintf(stderr, "s390pci-inst: " fmt, ## __VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
static void s390_set_status_code(CPUS390XState *env,
|
static void s390_set_status_code(CPUS390XState *env,
|
||||||
uint8_t r, uint64_t status_code)
|
uint8_t r, uint64_t status_code)
|
||||||
{
|
{
|
||||||
|
@ -731,12 +733,10 @@ int pcistb_service_call(S390CPU *cpu, uint8_t r1, uint8_t r3, uint64_t gaddr,
|
||||||
static int reg_irqs(CPUS390XState *env, S390PCIBusDevice *pbdev, ZpciFib fib)
|
static int reg_irqs(CPUS390XState *env, S390PCIBusDevice *pbdev, ZpciFib fib)
|
||||||
{
|
{
|
||||||
int ret, len;
|
int ret, len;
|
||||||
|
uint8_t isc = FIB_DATA_ISC(ldl_p(&fib.data));
|
||||||
|
|
||||||
ret = css_register_io_adapter(S390_PCIPT_ADAPTER,
|
pbdev->routes.adapter.adapter_id = css_get_adapter_id(
|
||||||
FIB_DATA_ISC(ldl_p(&fib.data)), true, false,
|
CSS_IO_ADAPTER_PCI, isc);
|
||||||
&pbdev->routes.adapter.adapter_id);
|
|
||||||
assert(ret == 0);
|
|
||||||
|
|
||||||
pbdev->summary_ind = get_indicator(ldq_p(&fib.aisb), sizeof(uint64_t));
|
pbdev->summary_ind = get_indicator(ldq_p(&fib.aisb), sizeof(uint64_t));
|
||||||
len = BITS_TO_LONGS(FIB_DATA_NOI(ldl_p(&fib.data))) * sizeof(unsigned long);
|
len = BITS_TO_LONGS(FIB_DATA_NOI(ldl_p(&fib.data))) * sizeof(unsigned long);
|
||||||
pbdev->indicator = get_indicator(ldq_p(&fib.aibv), len);
|
pbdev->indicator = get_indicator(ldq_p(&fib.aibv), len);
|
||||||
|
@ -755,7 +755,7 @@ static int reg_irqs(CPUS390XState *env, S390PCIBusDevice *pbdev, ZpciFib fib)
|
||||||
pbdev->routes.adapter.summary_offset = FIB_DATA_AISBO(ldl_p(&fib.data));
|
pbdev->routes.adapter.summary_offset = FIB_DATA_AISBO(ldl_p(&fib.data));
|
||||||
pbdev->routes.adapter.ind_addr = ldq_p(&fib.aibv);
|
pbdev->routes.adapter.ind_addr = ldq_p(&fib.aibv);
|
||||||
pbdev->routes.adapter.ind_offset = FIB_DATA_AIBVO(ldl_p(&fib.data));
|
pbdev->routes.adapter.ind_offset = FIB_DATA_AIBVO(ldl_p(&fib.data));
|
||||||
pbdev->isc = FIB_DATA_ISC(ldl_p(&fib.data));
|
pbdev->isc = isc;
|
||||||
pbdev->noi = FIB_DATA_NOI(ldl_p(&fib.data));
|
pbdev->noi = FIB_DATA_NOI(ldl_p(&fib.data));
|
||||||
pbdev->sum = FIB_DATA_SUM(ldl_p(&fib.data));
|
pbdev->sum = FIB_DATA_SUM(ldl_p(&fib.data));
|
||||||
|
|
||||||
|
|
|
@ -113,12 +113,13 @@ static void ccw_init(MachineState *machine)
|
||||||
s390_sclp_init();
|
s390_sclp_init();
|
||||||
s390_memory_init(machine->ram_size);
|
s390_memory_init(machine->ram_size);
|
||||||
|
|
||||||
|
s390_flic_init();
|
||||||
|
|
||||||
/* get a BUS */
|
/* get a BUS */
|
||||||
css_bus = virtual_css_bus_init();
|
css_bus = virtual_css_bus_init();
|
||||||
s390_init_ipl_dev(machine->kernel_filename, machine->kernel_cmdline,
|
s390_init_ipl_dev(machine->kernel_filename, machine->kernel_cmdline,
|
||||||
machine->initrd_filename, "s390-ccw.img",
|
machine->initrd_filename, "s390-ccw.img",
|
||||||
"s390-netboot.img", true);
|
"s390-netboot.img", true);
|
||||||
s390_flic_init();
|
|
||||||
|
|
||||||
dev = qdev_create(NULL, TYPE_S390_PCI_HOST_BRIDGE);
|
dev = qdev_create(NULL, TYPE_S390_PCI_HOST_BRIDGE);
|
||||||
object_property_add_child(qdev_get_machine(), TYPE_S390_PCI_HOST_BRIDGE,
|
object_property_add_child(qdev_get_machine(), TYPE_S390_PCI_HOST_BRIDGE,
|
||||||
|
@ -336,6 +337,9 @@ static const TypeInfo ccw_machine_info = {
|
||||||
} \
|
} \
|
||||||
type_init(ccw_machine_register_##suffix)
|
type_init(ccw_machine_register_##suffix)
|
||||||
|
|
||||||
|
#define CCW_COMPAT_2_9 \
|
||||||
|
HW_COMPAT_2_9
|
||||||
|
|
||||||
#define CCW_COMPAT_2_8 \
|
#define CCW_COMPAT_2_8 \
|
||||||
HW_COMPAT_2_8 \
|
HW_COMPAT_2_8 \
|
||||||
{\
|
{\
|
||||||
|
@ -402,14 +406,26 @@ static const TypeInfo ccw_machine_info = {
|
||||||
.value = "0",\
|
.value = "0",\
|
||||||
},
|
},
|
||||||
|
|
||||||
|
static void ccw_machine_2_10_instance_options(MachineState *machine)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ccw_machine_2_10_class_options(MachineClass *mc)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
DEFINE_CCW_MACHINE(2_10, "2.10", true);
|
||||||
|
|
||||||
static void ccw_machine_2_9_instance_options(MachineState *machine)
|
static void ccw_machine_2_9_instance_options(MachineState *machine)
|
||||||
{
|
{
|
||||||
|
ccw_machine_2_10_instance_options(machine);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ccw_machine_2_9_class_options(MachineClass *mc)
|
static void ccw_machine_2_9_class_options(MachineClass *mc)
|
||||||
{
|
{
|
||||||
|
ccw_machine_2_10_class_options(mc);
|
||||||
|
SET_MACHINE_COMPAT(mc, CCW_COMPAT_2_9);
|
||||||
}
|
}
|
||||||
DEFINE_CCW_MACHINE(2_9, "2.9", true);
|
DEFINE_CCW_MACHINE(2_9, "2.9", false);
|
||||||
|
|
||||||
static void ccw_machine_2_8_instance_options(MachineState *machine)
|
static void ccw_machine_2_8_instance_options(MachineState *machine)
|
||||||
{
|
{
|
||||||
|
|
|
@ -616,10 +616,9 @@ static int virtio_ccw_cb(SubchDev *sch, CCW1 ccw)
|
||||||
dev->routes.adapter.ind_offset = ind_bit;
|
dev->routes.adapter.ind_offset = ind_bit;
|
||||||
dev->routes.adapter.summary_offset = 7;
|
dev->routes.adapter.summary_offset = 7;
|
||||||
cpu_physical_memory_unmap(thinint, hw_len, 0, hw_len);
|
cpu_physical_memory_unmap(thinint, hw_len, 0, hw_len);
|
||||||
ret = css_register_io_adapter(CSS_IO_ADAPTER_VIRTIO,
|
dev->routes.adapter.adapter_id = css_get_adapter_id(
|
||||||
dev->thinint_isc, true, false,
|
CSS_IO_ADAPTER_VIRTIO,
|
||||||
&dev->routes.adapter.adapter_id);
|
dev->thinint_isc);
|
||||||
assert(ret == 0);
|
|
||||||
sch->thinint_active = ((dev->indicators != NULL) &&
|
sch->thinint_active = ((dev->indicators != NULL) &&
|
||||||
(dev->summary_indicator != NULL));
|
(dev->summary_indicator != NULL));
|
||||||
sch->curr_status.scsw.count = ccw.count - len;
|
sch->curr_status.scsw.count = ccw.count - len;
|
||||||
|
@ -680,7 +679,8 @@ static void virtio_ccw_device_realize(VirtioCcwDevice *dev, Error **errp)
|
||||||
{
|
{
|
||||||
VirtIOCCWDeviceClass *k = VIRTIO_CCW_DEVICE_GET_CLASS(dev);
|
VirtIOCCWDeviceClass *k = VIRTIO_CCW_DEVICE_GET_CLASS(dev);
|
||||||
CcwDevice *ccw_dev = CCW_DEVICE(dev);
|
CcwDevice *ccw_dev = CCW_DEVICE(dev);
|
||||||
SubchDev *sch = css_create_virtual_sch(ccw_dev->bus_id, errp);
|
CCWDeviceClass *ck = CCW_DEVICE_GET_CLASS(ccw_dev);
|
||||||
|
SubchDev *sch = css_create_virtual_sch(ccw_dev->devno, errp);
|
||||||
Error *err = NULL;
|
Error *err = NULL;
|
||||||
|
|
||||||
if (!sch) {
|
if (!sch) {
|
||||||
|
@ -689,8 +689,7 @@ static void virtio_ccw_device_realize(VirtioCcwDevice *dev, Error **errp)
|
||||||
if (!virtio_ccw_rev_max(dev) && dev->force_revision_1) {
|
if (!virtio_ccw_rev_max(dev) && dev->force_revision_1) {
|
||||||
error_setg(&err, "Invalid value of property max_rev "
|
error_setg(&err, "Invalid value of property max_rev "
|
||||||
"(is %d expected >= 1)", virtio_ccw_rev_max(dev));
|
"(is %d expected >= 1)", virtio_ccw_rev_max(dev));
|
||||||
error_propagate(errp, err);
|
goto out_err;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sch->driver_data = dev;
|
sch->driver_data = dev;
|
||||||
|
@ -705,7 +704,7 @@ static void virtio_ccw_device_realize(VirtioCcwDevice *dev, Error **errp)
|
||||||
|
|
||||||
trace_virtio_ccw_new_device(
|
trace_virtio_ccw_new_device(
|
||||||
sch->cssid, sch->ssid, sch->schid, sch->devno,
|
sch->cssid, sch->ssid, sch->schid, sch->devno,
|
||||||
ccw_dev->bus_id.valid ? "user-configured" : "auto-configured");
|
ccw_dev->devno.valid ? "user-configured" : "auto-configured");
|
||||||
|
|
||||||
if (!kvm_eventfds_enabled()) {
|
if (!kvm_eventfds_enabled()) {
|
||||||
dev->flags &= ~VIRTIO_CCW_FLAG_USE_IOEVENTFD;
|
dev->flags &= ~VIRTIO_CCW_FLAG_USE_IOEVENTFD;
|
||||||
|
@ -713,13 +712,23 @@ static void virtio_ccw_device_realize(VirtioCcwDevice *dev, Error **errp)
|
||||||
|
|
||||||
if (k->realize) {
|
if (k->realize) {
|
||||||
k->realize(dev, &err);
|
k->realize(dev, &err);
|
||||||
|
if (err) {
|
||||||
|
goto out_err;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ck->realize(ccw_dev, &err);
|
||||||
if (err) {
|
if (err) {
|
||||||
error_propagate(errp, err);
|
goto out_err;
|
||||||
css_subch_assign(sch->cssid, sch->ssid, sch->schid, sch->devno, NULL);
|
|
||||||
ccw_dev->sch = NULL;
|
|
||||||
g_free(sch);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
|
out_err:
|
||||||
|
error_propagate(errp, err);
|
||||||
|
css_subch_assign(sch->cssid, sch->ssid, sch->schid, sch->devno, NULL);
|
||||||
|
ccw_dev->sch = NULL;
|
||||||
|
g_free(sch);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int virtio_ccw_exit(VirtioCcwDevice *dev)
|
static int virtio_ccw_exit(VirtioCcwDevice *dev)
|
||||||
|
@ -1261,12 +1270,17 @@ static int virtio_ccw_load_config(DeviceState *d, QEMUFile *f)
|
||||||
{
|
{
|
||||||
VirtioCcwDevice *dev = VIRTIO_CCW_DEVICE(d);
|
VirtioCcwDevice *dev = VIRTIO_CCW_DEVICE(d);
|
||||||
CcwDevice *ccw_dev = CCW_DEVICE(d);
|
CcwDevice *ccw_dev = CCW_DEVICE(d);
|
||||||
|
CCWDeviceClass *ck = CCW_DEVICE_GET_CLASS(ccw_dev);
|
||||||
SubchDev *s = ccw_dev->sch;
|
SubchDev *s = ccw_dev->sch;
|
||||||
VirtIODevice *vdev = virtio_ccw_get_vdev(s);
|
VirtIODevice *vdev = virtio_ccw_get_vdev(s);
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
s->driver_data = dev;
|
s->driver_data = dev;
|
||||||
subch_device_load(s, f);
|
subch_device_load(s, f);
|
||||||
|
/* Re-fill subch_id after loading the subchannel states.*/
|
||||||
|
if (ck->refill_ids) {
|
||||||
|
ck->refill_ids(ccw_dev);
|
||||||
|
}
|
||||||
len = qemu_get_be32(f);
|
len = qemu_get_be32(f);
|
||||||
if (len != 0) {
|
if (len != 0) {
|
||||||
dev->indicators = get_indicator(qemu_get_be64(f), len);
|
dev->indicators = get_indicator(qemu_get_be64(f), len);
|
||||||
|
@ -1293,9 +1307,9 @@ static int virtio_ccw_load_config(DeviceState *d, QEMUFile *f)
|
||||||
dev->thinint_isc = qemu_get_byte(f);
|
dev->thinint_isc = qemu_get_byte(f);
|
||||||
dev->revision = qemu_get_be32(f);
|
dev->revision = qemu_get_be32(f);
|
||||||
if (s->thinint_active) {
|
if (s->thinint_active) {
|
||||||
return css_register_io_adapter(CSS_IO_ADAPTER_VIRTIO,
|
dev->routes.adapter.adapter_id = css_get_adapter_id(
|
||||||
dev->thinint_isc, true, false,
|
CSS_IO_ADAPTER_VIRTIO,
|
||||||
&dev->routes.adapter.adapter_id);
|
dev->thinint_isc);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1354,7 +1368,6 @@ static void virtio_ccw_device_unplugged(DeviceState *d)
|
||||||
/**************** Virtio-ccw Bus Device Descriptions *******************/
|
/**************** Virtio-ccw Bus Device Descriptions *******************/
|
||||||
|
|
||||||
static Property virtio_ccw_net_properties[] = {
|
static Property virtio_ccw_net_properties[] = {
|
||||||
DEFINE_PROP_CSS_DEV_ID("devno", VirtioCcwDevice, parent_obj.bus_id),
|
|
||||||
DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags,
|
DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags,
|
||||||
VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true),
|
VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true),
|
||||||
DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
|
DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
|
||||||
|
@ -1383,7 +1396,6 @@ static const TypeInfo virtio_ccw_net = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static Property virtio_ccw_blk_properties[] = {
|
static Property virtio_ccw_blk_properties[] = {
|
||||||
DEFINE_PROP_CSS_DEV_ID("devno", VirtioCcwDevice, parent_obj.bus_id),
|
|
||||||
DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags,
|
DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags,
|
||||||
VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true),
|
VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true),
|
||||||
DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
|
DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
|
||||||
|
@ -1412,7 +1424,6 @@ static const TypeInfo virtio_ccw_blk = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static Property virtio_ccw_serial_properties[] = {
|
static Property virtio_ccw_serial_properties[] = {
|
||||||
DEFINE_PROP_CSS_DEV_ID("devno", VirtioCcwDevice, parent_obj.bus_id),
|
|
||||||
DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags,
|
DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags,
|
||||||
VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true),
|
VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true),
|
||||||
DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
|
DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
|
||||||
|
@ -1441,7 +1452,6 @@ static const TypeInfo virtio_ccw_serial = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static Property virtio_ccw_balloon_properties[] = {
|
static Property virtio_ccw_balloon_properties[] = {
|
||||||
DEFINE_PROP_CSS_DEV_ID("devno", VirtioCcwDevice, parent_obj.bus_id),
|
|
||||||
DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags,
|
DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags,
|
||||||
VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true),
|
VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true),
|
||||||
DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
|
DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
|
||||||
|
@ -1470,7 +1480,6 @@ static const TypeInfo virtio_ccw_balloon = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static Property virtio_ccw_scsi_properties[] = {
|
static Property virtio_ccw_scsi_properties[] = {
|
||||||
DEFINE_PROP_CSS_DEV_ID("devno", VirtioCcwDevice, parent_obj.bus_id),
|
|
||||||
DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags,
|
DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags,
|
||||||
VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true),
|
VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true),
|
||||||
DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
|
DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
|
||||||
|
@ -1500,7 +1509,6 @@ static const TypeInfo virtio_ccw_scsi = {
|
||||||
|
|
||||||
#ifdef CONFIG_VHOST_SCSI
|
#ifdef CONFIG_VHOST_SCSI
|
||||||
static Property vhost_ccw_scsi_properties[] = {
|
static Property vhost_ccw_scsi_properties[] = {
|
||||||
DEFINE_PROP_CSS_DEV_ID("devno", VirtioCcwDevice, parent_obj.bus_id),
|
|
||||||
DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
|
DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
|
||||||
VIRTIO_CCW_MAX_REV),
|
VIRTIO_CCW_MAX_REV),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
|
@ -1538,7 +1546,6 @@ static void virtio_ccw_rng_instance_init(Object *obj)
|
||||||
}
|
}
|
||||||
|
|
||||||
static Property virtio_ccw_rng_properties[] = {
|
static Property virtio_ccw_rng_properties[] = {
|
||||||
DEFINE_PROP_CSS_DEV_ID("devno", VirtioCcwDevice, parent_obj.bus_id),
|
|
||||||
DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags,
|
DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags,
|
||||||
VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true),
|
VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true),
|
||||||
DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
|
DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
|
||||||
|
@ -1567,7 +1574,6 @@ static const TypeInfo virtio_ccw_rng = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static Property virtio_ccw_crypto_properties[] = {
|
static Property virtio_ccw_crypto_properties[] = {
|
||||||
DEFINE_PROP_CSS_DEV_ID("devno", VirtioCcwDevice, parent_obj.bus_id),
|
|
||||||
DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags,
|
DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags,
|
||||||
VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true),
|
VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true),
|
||||||
DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
|
DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
|
||||||
|
@ -1694,7 +1700,6 @@ static const TypeInfo virtio_ccw_bus_info = {
|
||||||
|
|
||||||
#ifdef CONFIG_VIRTFS
|
#ifdef CONFIG_VIRTFS
|
||||||
static Property virtio_ccw_9p_properties[] = {
|
static Property virtio_ccw_9p_properties[] = {
|
||||||
DEFINE_PROP_CSS_DEV_ID("devno", VirtioCcwDevice, parent_obj.bus_id),
|
|
||||||
DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags,
|
DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags,
|
||||||
VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true),
|
VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true),
|
||||||
DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
|
DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
|
||||||
|
@ -1743,7 +1748,6 @@ static const TypeInfo virtio_ccw_9p_info = {
|
||||||
#ifdef CONFIG_VHOST_VSOCK
|
#ifdef CONFIG_VHOST_VSOCK
|
||||||
|
|
||||||
static Property vhost_vsock_ccw_properties[] = {
|
static Property vhost_vsock_ccw_properties[] = {
|
||||||
DEFINE_PROP_CSS_DEV_ID("devno", VirtioCcwDevice, parent_obj.bus_id),
|
|
||||||
DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
|
DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
|
||||||
VIRTIO_CCW_MAX_REV),
|
VIRTIO_CCW_MAX_REV),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
#ifndef HW_COMPAT_H
|
#ifndef HW_COMPAT_H
|
||||||
#define HW_COMPAT_H
|
#define HW_COMPAT_H
|
||||||
|
|
||||||
|
#define HW_COMPAT_2_9 \
|
||||||
|
/* empty */
|
||||||
|
|
||||||
#define HW_COMPAT_2_8 \
|
#define HW_COMPAT_2_8 \
|
||||||
{\
|
{\
|
||||||
.driver = "fw_cfg_mem",\
|
.driver = "fw_cfg_mem",\
|
||||||
|
|
|
@ -23,6 +23,8 @@
|
||||||
#define MAX_CSSID 255
|
#define MAX_CSSID 255
|
||||||
#define MAX_CHPID 255
|
#define MAX_CHPID 255
|
||||||
|
|
||||||
|
#define MAX_ISC 7
|
||||||
|
|
||||||
#define MAX_CIWS 62
|
#define MAX_CIWS 62
|
||||||
|
|
||||||
#define VIRTUAL_CSSID 0xfe
|
#define VIRTUAL_CSSID 0xfe
|
||||||
|
@ -124,9 +126,15 @@ void css_generate_css_crws(uint8_t cssid);
|
||||||
void css_clear_sei_pending(void);
|
void css_clear_sei_pending(void);
|
||||||
void css_adapter_interrupt(uint8_t isc);
|
void css_adapter_interrupt(uint8_t isc);
|
||||||
|
|
||||||
#define CSS_IO_ADAPTER_VIRTIO 1
|
typedef enum {
|
||||||
int css_register_io_adapter(uint8_t type, uint8_t isc, bool swap,
|
CSS_IO_ADAPTER_VIRTIO = 0,
|
||||||
bool maskable, uint32_t *id);
|
CSS_IO_ADAPTER_PCI = 1,
|
||||||
|
CSS_IO_ADAPTER_TYPE_NUMS,
|
||||||
|
} CssIoAdapterType;
|
||||||
|
|
||||||
|
uint32_t css_get_adapter_id(CssIoAdapterType type, uint8_t isc);
|
||||||
|
void css_register_io_adapters(CssIoAdapterType type, bool swap, bool maskable,
|
||||||
|
Error **errp);
|
||||||
|
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
SubchDev *css_find_subch(uint8_t m, uint8_t cssid, uint8_t ssid,
|
SubchDev *css_find_subch(uint8_t m, uint8_t cssid, uint8_t ssid,
|
||||||
|
@ -172,6 +180,11 @@ extern PropertyInfo css_devid_propinfo;
|
||||||
#define DEFINE_PROP_CSS_DEV_ID(_n, _s, _f) \
|
#define DEFINE_PROP_CSS_DEV_ID(_n, _s, _f) \
|
||||||
DEFINE_PROP(_n, _s, _f, css_devid_propinfo, CssDevId)
|
DEFINE_PROP(_n, _s, _f, css_devid_propinfo, CssDevId)
|
||||||
|
|
||||||
|
extern PropertyInfo css_devid_ro_propinfo;
|
||||||
|
|
||||||
|
#define DEFINE_PROP_CSS_DEV_ID_RO(_n, _s, _f) \
|
||||||
|
DEFINE_PROP(_n, _s, _f, css_devid_ro_propinfo, CssDevId)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a subchannel for the given bus id.
|
* Create a subchannel for the given bus id.
|
||||||
*
|
*
|
||||||
|
|
|
@ -376,12 +376,12 @@ static void cpu_model_from_info(S390CPUModel *model, const CpuModelInfo *info,
|
||||||
|
|
||||||
static void qdict_add_disabled_feat(const char *name, void *opaque)
|
static void qdict_add_disabled_feat(const char *name, void *opaque)
|
||||||
{
|
{
|
||||||
qdict_put((QDict *) opaque, name, qbool_from_bool(false));
|
qdict_put(opaque, name, qbool_from_bool(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qdict_add_enabled_feat(const char *name, void *opaque)
|
static void qdict_add_enabled_feat(const char *name, void *opaque)
|
||||||
{
|
{
|
||||||
qdict_put((QDict *) opaque, name, qbool_from_bool(true));
|
qdict_put(opaque, name, qbool_from_bool(true));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* convert S390CPUDef into a static CpuModelInfo */
|
/* convert S390CPUDef into a static CpuModelInfo */
|
||||||
|
|
|
@ -47,16 +47,16 @@
|
||||||
#include "exec/memattrs.h"
|
#include "exec/memattrs.h"
|
||||||
#include "hw/s390x/s390-virtio-ccw.h"
|
#include "hw/s390x/s390-virtio-ccw.h"
|
||||||
|
|
||||||
/* #define DEBUG_KVM */
|
#ifndef DEBUG_KVM
|
||||||
|
#define DEBUG_KVM 0
|
||||||
#ifdef DEBUG_KVM
|
|
||||||
#define DPRINTF(fmt, ...) \
|
|
||||||
do { fprintf(stderr, fmt, ## __VA_ARGS__); } while (0)
|
|
||||||
#else
|
|
||||||
#define DPRINTF(fmt, ...) \
|
|
||||||
do { } while (0)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define DPRINTF(fmt, ...) do { \
|
||||||
|
if (DEBUG_KVM) { \
|
||||||
|
fprintf(stderr, fmt, ## __VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
} while (0);
|
||||||
|
|
||||||
#define kvm_vm_check_mem_attr(s, attr) \
|
#define kvm_vm_check_mem_attr(s, attr) \
|
||||||
kvm_vm_check_attr(s, KVM_S390_VM_MEM_CTRL, attr)
|
kvm_vm_check_attr(s, KVM_S390_VM_MEM_CTRL, attr)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue