[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2] Add infrastructure for QIDL-based device seriali
From: |
Michael Roth |
Subject: |
[Qemu-devel] [PATCH v2] Add infrastructure for QIDL-based device serialization |
Date: |
Fri, 21 Sep 2012 09:07:23 -0500 |
These patches are based are origin/master, and can also be obtained from:
git://github.com/mdroth/qemu.git qidl-base-v2
Changes since v1:
- Simplified declaration format for QIDL-fied structures (Anthony, Blue)
- Documentations fix-ups and clarifications (Eric, Peter)
- Reduced build-time impact of QIDL by scanning for a QIDL_ENABLED()
directive in .c files before running them through the
the preprocessor and QIDL parser, and using a Makefile-set cflag
to avoid declaring QIDL-related code/structures for files that don't
include the directive.
- Moved lexer functionality into a standalone lexer class, simplified
interface to avoid the need to track offsets into the token stream.
- Fixed an issue when deserializing a static array of structs using the
new visit_type_carray() interfaces
- Included a fix for a qom-fuse bug caused by multiple threads contending
for QMP responses
- Added brief descriptions of annotations to qidl.h
- Minor clean-ups to the QIDL parser code
Changes since rfc v2:
- Parser/Codegen fix-ups for cases encountered converting piix ide and usb.
- Fixed license headers.
- Stricter arg-checking for QIDL macros when passing to codegen.
- Renamed QAPI visit_*_array interfaces to visit_*_carray to clarify that
these are serialization routines for single-dimension C arrays.
These patches add infrastructure and unit tests for QIDL, which provides
a serialization framework for QEMU device structures by generating visitor
routines for device structs based on simple field annotations. Examples of
how this is done are included in patch 17, but, for brevity, a sample struct
such as this:
typedef struct SerialDevice {
SysBusDevice parent;
uint8_t thr; /* transmit holding register */
uint8_t lsr; /* line status register */
uint8_t ier; /* interrupt enable register */
int int_pending; /* whether we have a pending queued interrupt */
CharDriverState *chr; /* backend */
} SerialDevice;
can now be made serializable with the following changes:
typedef struct SerialDevice SerialDevice;
QIDL_DECLARE(SerialDevice) {
SysBusDevice parent;
uint8_t thr; /* transmit holding register */
uint8_t lsr; /* line status register */
uint8_t ier; /* interrupt enable register */
int int_pending qDerived; /* whether we have a pending queued interrupt
*/
CharDriverState *chr qImmutable; /* backend */
};
To make use of generated visitor code, and .c file need only call the
QIDL_ENABLE() somewhere in the code body, which will then give it access to
visitor routines for any QIDL-ified device structures in that file, or included
from other files. These routines can then be used for
serialization/deserialization of the device state in a manner suitable for tasks
such as introspection/testing (generally via a r/w 'state' QOM property) or
migration.
The overall goal is to expose all migrateable device state in this manner so
that we can decouple serialization duties from savevm/VMState and convert them
into a stable, code-agnostic wire protocol, relying instead on intermediate
translation routines to handle the work of massaging serialized state into a
format suitable for the wire and vice-versa.
The following WIP branch contains the first set of QIDL conversions:
https://github.com/mdroth/qemu/commits/qidl
So far i440fx, pcibus, cirrus_vga, uhci, rtc, and isa/piix ide have been
converted, and I'm hoping to have most common PC devices converted over
within the next few weeks.
Please review. Comments/suggestions are very welcome.
Makefile | 26 +-
QMP/qom-fuse | 39 ++-
docs/qidl.txt | 347 +++++++++++++++++++
hw/qdev-properties.h | 151 ++++++++
hw/qdev.h | 126 +------
module.h | 2 +
qapi/Makefile.objs | 1 +
qapi/misc-qapi-visit.c | 14 +
qapi/qapi-visit-core.c | 25 ++
qapi/qapi-visit-core.h | 11 +
qapi/qmp-input-visitor.c | 32 +-
qapi/qmp-output-visitor.c | 20 ++
qidl.h | 113 ++++++
rules.mak | 20 +-
scripts/lexer.py | 306 ++++++++++++++++
scripts/qapi-visit.py | 364 -------------------
scripts/qapi.py | 10 +-
scripts/{qapi-commands.py => qapi_commands.py} | 8 +-
scripts/{qapi-types.py => qapi_types.py} | 2 +-
scripts/qapi_visit.py | 443 ++++++++++++++++++++++++
scripts/qidl.py | 281 +++++++++++++++
scripts/qidl_parser.py | 262 ++++++++++++++
tests/Makefile | 20 +-
tests/test-qidl-included.h | 31 ++
tests/test-qidl-linked.c | 93 +++++
tests/test-qidl-linked.h | 18 +
tests/test-qidl.c | 187 ++++++++++
vl.c | 1 +
28 files changed, 2425 insertions(+), 528 deletions(-)
- [Qemu-devel] [PATCH v2] Add infrastructure for QIDL-based device serialization,
Michael Roth <=
- [Qemu-devel] [PATCH 03/22] qapi: qapi-commands.py -> qapi_commands.py, Michael Roth, 2012/09/21
- [Qemu-devel] [PATCH 01/22] qapi: qapi-visit.py -> qapi_visit.py so we can import, Michael Roth, 2012/09/21
- [Qemu-devel] [PATCH 04/22] qapi: qapi_visit.py, make code useable as module, Michael Roth, 2012/09/21
- [Qemu-devel] [PATCH 02/22] qapi: qapi-types.py -> qapi_types.py, Michael Roth, 2012/09/21
- [Qemu-devel] [PATCH 09/22] qapi: QmpOutputVisitor, implement array handling, Michael Roth, 2012/09/21
- [Qemu-devel] [PATCH 08/22] qapi: add visitor interfaces for C arrays, Michael Roth, 2012/09/21
- [Qemu-devel] [PATCH 07/22] qapi: qapi_visit.py, support for visiting non-pointer/embedded structs, Michael Roth, 2012/09/21
- [Qemu-devel] [PATCH 06/22] qapi: qapi_visit.py, support generating static functions, Michael Roth, 2012/09/21
- [Qemu-devel] [PATCH 05/22] qapi: qapi_visit.py, support arrays and complex qapi definitions, Michael Roth, 2012/09/21
- [Qemu-devel] [PATCH 11/22] qapi: qapi.py, make json parser more robust, Michael Roth, 2012/09/21