From fd506b4f61cd22793f8c54a9adf5c69345792501 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Sun, 7 Apr 2013 19:08:16 +0000 Subject: pseries: Convert VIO code to QOM style type safe(ish) casts Curerntly the pseries VIO device code contains quite a few explicit uses of DO_UPCAST and plain C casts. This is (obviously) type unsafe, and not the conventional way of doing things in the QOM model. This patch converts the code to use the QOM convention of per-type macros to do verified casts with OBJECT_CHECK(). Signed-off-by: David Gibson Signed-off-by: Alexander Graf --- hw/scsi/spapr_vscsi.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'hw/scsi') diff --git a/hw/scsi/spapr_vscsi.c b/hw/scsi/spapr_vscsi.c index 999a463a84..3d322d5d1e 100644 --- a/hw/scsi/spapr_vscsi.c +++ b/hw/scsi/spapr_vscsi.c @@ -91,6 +91,9 @@ typedef struct vscsi_req { int total_desc; } vscsi_req; +#define TYPE_VIO_SPAPR_VSCSI_DEVICE "spapr-vscsi" +#define VIO_SPAPR_VSCSI_DEVICE(obj) \ + OBJECT_CHECK(VSCSIState, (obj), TYPE_VIO_SPAPR_VSCSI_DEVICE) typedef struct { VIOsPAPRDevice vdev; @@ -461,7 +464,7 @@ static int vscsi_preprocess_desc(vscsi_req *req) /* Callback to indicate that the SCSI layer has completed a transfer. */ static void vscsi_transfer_data(SCSIRequest *sreq, uint32_t len) { - VSCSIState *s = DO_UPCAST(VSCSIState, vdev.qdev, sreq->bus->qbus.parent); + VSCSIState *s = VIO_SPAPR_VSCSI_DEVICE(sreq->bus->qbus.parent); vscsi_req *req = sreq->hba_private; uint8_t *buf; int rc = 0; @@ -492,7 +495,7 @@ static void vscsi_transfer_data(SCSIRequest *sreq, uint32_t len) /* Callback to indicate that the SCSI layer has completed a transfer. */ static void vscsi_command_complete(SCSIRequest *sreq, uint32_t status, size_t resid) { - VSCSIState *s = DO_UPCAST(VSCSIState, vdev.qdev, sreq->bus->qbus.parent); + VSCSIState *s = VIO_SPAPR_VSCSI_DEVICE(sreq->bus->qbus.parent); vscsi_req *req = sreq->hba_private; int32_t res_in = 0, res_out = 0; @@ -827,7 +830,7 @@ static void vscsi_got_payload(VSCSIState *s, vscsi_crq *crq) static int vscsi_do_crq(struct VIOsPAPRDevice *dev, uint8_t *crq_data) { - VSCSIState *s = DO_UPCAST(VSCSIState, vdev, dev); + VSCSIState *s = VIO_SPAPR_VSCSI_DEVICE(dev); vscsi_crq crq; memcpy(crq.raw, crq_data, 16); @@ -897,7 +900,7 @@ static const struct SCSIBusInfo vscsi_scsi_info = { static void spapr_vscsi_reset(VIOsPAPRDevice *dev) { - VSCSIState *s = DO_UPCAST(VSCSIState, vdev, dev); + VSCSIState *s = VIO_SPAPR_VSCSI_DEVICE(dev); int i; memset(s->reqs, 0, sizeof(s->reqs)); @@ -908,7 +911,7 @@ static void spapr_vscsi_reset(VIOsPAPRDevice *dev) static int spapr_vscsi_init(VIOsPAPRDevice *dev) { - VSCSIState *s = DO_UPCAST(VSCSIState, vdev, dev); + VSCSIState *s = VIO_SPAPR_VSCSI_DEVICE(dev); dev->crq.SendFunc = vscsi_do_crq; @@ -968,7 +971,7 @@ static void spapr_vscsi_class_init(ObjectClass *klass, void *data) } static const TypeInfo spapr_vscsi_info = { - .name = "spapr-vscsi", + .name = TYPE_VIO_SPAPR_VSCSI_DEVICE, .parent = TYPE_VIO_SPAPR_DEVICE, .instance_size = sizeof(VSCSIState), .class_init = spapr_vscsi_class_init, -- cgit v1.2.1