From nobody Fri Mar 29 12:33:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487673892499823.7302303468958; Tue, 21 Feb 2017 02:44:52 -0800 (PST) Received: from localhost ([::1]:43580 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cg7wA-0000SO-3D for importer@patchew.org; Tue, 21 Feb 2017 05:44:50 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48984) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cg7uQ-0007qp-Kl for qemu-devel@nongnu.org; Tue, 21 Feb 2017 05:43:04 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cg7uO-0002u3-GZ for qemu-devel@nongnu.org; Tue, 21 Feb 2017 05:43:02 -0500 Received: from mail-wm0-x242.google.com ([2a00:1450:400c:c09::242]:33184) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cg7uO-0002tp-6E for qemu-devel@nongnu.org; Tue, 21 Feb 2017 05:43:00 -0500 Received: by mail-wm0-x242.google.com with SMTP id v77so18936766wmv.0 for ; Tue, 21 Feb 2017 02:43:00 -0800 (PST) Received: from donizetti.lan (94-39-187-56.adsl-ull.clienti.tiscali.it. [94.39.187.56]) by smtp.gmail.com with ESMTPSA id u189sm17046499wmu.1.2017.02.21.02.42.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 21 Feb 2017 02:42:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=ZRV4cHGZr4M2hT+DWXt8qREwXzb/Zyy0bHfyLXu6uFc=; b=rgSBUrDt1oi6/ugO9/a9uYyEr96elD7IJNaKdW4JelGYPaP4DT94+ICk4BvZHOlprc KffhvHcjjwmQNrFeflo2i8I+iKo81C4GaJ5KCPOaWyTfEiYtZJZgV3bOLB/R4H/M0maj WG7UlT+MzA3y9HcbLAwtmUBOMzLuxyFzNIO42BwWm7II1VXh+/kdcONQ1gs+b1ZtVHYm jF4eO0Xo/ZWplPKa6XdjYOCe6Xvp6rZmun/4dKPws+4NXaA1iXFqx38uECdC+qlYUN8U zTWKDwkhYhnM12b4WNMFZ1zxq8nRkI90C4qxqusXI7purjzWhLoecGiQIaiLBJ0ctXT9 BYqQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=ZRV4cHGZr4M2hT+DWXt8qREwXzb/Zyy0bHfyLXu6uFc=; b=sEt958zE9t37EHlZ0aZB+ZyKDuPfQGoUEFEBQQQLLk8iyqv2IjE0mZap3+xQDeY6YF eCYPlW8m+L8mwWzVMLC+yLDq7y8qgPbL5/pPllvJTx8cQSgBNLyT3EQprVGI1z2dYvr2 BmcW/P7dPn5Idi+jT5/Qz87ZSnIZc0mJyOqFE9V8fbg9jMB1RcJBL8FZXIUvz0bx0ovM jKGHwcdvWIsIGixZc2KdGrMbOMt4rGRTpCX7NKNsNA4e1g2EKb8Q5ut5aewiYJGA9hOa HLfwLrGHyNPmoY/IXXyLYdbKBuLwlZk2mCOgedfvL7G4XSa9mpSC0iGfvGLtyU+uZ+et Prdg== X-Gm-Message-State: AMke39m4BwrOyDobowgGEaFSe4jI0n9Kd+1+BpQkZF0FjM6dxnwjHlkgebmSFyWt0Pem0A== X-Received: by 10.28.8.213 with SMTP id 204mr14125391wmi.100.1487673778870; Tue, 21 Feb 2017 02:42:58 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Tue, 21 Feb 2017 11:42:54 +0100 Message-Id: <20170221104256.5153-2-pbonzini@redhat.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170221104256.5153-1-pbonzini@redhat.com> References: <20170221104256.5153-1-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a00:1450:400c:c09::242 Subject: [Qemu-devel] [PATCH 1/3] qom-qobject: introduce object_property_{g, s}et_ptr X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: den@openvz.org, anton.nefedov@virtuozzo.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The functions simplify the handling of QOM properties whose type is a QAPI struct. They go through a QObject just like the other functions that access a QOM property through its C type. Like QAPI_CLONE, the functions are wrapped by macros that take a QAPI type name and use it to build the name of a visitor function. Signed-off-by: Paolo Bonzini --- include/qom/qom-qobject.h | 68 ++++++++++++ qom/qom-qobject.c | 49 +++++++++ tests/Makefile.include | 2 +- tests/check-qom-proplist.c | 185 ++++++++++++++++++++++++++++= +++- tests/qapi-schema/qapi-schema-test.json | 8 ++ 5 files changed, 309 insertions(+), 3 deletions(-) diff --git a/include/qom/qom-qobject.h b/include/qom/qom-qobject.h index 77cd717..ff1d307 100644 --- a/include/qom/qom-qobject.h +++ b/include/qom/qom-qobject.h @@ -39,4 +39,72 @@ struct QObject *object_property_get_qobject(Object *obj,= const char *name, void object_property_set_qobject(Object *obj, struct QObject *qobj, const char *name, struct Error **errp); =20 +/** + * object_property_get_ptr: + * @obj: the object + * @ptr: The C struct that will be written to the property. + * @name: the name of the property + * @visit_type: the visitor function for @ptr's type. + * @errp: returns an error if this function fails + * + * Return: the value of an object's property, unmarshaled into a C object + * through a QAPI type visitor, or NULL if an error occurs. + */ +void *object_property_get_ptr(Object *obj, const char *name, + void (*visit_type)(Visitor *, const char *, + void **, Error **), + Error **errp); + +/** + * OBJECT_PROPERTY_GET_PTR: + * @obj: the object + * @ptr: The C struct that will be written to the property. + * @name: the name of the property + * @type: the name of the C struct type pointed to by @ptr. + * @errp: returns an error if this function fails + * + * Return: the value of an object's property, unmarshaled into a C object + * through a QAPI type visitor, or NULL if an error occurs. + */ +#define OBJECT_PROPERTY_GET_PTR(obj, name, type, errp) = \ + ((type *) = \ + object_property_get_ptr(obj, name, = \ + (void (*)(Visitor *, const char *, void**, = \ + Error **))visit_type_ ## type, = \ + errp)) + +/** + * object_property_set_ptr: + * @obj: the object + * @ptr: The C struct that will be written to the property. + * @name: the name of the property + * @visit_type: the visitor function for @ptr's type. + * @errp: returns an error if this function fails + * + * Sets an object's property to a C object's value, using a QAPI + * type visitor to marshal the C struct into the object. + */ +void object_property_set_ptr(Object *obj, void *ptr, const char *name, + void (*visit_type)(Visitor *, const char *, + void **, Error **), + Error **errp); + +/** + * OBJECT_PROPERTY_SET_PTR: + * @obj: the object + * @ptr: The C struct that will be written to the property. + * @name: the name of the property + * @type: the name of the C struct type pointed to by @ptr. + * @errp: returns an error if this function fails + * + * Sets an object's property to a C object's value, using a QAPI + * type visitor to marshal the C struct into the object. + */ +#define OBJECT_PROPERTY_SET_PTR(obj, ptr, name, type, errp) = \ + object_property_set_ptr(obj, ptr + type_check(type, typeof(*ptr)), = \ + name, = \ + (void (*)(Visitor *, const char *, void**, = \ + Error **))visit_type_ ## type, = \ + errp) + #endif diff --git a/qom/qom-qobject.c b/qom/qom-qobject.c index 447e4a0..09a12e0 100644 --- a/qom/qom-qobject.c +++ b/qom/qom-qobject.c @@ -44,3 +44,52 @@ QObject *object_property_get_qobject(Object *obj, const = char *name, visit_free(v); return ret; } + +void object_property_set_ptr(Object *obj, void *ptr, const char *name, + void (*visit_type)(Visitor *, const char *, v= oid **, Error **), + Error **errp) +{ + Error *local_err =3D NULL; + QObject *ret =3D NULL; + Visitor *v; + v =3D qobject_output_visitor_new(&ret); + visit_type(v, name, &ptr, &local_err); + if (local_err) { + error_propagate(errp, local_err); + visit_free(v); + return; + } + visit_complete(v, &ret); + visit_free(v); + + /* Do not use object_property_set_qobject until we switch it + * to use qobject_input_visitor_new in strict mode. See the + * /qom/proplist/get-set-ptr/contravariant unit test. + */ + v =3D qobject_input_visitor_new(ret, true); + object_property_set(obj, v, name, errp); + visit_free(v); + qobject_decref(ret); +} + +void *object_property_get_ptr(Object *obj, const char *name, + void (*visit_type)(Visitor *, const char *, = void **, Error **), + Error **errp) +{ + QObject *ret; + Visitor *v; + void *ptr =3D NULL; + + ret =3D object_property_get_qobject(obj, name, errp); + if (!ret) { + return NULL; + } + + /* Do not enable strict mode to allow passing covariant + * data types. + */ + v =3D qobject_input_visitor_new(ret, false); + visit_type(v, name, &ptr, errp); + qobject_decref(ret); + return ptr; +} diff --git a/tests/Makefile.include b/tests/Makefile.include index 634394a..9de910b 100644 --- a/tests/Makefile.include +++ b/tests/Makefile.include @@ -515,7 +515,7 @@ tests/check-qfloat$(EXESUF): tests/check-qfloat.o $(tes= t-util-obj-y) tests/check-qnull$(EXESUF): tests/check-qnull.o $(test-util-obj-y) tests/check-qjson$(EXESUF): tests/check-qjson.o $(test-util-obj-y) tests/check-qom-interface$(EXESUF): tests/check-qom-interface.o $(test-qom= -obj-y) -tests/check-qom-proplist$(EXESUF): tests/check-qom-proplist.o $(test-qom-o= bj-y) +tests/check-qom-proplist$(EXESUF): tests/check-qom-proplist.o $(test-qom-o= bj-y) $(test-qapi-obj-y) =20 tests/test-char$(EXESUF): tests/test-char.o qemu-timer.o \ $(test-util-obj-y) $(qtest-obj-y) $(test-block-obj-y) $(chardev-obj-y) diff --git a/tests/check-qom-proplist.c b/tests/check-qom-proplist.c index a16cefc..e0ad880 100644 --- a/tests/check-qom-proplist.c +++ b/tests/check-qom-proplist.c @@ -22,8 +22,11 @@ =20 #include "qapi/error.h" #include "qom/object.h" +#include "qom/qom-qobject.h" #include "qemu/module.h" =20 +#include "test-qapi-types.h" +#include "test-qapi-visit.h" =20 #define TYPE_DUMMY "qemu-dummy" =20 @@ -56,6 +59,8 @@ struct DummyObject { bool bv; DummyAnimal av; char *sv; + + UserDefOne *qv; }; =20 struct DummyObjectClass { @@ -120,12 +125,42 @@ static char *dummy_get_sv(Object *obj, =20 static void dummy_init(Object *obj) { + DummyObject *dobj =3D DUMMY_OBJECT(obj); + object_property_add_bool(obj, "bv", dummy_get_bv, dummy_set_bv, NULL); + dobj->qv =3D g_new0(UserDefOne, 1); + dobj->qv->string =3D g_strdup("dummy string"); +} + + +static void dummy_get_qv(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + DummyObject *dobj =3D DUMMY_OBJECT(obj); + + visit_type_UserDefOne(v, name, &dobj->qv, errp); } =20 +static void dummy_set_qv(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + DummyObject *dobj =3D DUMMY_OBJECT(obj); + UserDefOne *qv =3D NULL; + Error *local_err =3D NULL; + + visit_type_UserDefOne(v, name, &qv, &local_err); + if (local_err) { + g_assert(qv =3D=3D NULL); + error_propagate(errp, local_err); + return; + } + + qapi_free_UserDefOne(dobj->qv); + dobj->qv =3D qv; +} =20 static void dummy_class_init(ObjectClass *cls, void *data) { @@ -143,6 +178,13 @@ static void dummy_class_init(ObjectClass *cls, void *d= ata) dummy_get_av, dummy_set_av, NULL); + object_class_property_add(cls, "qv", + "UserDefOne", + dummy_get_qv, + dummy_set_qv, + NULL, + NULL, + NULL); } =20 =20 @@ -151,9 +193,9 @@ static void dummy_finalize(Object *obj) DummyObject *dobj =3D DUMMY_OBJECT(obj); =20 g_free(dobj->sv); + qapi_free_UserDefOne(dobj->qv); } =20 - static const TypeInfo dummy_info =3D { .name =3D TYPE_DUMMY, .parent =3D TYPE_OBJECT, @@ -473,7 +515,8 @@ static void test_dummy_iterator(void) =20 ObjectProperty *prop; ObjectPropertyIterator iter; - bool seenbv =3D false, seensv =3D false, seenav =3D false, seentype; + bool seenbv =3D false, seensv =3D false, seenav =3D false; + bool seenqv =3D false, seentype =3D false; =20 object_property_iter_init(&iter, OBJECT(dobj)); while ((prop =3D object_property_iter_next(&iter))) { @@ -483,6 +526,8 @@ static void test_dummy_iterator(void) seensv =3D true; } else if (g_str_equal(prop->name, "av")) { seenav =3D true; + } else if (g_str_equal(prop->name, "qv")) { + seenqv =3D true; } else if (g_str_equal(prop->name, "type")) { /* This prop comes from the base Object class */ seentype =3D true; @@ -494,6 +539,7 @@ static void test_dummy_iterator(void) g_assert(seenbv); g_assert(seenav); g_assert(seensv); + g_assert(seenqv); g_assert(seentype); =20 object_unparent(OBJECT(dobj)); @@ -513,6 +559,137 @@ static void test_dummy_delchild(void) object_unparent(OBJECT(dev)); } =20 +static void test_dummy_get_set_ptr_struct(void) +{ + DummyObject *dobj =3D DUMMY_OBJECT(object_new(TYPE_DUMMY)); + Error *local_err =3D NULL; + const char *s =3D "my other dummy string"; + UserDefOne *ret; + UserDefOne val; + + ret =3D OBJECT_PROPERTY_GET_PTR(OBJECT(dobj), "qv", + UserDefOne, &local_err); + g_assert(!local_err); + + g_assert_cmpint(ret->integer, =3D=3D, 0); + g_assert_cmpstr(ret->string, =3D=3D, "dummy string"); + g_assert(!ret->has_enum1); + qapi_free_UserDefOne(ret); + + val.integer =3D 42; + val.string =3D g_strdup(s); + val.has_enum1 =3D true; + val.enum1 =3D ENUM_ONE_VALUE1; + OBJECT_PROPERTY_SET_PTR(OBJECT(dobj), &val, "qv", + UserDefOne, &local_err); + g_assert(!local_err); + + ret =3D OBJECT_PROPERTY_GET_PTR(OBJECT(dobj), "qv", + UserDefOne, &local_err); + g_assert(!local_err); + + g_assert_cmpint(ret->integer, =3D=3D, val.integer); + g_assert_cmpstr(ret->string, =3D=3D, val.string); + g_assert(ret->has_enum1); + g_assert_cmpint(ret->enum1, =3D=3D, val.enum1); + g_free(val.string); + qapi_free_UserDefOne(ret); +} + +static void test_dummy_get_set_ptr_contravariant(void) +{ + DummyObject *dobj =3D DUMMY_OBJECT(object_new(TYPE_DUMMY)); + Error *local_err =3D NULL; + UserDefOneMore *ret; + UserDefOneMore val; + + /* You cannot retrieve a contravariant (subclass) type... */ + ret =3D OBJECT_PROPERTY_GET_PTR(OBJECT(dobj), "qv", + UserDefOneMore, &local_err); + g_assert(local_err); + g_assert(!ret); + error_free(local_err); + local_err =3D NULL; + + /* And you cannot set one either. */ + val.integer =3D 42; + val.string =3D g_strdup("unused"); + val.has_enum1 =3D false; + val.boolean =3D false; + + OBJECT_PROPERTY_SET_PTR(OBJECT(dobj), &val, "qv", + UserDefOneMore, &local_err); + g_assert(local_err); +} + +static void test_dummy_get_set_ptr_covariant(void) +{ + DummyObject *dobj =3D DUMMY_OBJECT(object_new(TYPE_DUMMY)); + Error *local_err =3D NULL; + UserDefZero *ret; + UserDefZero val; + + /* You can retrieve a covariant (superclass) type... */ + ret =3D OBJECT_PROPERTY_GET_PTR(OBJECT(dobj), "qv", + UserDefZero, &local_err); + g_assert(!local_err); + + g_assert_cmpint(ret->integer, =3D=3D, 0); + qapi_free_UserDefZero(ret); + + /* But you cannot set one. */ + val.integer =3D 42; + OBJECT_PROPERTY_SET_PTR(OBJECT(dobj), &val, "qv", + UserDefZero, &local_err); + g_assert(local_err); + error_free(local_err); + local_err =3D NULL; + + /* Test that the property has not been modified at all */ + ret =3D OBJECT_PROPERTY_GET_PTR(OBJECT(dobj), "qv", + UserDefZero, &local_err); + g_assert(!local_err); + + g_assert_cmpint(ret->integer, =3D=3D, 0); + qapi_free_UserDefZero(ret); +} + +static void test_dummy_get_set_ptr_error(void) +{ + DummyObject *dobj =3D DUMMY_OBJECT(object_new(TYPE_DUMMY)); + Error *local_err =3D NULL; + const char *s =3D "my other dummy string"; + UserDefOne *ret; + UserDefOne val; + + ret =3D OBJECT_PROPERTY_GET_PTR(OBJECT(dobj), "blah", + UserDefOne, &local_err); + g_assert(local_err); + g_assert(!ret); + error_free(local_err); + local_err =3D NULL; + + val.integer =3D 42; + val.string =3D g_strdup(s); + val.has_enum1 =3D true; + val.enum1 =3D 100; + OBJECT_PROPERTY_SET_PTR(OBJECT(dobj), &val, "qv", + UserDefOne, &local_err); + g_assert(local_err); + error_free(local_err); + local_err =3D NULL; + + ret =3D OBJECT_PROPERTY_GET_PTR(OBJECT(dobj), "qv", + UserDefOne, &local_err); + g_assert(!local_err); + + /* Test that the property has not been modified at all */ + g_assert_cmpint(ret->integer, =3D=3D, 0); + g_assert_cmpstr(ret->string, =3D=3D, "dummy string"); + g_assert(!ret->has_enum1); + qapi_free_UserDefOne(ret); +} + int main(int argc, char **argv) { g_test_init(&argc, &argv, NULL); @@ -530,5 +707,9 @@ int main(int argc, char **argv) g_test_add_func("/qom/proplist/iterator", test_dummy_iterator); g_test_add_func("/qom/proplist/delchild", test_dummy_delchild); =20 + g_test_add_func("/qom/proplist/get-set-ptr/struct", test_dummy_get_set= _ptr_struct); + g_test_add_func("/qom/proplist/get-set-ptr/error", test_dummy_get_set_= ptr_error); + g_test_add_func("/qom/proplist/get-set-ptr/covariant", test_dummy_get_= set_ptr_covariant); + g_test_add_func("/qom/proplist/get-set-ptr/contravariant", test_dummy_= get_set_ptr_contravariant); return g_test_run(); } diff --git a/tests/qapi-schema/qapi-schema-test.json b/tests/qapi-schema/qa= pi-schema-test.json index f4d8cc4..4e3f6ff 100644 --- a/tests/qapi-schema/qapi-schema-test.json +++ b/tests/qapi-schema/qapi-schema-test.json @@ -91,6 +91,14 @@ '*enum1': 'EnumOne' } } # intentional forward reference =20 ## +# @UserDefOneMore: +# for testing nested structs +## +{ 'struct': 'UserDefOneMore', + 'base': 'UserDefOne', + 'data': { 'boolean': 'bool' } } + +## # @EnumOne: ## { 'enum': 'EnumOne', --=20 2.9.3 From nobody Fri Mar 29 12:33:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487674124347937.1212023292178; Tue, 21 Feb 2017 02:48:44 -0800 (PST) Received: from localhost ([::1]:43604 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cg7zu-0003hH-5F for importer@patchew.org; Tue, 21 Feb 2017 05:48:42 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48968) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cg7uP-0007qV-W4 for qemu-devel@nongnu.org; Tue, 21 Feb 2017 05:43:03 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cg7uP-0002uD-4z for qemu-devel@nongnu.org; Tue, 21 Feb 2017 05:43:02 -0500 Received: from mail-wr0-x242.google.com ([2a00:1450:400c:c0c::242]:34322) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cg7uO-0002tz-Vk for qemu-devel@nongnu.org; Tue, 21 Feb 2017 05:43:01 -0500 Received: by mail-wr0-x242.google.com with SMTP id 89so8078186wrr.1 for ; Tue, 21 Feb 2017 02:43:00 -0800 (PST) Received: from donizetti.lan (94-39-187-56.adsl-ull.clienti.tiscali.it. [94.39.187.56]) by smtp.gmail.com with ESMTPSA id u189sm17046499wmu.1.2017.02.21.02.42.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 21 Feb 2017 02:42:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=nX9yCX79eDGbQiy2rBG+BvXTcFCy+KsHLXOckNU3jd0=; b=VqbzHDkSJsIzTB2E/fqHPgXTJ8kItBHSwlzuccDkIN2Ihik7djx4UIWs0UQ673w9Qj byF4TJyEQ5djtDooZMaUfmoAfSHJatSMlVIBdwyLc4n7lrD171sa32W3zzL9fmpnjTsW lI4v6bJLuggkWM8AkxEcpS4isRgqy7qslM8PsqdP5IAbuprwEShCazCzxHbeEiHGwaec 7Mnl3050TrLNWf6C8cps7/Y0ZdYlIwUe3ouYis1lAVoLic9TQTVuf8LSWxV98lQpHp40 YLcUv5FsPAQ7ivxnnndnB2SRj8ne2PyxjfPNPR7CRsD33EvDCJ1o0i+55JLeYcO7JO0e zp7w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=nX9yCX79eDGbQiy2rBG+BvXTcFCy+KsHLXOckNU3jd0=; b=YfI3P59RH/kiLQKjuSq78O5MnTa63MD5vvRNXexidQerLIyICw8Lh02MUTTXpBsv3L xacyTRmttTmQUg/KoWAALwmZBOq0xZm08w0ArcNBXNvWFos9NmGfk/+2mUT745TyFaKw ehB2F2hWAL9sJe98cHQWBsAI8p/S7BCjoZ1s7PFiJHP4yCisg4Aix0+a80pn/Gze2xAo 9MKnKT1VObJwgL3pWLAB08ScmsEaDILr698OKsvjbXydGz6bYls2KqACRLSFzVukoOhq gQgA2uyWODRQiGYkz4H7qaLIsfuVewWzC6jNyj0G4eApitgeM03flpptS59G02fnNIGg UgEw== X-Gm-Message-State: AMke39nficcybg5/e1rH0qPcLG5vUnuHr4o42LVmIRh+Em8MVkXYUZsTrqhQpCHNMNZzqg== X-Received: by 10.223.162.133 with SMTP id s5mr20808210wra.157.1487673779990; Tue, 21 Feb 2017 02:42:59 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Tue, 21 Feb 2017 11:42:55 +0100 Message-Id: <20170221104256.5153-3-pbonzini@redhat.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170221104256.5153-1-pbonzini@redhat.com> References: <20170221104256.5153-1-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a00:1450:400c:c0c::242 Subject: [Qemu-devel] [PATCH 2/3] cpu: implement get_crash_info through QOM properties X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: den@openvz.org, anton.nefedov@virtuozzo.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Provide a generic implementation for all CPU subclasses. Signed-off-by: Paolo Bonzini Reviewed-by: Eric Blake --- include/qom/cpu.h | 1 - qom/cpu.c | 11 ++++------- target/i386/cpu.c | 2 +- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/include/qom/cpu.h b/include/qom/cpu.h index 1bc3ad2..04d3a2c 100644 --- a/include/qom/cpu.h +++ b/include/qom/cpu.h @@ -158,7 +158,6 @@ typedef struct CPUClass { uint8_t *buf, int len, bool is_write); void (*dump_state)(CPUState *cpu, FILE *f, fprintf_function cpu_fprint= f, int flags); - GuestPanicInformation* (*get_crash_info)(CPUState *cpu); void (*dump_statistics)(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf, int flags); int64_t (*get_arch_id)(CPUState *cpu); diff --git a/qom/cpu.c b/qom/cpu.c index 7e005af..a9482ce 100644 --- a/qom/cpu.c +++ b/qom/cpu.c @@ -22,6 +22,8 @@ #include "qapi/error.h" #include "qemu-common.h" #include "qom/cpu.h" +#include "qom/qom-qobject.h" +#include "qapi-visit.h" #include "sysemu/hw_accel.h" #include "qemu/notify.h" #include "qemu/log.h" @@ -220,13 +222,8 @@ static bool cpu_common_exec_interrupt(CPUState *cpu, i= nt int_req) =20 GuestPanicInformation *cpu_get_crash_info(CPUState *cpu) { - CPUClass *cc =3D CPU_GET_CLASS(cpu); - GuestPanicInformation *res =3D NULL; - - if (cc->get_crash_info) { - res =3D cc->get_crash_info(cpu); - } - return res; + return OBJECT_PROPERTY_GET_PTR(OBJECT(cpu), "crash-information", + GuestPanicInformation, NULL); } =20 void cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf, diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 63be816..3071769 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -3516,6 +3516,7 @@ static GuestPanicInformation *x86_cpu_get_crash_info(= CPUState *cs) =20 return panic_info; } + static void x86_cpu_get_crash_info_qom(Object *obj, Visitor *v, const char *name, void *opaque, Error **errp) @@ -3731,7 +3732,6 @@ static void x86_cpu_common_class_init(ObjectClass *oc= , void *data) cc->do_interrupt =3D x86_cpu_do_interrupt; cc->cpu_exec_interrupt =3D x86_cpu_exec_interrupt; cc->dump_state =3D x86_cpu_dump_state; - cc->get_crash_info =3D x86_cpu_get_crash_info; cc->set_pc =3D x86_cpu_set_pc; cc->synchronize_from_tb =3D x86_cpu_synchronize_from_tb; cc->gdb_read_register =3D x86_cpu_gdb_read_register; --=20 2.9.3 From nobody Fri Mar 29 12:33:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487673893123653.9846508850195; Tue, 21 Feb 2017 02:44:53 -0800 (PST) Received: from localhost ([::1]:43581 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cg7w9-0000SY-H0 for importer@patchew.org; Tue, 21 Feb 2017 05:44:49 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48988) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cg7uQ-0007r2-Vz for qemu-devel@nongnu.org; Tue, 21 Feb 2017 05:43:03 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cg7uQ-0002uQ-1G for qemu-devel@nongnu.org; Tue, 21 Feb 2017 05:43:03 -0500 Received: from mail-wm0-x242.google.com ([2a00:1450:400c:c09::242]:35952) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cg7uP-0002uH-RQ for qemu-devel@nongnu.org; Tue, 21 Feb 2017 05:43:01 -0500 Received: by mail-wm0-x242.google.com with SMTP id r18so18944817wmd.3 for ; Tue, 21 Feb 2017 02:43:01 -0800 (PST) Received: from donizetti.lan (94-39-187-56.adsl-ull.clienti.tiscali.it. [94.39.187.56]) by smtp.gmail.com with ESMTPSA id u189sm17046499wmu.1.2017.02.21.02.43.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 21 Feb 2017 02:43:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=n5K40q4SCd1CcwiaQ+ap9krMPvG5Ad9uAF6/CDqAjqQ=; b=rwYaRtt9D1G/yhN9YmmVqhXzThC/ei0VhM+sFLFivFnrK/8RA1WcWBejp6OarWfopz 2Y4GISXYgODBLqbxI13DqMTowtZhwZUeo1h8CrpNQ+hU/ORGH0hrSnOhO0Dd32oKaXRA wW+v0ZjCXFDU4D+Jphv4uWeGJlczjZNC/goThd67fybzyiXCg8ratVVn4SPmlj0vsFYG g5YJhkEFsFrYSQayF0S4p/exTW5qqedYdjXqe7L9B7OUGGehJN+IuuV9JFuJSTDc8rAD CVv6N4nKKtsFUNCkrmjC8D6AqbyYIY2xGBD3XrhpX+X2NuTnqHEtt3oaUYXbnUKrXT7/ R1Tw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=n5K40q4SCd1CcwiaQ+ap9krMPvG5Ad9uAF6/CDqAjqQ=; b=Ko3TNFvsrKZxfSljoALTfADCycmvJosoPg2S1QZDoDz9a1ez/nn6+a1ZwFMIeHKwKu CiOZ+O9ZCPHW90uUyTuGws4vSUSyICAPfGumcGSzx2AV45+NPGjqP0PlEKPJKQ0QIh16 kv7sgSsnvbgdxhVTbC8vnkZUWJTeT/d0DGeweas610M38FUD8LzzOsF6pyoXnVnCnNal 2wJHyBTL6pLZK8xbRmZMUB9LFepkcEjySvIIz0to93/08/VmCf2l5eZKw72piEAtdSVl y7W5B3sggwwm8u6/nDOHS+2suGW8vvGIpR8qKlkvbs26rj8xCNlKeCdj185qNCMJWLQo O9FQ== X-Gm-Message-State: AMke39n8q/5QXBbfGs6YG56+ps79P+a5Ax/rW0jS2dGeMcY8ctt+z/OEQMel7IRCDK/mDg== X-Received: by 10.28.150.194 with SMTP id y185mr25298224wmd.47.1487673780900; Tue, 21 Feb 2017 02:43:00 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Tue, 21 Feb 2017 11:42:56 +0100 Message-Id: <20170221104256.5153-4-pbonzini@redhat.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170221104256.5153-1-pbonzini@redhat.com> References: <20170221104256.5153-1-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a00:1450:400c:c09::242 Subject: [Qemu-devel] [PATCH 3/3] vl: pass CPUState to qemu_system_guest_panicked X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: den@openvz.org, anton.nefedov@virtuozzo.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" qemu_system_guest_panicked was already using current_cpu implicitly, so it makes sense for it to receive a CPUState. This lets the function call cpu_get_crash_info and free the result. Signed-off-by: Paolo Bonzini Reviewed-by: Eric Blake --- include/sysemu/sysemu.h | 2 +- kvm-all.c | 2 +- vl.c | 13 ++++++++++--- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h index 576c7ce..a02f53a 100644 --- a/include/sysemu/sysemu.h +++ b/include/sysemu/sysemu.h @@ -66,7 +66,7 @@ int qemu_shutdown_requested_get(void); int qemu_reset_requested_get(void); void qemu_system_killed(int signal, pid_t pid); void qemu_system_reset(bool report); -void qemu_system_guest_panicked(GuestPanicInformation *info); +void qemu_system_guest_panicked(CPUState *cpu); size_t qemu_target_page_bits(void); =20 void qemu_add_exit_notifier(Notifier *notify); diff --git a/kvm-all.c b/kvm-all.c index 7ad20b7..edecef0 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -2071,7 +2071,7 @@ int kvm_cpu_exec(CPUState *cpu) case KVM_SYSTEM_EVENT_CRASH: kvm_cpu_synchronize_state(cpu); qemu_mutex_lock_iothread(); - qemu_system_guest_panicked(cpu_get_crash_info(cpu)); + qemu_system_guest_panicked(cpu); qemu_mutex_unlock_iothread(); ret =3D 0; break; diff --git a/vl.c b/vl.c index d8b9dec..2de75ce 100644 --- a/vl.c +++ b/vl.c @@ -1679,13 +1679,20 @@ void qemu_system_reset(bool report) cpu_synchronize_all_post_reset(); } =20 -void qemu_system_guest_panicked(GuestPanicInformation *info) +void qemu_system_guest_panicked(CPUState *cpu) { + GuestPanicInformation *info =3D NULL; + qemu_log_mask(LOG_GUEST_ERROR, "Guest crashed\n"); =20 - if (current_cpu) { - current_cpu->crash_occurred =3D true; + if (!cpu) { + cpu =3D current_cpu; + } + if (cpu) { + cpu->crash_occurred =3D true; + info =3D cpu_get_crash_info(cpu); } + qapi_event_send_guest_panicked(GUEST_PANIC_ACTION_PAUSE, !!info, info, &error_abort); vm_stop(RUN_STATE_GUEST_PANICKED); --=20 2.9.3