From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:58785) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Sd1Dp-0004sE-7l for qemu-devel@nongnu.org; Fri, 08 Jun 2012 11:35:39 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Sd1Dh-0005Qi-Q5 for qemu-devel@nongnu.org; Fri, 08 Jun 2012 11:35:32 -0400 Received: from cantor2.suse.de ([195.135.220.15]:55331 helo=mx2.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Sd1Dh-0005QR-DC for qemu-devel@nongnu.org; Fri, 08 Jun 2012 11:35:25 -0400 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= Date: Fri, 8 Jun 2012 17:35:06 +0200 Message-Id: <1339169713-31205-2-git-send-email-afaerber@suse.de> In-Reply-To: <1339169713-31205-1-git-send-email-afaerber@suse.de> References: <1339169713-31205-1-git-send-email-afaerber@suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH 1/8] qapi: Add Visitor interfaces for uint*_t and int*_t List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Laszlo Ersek , Michael Roth , Anthony Liguori , =?UTF-8?q?Andreas=20F=C3=A4rber?= From: Michael Roth This adds visitor interfaces for fixed-width integers types. Implementing these in visitors is optional, otherwise we fall back to visit_type_int() (int64_t) with some additional bounds checking to avoid integer overflows for cases where the value fetched exceeds the bounds of our target C type. Signed-off-by: Michael Roth Signed-off-by: Paolo Bonzini [LE: exclude negative values in uint*_t Visitor interfaces] Signed-off-by: Laszlo Ersek [AF: Merged fix by Laszlo] Signed-off-by: Andreas F=C3=A4rber --- hw/mc146818rtc.c | 7 --- qapi/qapi-visit-core.c | 139 ++++++++++++++++++++++++++++++++++++++++++= ++++++ qapi/qapi-visit-core.h | 16 ++++++ 3 files changed, 155 insertions(+), 7 deletions(-) diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c index 9c64e0a..3777f85 100644 --- a/hw/mc146818rtc.c +++ b/hw/mc146818rtc.c @@ -599,13 +599,6 @@ static const MemoryRegionOps cmos_ops =3D { .old_portio =3D cmos_portio }; =20 -// FIXME add int32 visitor -static void visit_type_int32(Visitor *v, int *value, const char *name, E= rror **errp) -{ - int64_t val =3D *value; - visit_type_int(v, &val, name, errp); -} - static void rtc_get_date(Object *obj, Visitor *v, void *opaque, const char *name, Error **errp) { diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c index a4e088c..ffffbf7 100644 --- a/qapi/qapi-visit-core.c +++ b/qapi/qapi-visit-core.c @@ -97,6 +97,145 @@ void visit_type_int(Visitor *v, int64_t *obj, const c= har *name, Error **errp) } } =20 +void visit_type_uint8(Visitor *v, uint8_t *obj, const char *name, Error = **errp) +{ + int64_t value; + if (!error_is_set(errp)) { + if (v->type_uint8) { + v->type_uint8(v, obj, name, errp); + } else { + value =3D *obj; + v->type_int(v, &value, name, errp); + if (value < 0 || value > UINT8_MAX) { + error_set(errp, QERR_INVALID_PARAMETER_VALUE, name ? nam= e : "null", + "uint8_t"); + return; + } + *obj =3D value; + } + } +} + +void visit_type_uint16(Visitor *v, uint16_t *obj, const char *name, Erro= r **errp) +{ + int64_t value; + if (!error_is_set(errp)) { + if (v->type_uint16) { + v->type_uint16(v, obj, name, errp); + } else { + value =3D *obj; + v->type_int(v, &value, name, errp); + if (value < 0 || value > UINT16_MAX) { + error_set(errp, QERR_INVALID_PARAMETER_VALUE, name ? nam= e : "null", + "uint16_t"); + return; + } + *obj =3D value; + } + } +} + +void visit_type_uint32(Visitor *v, uint32_t *obj, const char *name, Erro= r **errp) +{ + int64_t value; + if (!error_is_set(errp)) { + if (v->type_uint32) { + v->type_uint32(v, obj, name, errp); + } else { + value =3D *obj; + v->type_int(v, &value, name, errp); + if (value < 0 || value > UINT32_MAX) { + error_set(errp, QERR_INVALID_PARAMETER_VALUE, name ? nam= e : "null", + "uint32_t"); + return; + } + *obj =3D value; + } + } +} + +void visit_type_uint64(Visitor *v, uint64_t *obj, const char *name, Erro= r **errp) +{ + int64_t value; + if (!error_is_set(errp)) { + if (v->type_uint64) { + v->type_uint64(v, obj, name, errp); + } else { + value =3D *obj; + v->type_int(v, &value, name, errp); + *obj =3D value; + } + } +} + +void visit_type_int8(Visitor *v, int8_t *obj, const char *name, Error **= errp) +{ + int64_t value; + if (!error_is_set(errp)) { + if (v->type_int8) { + v->type_int8(v, obj, name, errp); + } else { + value =3D *obj; + v->type_int(v, &value, name, errp); + if (value < INT8_MIN || value > INT8_MAX) { + error_set(errp, QERR_INVALID_PARAMETER_VALUE, name ? nam= e : "null", + "int8_t"); + return; + } + *obj =3D value; + } + } +} + +void visit_type_int16(Visitor *v, int16_t *obj, const char *name, Error = **errp) +{ + int64_t value; + if (!error_is_set(errp)) { + if (v->type_int16) { + v->type_int16(v, obj, name, errp); + } else { + value =3D *obj; + v->type_int(v, &value, name, errp); + if (value < INT16_MIN || value > INT16_MAX) { + error_set(errp, QERR_INVALID_PARAMETER_VALUE, name ? nam= e : "null", + "int16_t"); + return; + } + *obj =3D value; + } + } +} + +void visit_type_int32(Visitor *v, int32_t *obj, const char *name, Error = **errp) +{ + int64_t value; + if (!error_is_set(errp)) { + if (v->type_int32) { + v->type_int32(v, obj, name, errp); + } else { + value =3D *obj; + v->type_int(v, &value, name, errp); + if (value < INT32_MIN || value > INT32_MAX) { + error_set(errp, QERR_INVALID_PARAMETER_VALUE, name ? nam= e : "null", + "int32_t"); + return; + } + *obj =3D value; + } + } +} + +void visit_type_int64(Visitor *v, int64_t *obj, const char *name, Error = **errp) +{ + if (!error_is_set(errp)) { + if (v->type_int64) { + v->type_int64(v, obj, name, errp); + } else { + v->type_int(v, obj, name, errp); + } + } +} + void visit_type_bool(Visitor *v, bool *obj, const char *name, Error **er= rp) { if (!error_is_set(errp)) { diff --git a/qapi/qapi-visit-core.h b/qapi/qapi-visit-core.h index e850746..a19d70c 100644 --- a/qapi/qapi-visit-core.h +++ b/qapi/qapi-visit-core.h @@ -52,6 +52,14 @@ struct Visitor void (*start_handle)(Visitor *v, void **obj, const char *kind, const char *name, Error **errp); void (*end_handle)(Visitor *v, Error **errp); + void (*type_uint8)(Visitor *v, uint8_t *obj, const char *name, Error= **errp); + void (*type_uint16)(Visitor *v, uint16_t *obj, const char *name, Err= or **errp); + void (*type_uint32)(Visitor *v, uint32_t *obj, const char *name, Err= or **errp); + void (*type_uint64)(Visitor *v, uint64_t *obj, const char *name, Err= or **errp); + void (*type_int8)(Visitor *v, int8_t *obj, const char *name, Error *= *errp); + void (*type_int16)(Visitor *v, int16_t *obj, const char *name, Error= **errp); + void (*type_int32)(Visitor *v, int32_t *obj, const char *name, Error= **errp); + void (*type_int64)(Visitor *v, int64_t *obj, const char *name, Error= **errp); }; =20 void visit_start_handle(Visitor *v, void **obj, const char *kind, @@ -69,6 +77,14 @@ void visit_end_optional(Visitor *v, Error **errp); void visit_type_enum(Visitor *v, int *obj, const char *strings[], const char *kind, const char *name, Error **errp); void visit_type_int(Visitor *v, int64_t *obj, const char *name, Error **= errp); +void visit_type_uint8(Visitor *v, uint8_t *obj, const char *name, Error = **errp); +void visit_type_uint16(Visitor *v, uint16_t *obj, const char *name, Erro= r **errp); +void visit_type_uint32(Visitor *v, uint32_t *obj, const char *name, Erro= r **errp); +void visit_type_uint64(Visitor *v, uint64_t *obj, const char *name, Erro= r **errp); +void visit_type_int8(Visitor *v, int8_t *obj, const char *name, Error **= errp); +void visit_type_int16(Visitor *v, int16_t *obj, const char *name, Error = **errp); +void visit_type_int32(Visitor *v, int32_t *obj, const char *name, Error = **errp); +void visit_type_int64(Visitor *v, int64_t *obj, const char *name, Error = **errp); void visit_type_bool(Visitor *v, bool *obj, const char *name, Error **er= rp); void visit_type_str(Visitor *v, char **obj, const char *name, Error **er= rp); void visit_type_number(Visitor *v, double *obj, const char *name, Error = **errp); --=20 1.7.7