1067109a1SAlex Bennée.. _qom: 2067109a1SAlex Bennée 3cd442a45SEduardo Habkost=========================== 4cd442a45SEduardo HabkostThe QEMU Object Model (QOM) 5cd442a45SEduardo Habkost=========================== 6cd442a45SEduardo Habkost 79cb54b18SPaolo Bonzini.. highlight:: c 89cb54b18SPaolo Bonzini 99cb54b18SPaolo BonziniThe QEMU Object Model provides a framework for registering user creatable 109cb54b18SPaolo Bonzinitypes and instantiating objects from those types. QOM provides the following 119cb54b18SPaolo Bonzinifeatures: 129cb54b18SPaolo Bonzini 139cb54b18SPaolo Bonzini- System for dynamically registering types 149cb54b18SPaolo Bonzini- Support for single-inheritance of types 159cb54b18SPaolo Bonzini- Multiple inheritance of stateless interfaces 1643398409SAlex Bennée- Mapping internal members to publicly exposed properties 1743398409SAlex Bennée 1843398409SAlex BennéeThe root object class is TYPE_OBJECT which provides for the basic 1943398409SAlex Bennéeobject methods. 2043398409SAlex Bennée 2143398409SAlex BennéeThe QOM tree 2243398409SAlex Bennée============ 2343398409SAlex Bennée 2443398409SAlex BennéeThe QOM tree is a composition tree which represents all of the objects 2543398409SAlex Bennéethat make up a QEMU "machine". You can view this tree by running 2643398409SAlex Bennée``info qom-tree`` in the :ref:`QEMU monitor`. It will contain both 2743398409SAlex Bennéeobjects created by the machine itself as well those created due to 2843398409SAlex Bennéeuser configuration. 2943398409SAlex Bennée 3043398409SAlex BennéeCreating a QOM class 3143398409SAlex Bennée==================== 3243398409SAlex Bennée 33313e1629SStefan WeilA simple minimal device implementation may look something like below: 349cb54b18SPaolo Bonzini 359cb54b18SPaolo Bonzini.. code-block:: c 369cb54b18SPaolo Bonzini :caption: Creating a minimal type 379cb54b18SPaolo Bonzini 389cb54b18SPaolo Bonzini #include "qdev.h" 399cb54b18SPaolo Bonzini 409cb54b18SPaolo Bonzini #define TYPE_MY_DEVICE "my-device" 419cb54b18SPaolo Bonzini 429cb54b18SPaolo Bonzini // No new virtual functions: we can reuse the typedef for the 439cb54b18SPaolo Bonzini // superclass. 449cb54b18SPaolo Bonzini typedef DeviceClass MyDeviceClass; 459cb54b18SPaolo Bonzini typedef struct MyDevice 469cb54b18SPaolo Bonzini { 47307c0a4aSPhilippe Mathieu-Daudé DeviceState parent_obj; 489cb54b18SPaolo Bonzini 499cb54b18SPaolo Bonzini int reg0, reg1, reg2; 509cb54b18SPaolo Bonzini } MyDevice; 519cb54b18SPaolo Bonzini 529cb54b18SPaolo Bonzini static const TypeInfo my_device_info = { 539cb54b18SPaolo Bonzini .name = TYPE_MY_DEVICE, 549cb54b18SPaolo Bonzini .parent = TYPE_DEVICE, 559cb54b18SPaolo Bonzini .instance_size = sizeof(MyDevice), 569cb54b18SPaolo Bonzini }; 579cb54b18SPaolo Bonzini 589cb54b18SPaolo Bonzini static void my_device_register_types(void) 599cb54b18SPaolo Bonzini { 609cb54b18SPaolo Bonzini type_register_static(&my_device_info); 619cb54b18SPaolo Bonzini } 629cb54b18SPaolo Bonzini 639cb54b18SPaolo Bonzini type_init(my_device_register_types) 649cb54b18SPaolo Bonzini 659cb54b18SPaolo BonziniIn the above example, we create a simple type that is described by #TypeInfo. 669cb54b18SPaolo Bonzini#TypeInfo describes information about the type including what it inherits 679cb54b18SPaolo Bonzinifrom, the instance and class size, and constructor/destructor hooks. 689cb54b18SPaolo Bonzini 6943398409SAlex BennéeThe TYPE_DEVICE class is the parent class for all modern devices 7043398409SAlex Bennéeimplemented in QEMU and adds some specific methods to handle QEMU 7143398409SAlex Bennéedevice model. This includes managing the lifetime of devices from 7243398409SAlex Bennéecreation through to when they become visible to the guest and 7343398409SAlex Bennéeeventually unrealized. 7443398409SAlex Bennée 759cb54b18SPaolo BonziniAlternatively several static types could be registered using helper macro 769cb54b18SPaolo BonziniDEFINE_TYPES() 779cb54b18SPaolo Bonzini 789cb54b18SPaolo Bonzini.. code-block:: c 799cb54b18SPaolo Bonzini 809cb54b18SPaolo Bonzini static const TypeInfo device_types_info[] = { 819cb54b18SPaolo Bonzini { 829cb54b18SPaolo Bonzini .name = TYPE_MY_DEVICE_A, 839cb54b18SPaolo Bonzini .parent = TYPE_DEVICE, 849cb54b18SPaolo Bonzini .instance_size = sizeof(MyDeviceA), 859cb54b18SPaolo Bonzini }, 869cb54b18SPaolo Bonzini { 879cb54b18SPaolo Bonzini .name = TYPE_MY_DEVICE_B, 889cb54b18SPaolo Bonzini .parent = TYPE_DEVICE, 899cb54b18SPaolo Bonzini .instance_size = sizeof(MyDeviceB), 909cb54b18SPaolo Bonzini }, 919cb54b18SPaolo Bonzini }; 929cb54b18SPaolo Bonzini 939cb54b18SPaolo Bonzini DEFINE_TYPES(device_types_info) 949cb54b18SPaolo Bonzini 959cb54b18SPaolo BonziniEvery type has an #ObjectClass associated with it. #ObjectClass derivatives 969cb54b18SPaolo Bonziniare instantiated dynamically but there is only ever one instance for any 979cb54b18SPaolo Bonzinigiven type. The #ObjectClass typically holds a table of function pointers 989cb54b18SPaolo Bonzinifor the virtual methods implemented by this type. 999cb54b18SPaolo Bonzini 1009cb54b18SPaolo BonziniUsing object_new(), a new #Object derivative will be instantiated. You can 1019cb54b18SPaolo Bonzinicast an #Object to a subclass (or base-class) type using 1029cb54b18SPaolo Bonziniobject_dynamic_cast(). You typically want to define macro wrappers around 1039cb54b18SPaolo BonziniOBJECT_CHECK() and OBJECT_CLASS_CHECK() to make it easier to convert to a 1049cb54b18SPaolo Bonzinispecific type: 1059cb54b18SPaolo Bonzini 1069cb54b18SPaolo Bonzini.. code-block:: c 1079cb54b18SPaolo Bonzini :caption: Typecasting macros 1089cb54b18SPaolo Bonzini 1099cb54b18SPaolo Bonzini #define MY_DEVICE_GET_CLASS(obj) \ 1109cb54b18SPaolo Bonzini OBJECT_GET_CLASS(MyDeviceClass, obj, TYPE_MY_DEVICE) 1119cb54b18SPaolo Bonzini #define MY_DEVICE_CLASS(klass) \ 1129cb54b18SPaolo Bonzini OBJECT_CLASS_CHECK(MyDeviceClass, klass, TYPE_MY_DEVICE) 1139cb54b18SPaolo Bonzini #define MY_DEVICE(obj) \ 1149cb54b18SPaolo Bonzini OBJECT_CHECK(MyDevice, obj, TYPE_MY_DEVICE) 1159cb54b18SPaolo Bonzini 116e95b135fSGerd HoffmannIn case the ObjectClass implementation can be built as module a 117e95b135fSGerd Hoffmannmodule_obj() line must be added to make sure qemu loads the module 118e95b135fSGerd Hoffmannwhen the object is needed. 119e95b135fSGerd Hoffmann 120e95b135fSGerd Hoffmann.. code-block:: c 121e95b135fSGerd Hoffmann 122e95b135fSGerd Hoffmann module_obj(TYPE_MY_DEVICE); 123e95b135fSGerd Hoffmann 1249cb54b18SPaolo BonziniClass Initialization 12543398409SAlex Bennée-------------------- 1269cb54b18SPaolo Bonzini 1279cb54b18SPaolo BonziniBefore an object is initialized, the class for the object must be 1289cb54b18SPaolo Bonziniinitialized. There is only one class object for all instance objects 1299cb54b18SPaolo Bonzinithat is created lazily. 1309cb54b18SPaolo Bonzini 1319cb54b18SPaolo BonziniClasses are initialized by first initializing any parent classes (if 1329cb54b18SPaolo Bonzininecessary). After the parent class object has initialized, it will be 1339cb54b18SPaolo Bonzinicopied into the current class object and any additional storage in the 1349cb54b18SPaolo Bonziniclass object is zero filled. 1359cb54b18SPaolo Bonzini 1369cb54b18SPaolo BonziniThe effect of this is that classes automatically inherit any virtual 1379cb54b18SPaolo Bonzinifunction pointers that the parent class has already initialized. All 1389cb54b18SPaolo Bonziniother fields will be zero filled. 1399cb54b18SPaolo Bonzini 1409cb54b18SPaolo BonziniOnce all of the parent classes have been initialized, #TypeInfo::class_init 1419cb54b18SPaolo Bonziniis called to let the class being instantiated provide default initialize for 1429cb54b18SPaolo Bonziniits virtual functions. Here is how the above example might be modified 1439cb54b18SPaolo Bonzinito introduce an overridden virtual function: 1449cb54b18SPaolo Bonzini 1459cb54b18SPaolo Bonzini.. code-block:: c 1469cb54b18SPaolo Bonzini :caption: Overriding a virtual function 1479cb54b18SPaolo Bonzini 1489cb54b18SPaolo Bonzini #include "qdev.h" 1499cb54b18SPaolo Bonzini 1509cb54b18SPaolo Bonzini void my_device_class_init(ObjectClass *klass, void *class_data) 1519cb54b18SPaolo Bonzini { 1529cb54b18SPaolo Bonzini DeviceClass *dc = DEVICE_CLASS(klass); 1539cb54b18SPaolo Bonzini dc->reset = my_device_reset; 1549cb54b18SPaolo Bonzini } 1559cb54b18SPaolo Bonzini 1569cb54b18SPaolo Bonzini static const TypeInfo my_device_info = { 1579cb54b18SPaolo Bonzini .name = TYPE_MY_DEVICE, 1589cb54b18SPaolo Bonzini .parent = TYPE_DEVICE, 1599cb54b18SPaolo Bonzini .instance_size = sizeof(MyDevice), 1609cb54b18SPaolo Bonzini .class_init = my_device_class_init, 1619cb54b18SPaolo Bonzini }; 1629cb54b18SPaolo Bonzini 1639cb54b18SPaolo BonziniIntroducing new virtual methods requires a class to define its own 1649cb54b18SPaolo Bonzinistruct and to add a .class_size member to the #TypeInfo. Each method 1659cb54b18SPaolo Bonziniwill also have a wrapper function to call it easily: 1669cb54b18SPaolo Bonzini 1679cb54b18SPaolo Bonzini.. code-block:: c 1689cb54b18SPaolo Bonzini :caption: Defining an abstract class 1699cb54b18SPaolo Bonzini 1709cb54b18SPaolo Bonzini #include "qdev.h" 1719cb54b18SPaolo Bonzini 1729cb54b18SPaolo Bonzini typedef struct MyDeviceClass 1739cb54b18SPaolo Bonzini { 174307c0a4aSPhilippe Mathieu-Daudé DeviceClass parent_class; 1759cb54b18SPaolo Bonzini 1769cb54b18SPaolo Bonzini void (*frobnicate) (MyDevice *obj); 1779cb54b18SPaolo Bonzini } MyDeviceClass; 1789cb54b18SPaolo Bonzini 1799cb54b18SPaolo Bonzini static const TypeInfo my_device_info = { 1809cb54b18SPaolo Bonzini .name = TYPE_MY_DEVICE, 1819cb54b18SPaolo Bonzini .parent = TYPE_DEVICE, 1829cb54b18SPaolo Bonzini .instance_size = sizeof(MyDevice), 1839cb54b18SPaolo Bonzini .abstract = true, // or set a default in my_device_class_init 1849cb54b18SPaolo Bonzini .class_size = sizeof(MyDeviceClass), 1859cb54b18SPaolo Bonzini }; 1869cb54b18SPaolo Bonzini 1879cb54b18SPaolo Bonzini void my_device_frobnicate(MyDevice *obj) 1889cb54b18SPaolo Bonzini { 1899cb54b18SPaolo Bonzini MyDeviceClass *klass = MY_DEVICE_GET_CLASS(obj); 1909cb54b18SPaolo Bonzini 1919cb54b18SPaolo Bonzini klass->frobnicate(obj); 1929cb54b18SPaolo Bonzini } 1939cb54b18SPaolo Bonzini 1949cb54b18SPaolo BonziniInterfaces 19543398409SAlex Bennée---------- 1969cb54b18SPaolo Bonzini 1979cb54b18SPaolo BonziniInterfaces allow a limited form of multiple inheritance. Instances are 1989cb54b18SPaolo Bonzinisimilar to normal types except for the fact that are only defined by 1999cb54b18SPaolo Bonzinitheir classes and never carry any state. As a consequence, a pointer to 2009cb54b18SPaolo Bonzinian interface instance should always be of incomplete type in order to be 2019cb54b18SPaolo Bonzinisure it cannot be dereferenced. That is, you should define the 2029cb54b18SPaolo Bonzini'typedef struct SomethingIf SomethingIf' so that you can pass around 2039cb54b18SPaolo Bonzini``SomethingIf *si`` arguments, but not define a ``struct SomethingIf { ... }``. 2049cb54b18SPaolo BonziniThe only things you can validly do with a ``SomethingIf *`` are to pass it as 2059cb54b18SPaolo Bonzinian argument to a method on its corresponding SomethingIfClass, or to 2069cb54b18SPaolo Bonzinidynamically cast it to an object that implements the interface. 2079cb54b18SPaolo Bonzini 2089cb54b18SPaolo BonziniMethods 20943398409SAlex Bennée------- 2109cb54b18SPaolo Bonzini 211acc34c21SEduardo HabkostA *method* is a function within the namespace scope of 2129cb54b18SPaolo Bonzinia class. It usually operates on the object instance by passing it as a 2139cb54b18SPaolo Bonzinistrongly-typed first argument. 2149cb54b18SPaolo BonziniIf it does not operate on an object instance, it is dubbed 215acc34c21SEduardo Habkost*class method*. 2169cb54b18SPaolo Bonzini 2179cb54b18SPaolo BonziniMethods cannot be overloaded. That is, the #ObjectClass and method name 2189cb54b18SPaolo Bonziniuniquely identity the function to be called; the signature does not vary 2199cb54b18SPaolo Bonziniexcept for trailing varargs. 2209cb54b18SPaolo Bonzini 221acc34c21SEduardo HabkostMethods are always *virtual*. Overriding a method in 2229cb54b18SPaolo Bonzini#TypeInfo.class_init of a subclass leads to any user of the class obtained 2239cb54b18SPaolo Bonzinivia OBJECT_GET_CLASS() accessing the overridden function. 2249cb54b18SPaolo BonziniThe original function is not automatically invoked. It is the responsibility 2259cb54b18SPaolo Bonziniof the overriding class to determine whether and when to invoke the method 2269cb54b18SPaolo Bonzinibeing overridden. 2279cb54b18SPaolo Bonzini 2289cb54b18SPaolo BonziniTo invoke the method being overridden, the preferred solution is to store 2299cb54b18SPaolo Bonzinithe original value in the overriding class before overriding the method. 2309cb54b18SPaolo BonziniThis corresponds to ``{super,base}.method(...)`` in Java and C# 2319cb54b18SPaolo Bonzinirespectively; this frees the overriding class from hardcoding its parent 2329cb54b18SPaolo Bonziniclass, which someone might choose to change at some point. 2339cb54b18SPaolo Bonzini 2349cb54b18SPaolo Bonzini.. code-block:: c 2359cb54b18SPaolo Bonzini :caption: Overriding a virtual method 2369cb54b18SPaolo Bonzini 2379cb54b18SPaolo Bonzini typedef struct MyState MyState; 2389cb54b18SPaolo Bonzini 2399cb54b18SPaolo Bonzini typedef void (*MyDoSomething)(MyState *obj); 2409cb54b18SPaolo Bonzini 2419cb54b18SPaolo Bonzini typedef struct MyClass { 2429cb54b18SPaolo Bonzini ObjectClass parent_class; 2439cb54b18SPaolo Bonzini 2449cb54b18SPaolo Bonzini MyDoSomething do_something; 2459cb54b18SPaolo Bonzini } MyClass; 2469cb54b18SPaolo Bonzini 2479cb54b18SPaolo Bonzini static void my_do_something(MyState *obj) 2489cb54b18SPaolo Bonzini { 2499cb54b18SPaolo Bonzini // do something 2509cb54b18SPaolo Bonzini } 2519cb54b18SPaolo Bonzini 2529cb54b18SPaolo Bonzini static void my_class_init(ObjectClass *oc, void *data) 2539cb54b18SPaolo Bonzini { 2549cb54b18SPaolo Bonzini MyClass *mc = MY_CLASS(oc); 2559cb54b18SPaolo Bonzini 2569cb54b18SPaolo Bonzini mc->do_something = my_do_something; 2579cb54b18SPaolo Bonzini } 2589cb54b18SPaolo Bonzini 2599cb54b18SPaolo Bonzini static const TypeInfo my_type_info = { 2609cb54b18SPaolo Bonzini .name = TYPE_MY, 2619cb54b18SPaolo Bonzini .parent = TYPE_OBJECT, 2629cb54b18SPaolo Bonzini .instance_size = sizeof(MyState), 2639cb54b18SPaolo Bonzini .class_size = sizeof(MyClass), 2649cb54b18SPaolo Bonzini .class_init = my_class_init, 2659cb54b18SPaolo Bonzini }; 2669cb54b18SPaolo Bonzini 2679cb54b18SPaolo Bonzini typedef struct DerivedClass { 2689cb54b18SPaolo Bonzini MyClass parent_class; 2699cb54b18SPaolo Bonzini 2709cb54b18SPaolo Bonzini MyDoSomething parent_do_something; 2719cb54b18SPaolo Bonzini } DerivedClass; 2729cb54b18SPaolo Bonzini 2739cb54b18SPaolo Bonzini static void derived_do_something(MyState *obj) 2749cb54b18SPaolo Bonzini { 2759cb54b18SPaolo Bonzini DerivedClass *dc = DERIVED_GET_CLASS(obj); 2769cb54b18SPaolo Bonzini 2779cb54b18SPaolo Bonzini // do something here 2789cb54b18SPaolo Bonzini dc->parent_do_something(obj); 2799cb54b18SPaolo Bonzini // do something else here 2809cb54b18SPaolo Bonzini } 2819cb54b18SPaolo Bonzini 2829cb54b18SPaolo Bonzini static void derived_class_init(ObjectClass *oc, void *data) 2839cb54b18SPaolo Bonzini { 2849cb54b18SPaolo Bonzini MyClass *mc = MY_CLASS(oc); 2859cb54b18SPaolo Bonzini DerivedClass *dc = DERIVED_CLASS(oc); 2869cb54b18SPaolo Bonzini 2879cb54b18SPaolo Bonzini dc->parent_do_something = mc->do_something; 2889cb54b18SPaolo Bonzini mc->do_something = derived_do_something; 2899cb54b18SPaolo Bonzini } 2909cb54b18SPaolo Bonzini 2919cb54b18SPaolo Bonzini static const TypeInfo derived_type_info = { 2929cb54b18SPaolo Bonzini .name = TYPE_DERIVED, 2939cb54b18SPaolo Bonzini .parent = TYPE_MY, 2949cb54b18SPaolo Bonzini .class_size = sizeof(DerivedClass), 2959cb54b18SPaolo Bonzini .class_init = derived_class_init, 2969cb54b18SPaolo Bonzini }; 2979cb54b18SPaolo Bonzini 2989cb54b18SPaolo BonziniAlternatively, object_class_by_name() can be used to obtain the class and 2999cb54b18SPaolo Bonziniits non-overridden methods for a specific type. This would correspond to 3009cb54b18SPaolo Bonzini``MyClass::method(...)`` in C++. 3019cb54b18SPaolo Bonzini 30243398409SAlex BennéeOne example of such methods is ``DeviceClass.reset``. More examples 30343398409SAlex Bennéecan be found at :ref:`device-life-cycle`. 3049cb54b18SPaolo Bonzini 3059cb54b18SPaolo BonziniStandard type declaration and definition macros 3069cb54b18SPaolo Bonzini=============================================== 3079cb54b18SPaolo Bonzini 3089cb54b18SPaolo BonziniA lot of the code outlined above follows a standard pattern and naming 3099cb54b18SPaolo Bonziniconvention. To reduce the amount of boilerplate code that needs to be 3109cb54b18SPaolo Bonziniwritten for a new type there are two sets of macros to generate the 3119cb54b18SPaolo Bonzinicommon parts in a standard format. 3129cb54b18SPaolo Bonzini 3139cb54b18SPaolo BonziniA type is declared using the OBJECT_DECLARE macro family. In types 3149cb54b18SPaolo Bonziniwhich do not require any virtual functions in the class, the 3159cb54b18SPaolo BonziniOBJECT_DECLARE_SIMPLE_TYPE macro is suitable, and is commonly placed 3169cb54b18SPaolo Bonziniin the header file: 3179cb54b18SPaolo Bonzini 3189cb54b18SPaolo Bonzini.. code-block:: c 3199cb54b18SPaolo Bonzini :caption: Declaring a simple type 3209cb54b18SPaolo Bonzini 32128053143SAlex Bennée OBJECT_DECLARE_SIMPLE_TYPE(MyDevice, MY_DEVICE) 3229cb54b18SPaolo Bonzini 3239cb54b18SPaolo BonziniThis is equivalent to the following: 3249cb54b18SPaolo Bonzini 3259cb54b18SPaolo Bonzini.. code-block:: c 3269cb54b18SPaolo Bonzini :caption: Expansion from declaring a simple type 3279cb54b18SPaolo Bonzini 3289cb54b18SPaolo Bonzini typedef struct MyDevice MyDevice; 3299cb54b18SPaolo Bonzini typedef struct MyDeviceClass MyDeviceClass; 3309cb54b18SPaolo Bonzini 3319cb54b18SPaolo Bonzini G_DEFINE_AUTOPTR_CLEANUP_FUNC(MyDeviceClass, object_unref) 3329cb54b18SPaolo Bonzini 3339cb54b18SPaolo Bonzini #define MY_DEVICE_GET_CLASS(void *obj) \ 3349cb54b18SPaolo Bonzini OBJECT_GET_CLASS(MyDeviceClass, obj, TYPE_MY_DEVICE) 3359cb54b18SPaolo Bonzini #define MY_DEVICE_CLASS(void *klass) \ 3369cb54b18SPaolo Bonzini OBJECT_CLASS_CHECK(MyDeviceClass, klass, TYPE_MY_DEVICE) 3379cb54b18SPaolo Bonzini #define MY_DEVICE(void *obj) 3389cb54b18SPaolo Bonzini OBJECT_CHECK(MyDevice, obj, TYPE_MY_DEVICE) 3399cb54b18SPaolo Bonzini 3409cb54b18SPaolo Bonzini struct MyDeviceClass { 3419cb54b18SPaolo Bonzini DeviceClass parent_class; 3429cb54b18SPaolo Bonzini }; 3439cb54b18SPaolo Bonzini 3449cb54b18SPaolo BonziniThe 'struct MyDevice' needs to be declared separately. 3459cb54b18SPaolo BonziniIf the type requires virtual functions to be declared in the class 3469cb54b18SPaolo Bonzinistruct, then the alternative OBJECT_DECLARE_TYPE() macro can be 3479cb54b18SPaolo Bonziniused. This does the same as OBJECT_DECLARE_SIMPLE_TYPE(), but without 3489cb54b18SPaolo Bonzinithe 'struct MyDeviceClass' definition. 3499cb54b18SPaolo Bonzini 3509cb54b18SPaolo BonziniTo implement the type, the OBJECT_DEFINE macro family is available. 351*e54c2433SPeter MaydellFor the simplest case of a leaf class which doesn't need any of its 352*e54c2433SPeter Maydellown virtual functions (i.e. which was declared with OBJECT_DECLARE_SIMPLE_TYPE) 353*e54c2433SPeter Maydellthe OBJECT_DEFINE_SIMPLE_TYPE macro is suitable: 3549cb54b18SPaolo Bonzini 3559cb54b18SPaolo Bonzini.. code-block:: c 3569cb54b18SPaolo Bonzini :caption: Defining a simple type 3579cb54b18SPaolo Bonzini 358*e54c2433SPeter Maydell OBJECT_DEFINE_SIMPLE_TYPE(MyDevice, my_device, MY_DEVICE, DEVICE) 3599cb54b18SPaolo Bonzini 3609cb54b18SPaolo BonziniThis is equivalent to the following: 3619cb54b18SPaolo Bonzini 3629cb54b18SPaolo Bonzini.. code-block:: c 3639cb54b18SPaolo Bonzini :caption: Expansion from defining a simple type 3649cb54b18SPaolo Bonzini 3659cb54b18SPaolo Bonzini static void my_device_finalize(Object *obj); 3669cb54b18SPaolo Bonzini static void my_device_class_init(ObjectClass *oc, void *data); 3679cb54b18SPaolo Bonzini static void my_device_init(Object *obj); 3689cb54b18SPaolo Bonzini 3699cb54b18SPaolo Bonzini static const TypeInfo my_device_info = { 3709cb54b18SPaolo Bonzini .parent = TYPE_DEVICE, 3719cb54b18SPaolo Bonzini .name = TYPE_MY_DEVICE, 3729cb54b18SPaolo Bonzini .instance_size = sizeof(MyDevice), 3739cb54b18SPaolo Bonzini .instance_init = my_device_init, 3749cb54b18SPaolo Bonzini .instance_finalize = my_device_finalize, 3759cb54b18SPaolo Bonzini .class_init = my_device_class_init, 3769cb54b18SPaolo Bonzini }; 3779cb54b18SPaolo Bonzini 3789cb54b18SPaolo Bonzini static void 3799cb54b18SPaolo Bonzini my_device_register_types(void) 3809cb54b18SPaolo Bonzini { 3819cb54b18SPaolo Bonzini type_register_static(&my_device_info); 3829cb54b18SPaolo Bonzini } 3839cb54b18SPaolo Bonzini type_init(my_device_register_types); 3849cb54b18SPaolo Bonzini 3859cb54b18SPaolo BonziniThis is sufficient to get the type registered with the type 3869cb54b18SPaolo Bonzinisystem, and the three standard methods now need to be implemented 3879cb54b18SPaolo Bonzinialong with any other logic required for the type. 3889cb54b18SPaolo Bonzini 389*e54c2433SPeter MaydellIf the class needs its own virtual methods, or has some other 390*e54c2433SPeter Maydellper-class state it needs to store in its own class struct, 391*e54c2433SPeter Maydellthen you can use the OBJECT_DEFINE_TYPE macro. This does the 392*e54c2433SPeter Maydellsame thing as OBJECT_DEFINE_SIMPLE_TYPE, but it also sets the 393*e54c2433SPeter Maydellclass_size of the type to the size of the class struct. 394*e54c2433SPeter Maydell 395*e54c2433SPeter Maydell.. code-block:: c 396*e54c2433SPeter Maydell :caption: Defining a type which needs a class struct 397*e54c2433SPeter Maydell 398*e54c2433SPeter Maydell OBJECT_DEFINE_TYPE(MyDevice, my_device, MY_DEVICE, DEVICE) 399*e54c2433SPeter Maydell 4009cb54b18SPaolo BonziniIf the type needs to implement one or more interfaces, then the 401*e54c2433SPeter MaydellOBJECT_DEFINE_SIMPLE_TYPE_WITH_INTERFACES() and 402*e54c2433SPeter MaydellOBJECT_DEFINE_TYPE_WITH_INTERFACES() macros can be used instead. 403*e54c2433SPeter MaydellThese accept an array of interface type names. The difference between 404*e54c2433SPeter Maydellthem is that the former is for simple leaf classes that don't need 405*e54c2433SPeter Maydella class struct, and the latter is for when you will be defining 406*e54c2433SPeter Maydella class struct. 4079cb54b18SPaolo Bonzini 4089cb54b18SPaolo Bonzini.. code-block:: c 4099cb54b18SPaolo Bonzini :caption: Defining a simple type implementing interfaces 4109cb54b18SPaolo Bonzini 411*e54c2433SPeter Maydell OBJECT_DEFINE_SIMPLE_TYPE_WITH_INTERFACES(MyDevice, my_device, 412*e54c2433SPeter Maydell MY_DEVICE, DEVICE, 413*e54c2433SPeter Maydell { TYPE_USER_CREATABLE }, 414*e54c2433SPeter Maydell { NULL }) 415*e54c2433SPeter Maydell 416*e54c2433SPeter Maydell.. code-block:: c 417*e54c2433SPeter Maydell :caption: Defining a type implementing interfaces 418*e54c2433SPeter Maydell 4199cb54b18SPaolo Bonzini OBJECT_DEFINE_TYPE_WITH_INTERFACES(MyDevice, my_device, 4209cb54b18SPaolo Bonzini MY_DEVICE, DEVICE, 42138a0d5bcSEduardo Habkost { TYPE_USER_CREATABLE }, 42238a0d5bcSEduardo Habkost { NULL }) 4239cb54b18SPaolo Bonzini 4247a21bee2SDaniel P. BerrangéIf the type is not intended to be instantiated, then the 4257a21bee2SDaniel P. BerrangéOBJECT_DEFINE_ABSTRACT_TYPE() macro can be used instead: 4269cb54b18SPaolo Bonzini 4279cb54b18SPaolo Bonzini.. code-block:: c 4289cb54b18SPaolo Bonzini :caption: Defining a simple abstract type 4299cb54b18SPaolo Bonzini 43038a0d5bcSEduardo Habkost OBJECT_DEFINE_ABSTRACT_TYPE(MyDevice, my_device, 43138a0d5bcSEduardo Habkost MY_DEVICE, DEVICE) 4329cb54b18SPaolo Bonzini 43343398409SAlex Bennée.. _device-life-cycle: 4349cb54b18SPaolo Bonzini 43543398409SAlex BennéeDevice Life-cycle 43643398409SAlex Bennée================= 43743398409SAlex Bennée 43843398409SAlex BennéeAs class initialisation cannot fail devices have an two additional 43943398409SAlex Bennéemethods to handle the creation of dynamic devices. The ``realize`` 44043398409SAlex Bennéefunction is called with ``Error **`` pointer which should be set if 44143398409SAlex Bennéethe device cannot complete its setup. Otherwise on successful 44243398409SAlex Bennéecompletion of the ``realize`` method the device object is added to the 44343398409SAlex BennéeQOM tree and made visible to the guest. 44443398409SAlex Bennée 44543398409SAlex BennéeThe reverse function is ``unrealize`` and should be were clean-up 44643398409SAlex Bennéecode lives to tidy up after the system is done with the device. 44743398409SAlex Bennée 44843398409SAlex BennéeAll devices can be instantiated by C code, however only some can 44943398409SAlex Bennéecreated dynamically via the command line or monitor. 45043398409SAlex Bennée 45143398409SAlex BennéeLikewise only some can be unplugged after creation and need an 45243398409SAlex Bennéeexplicit ``unrealize`` implementation. This is determined by the 45343398409SAlex Bennée``user_creatable`` variable in the root ``DeviceClass`` structure. 45443398409SAlex BennéeDevices can only be unplugged if their ``parent_bus`` has a registered 45543398409SAlex Bennée``HotplugHandler``. 4569cb54b18SPaolo Bonzini 4579cb54b18SPaolo BonziniAPI Reference 45843398409SAlex Bennée============= 4599cb54b18SPaolo Bonzini 460da966a8aSAlex BennéeSee the :ref:`QOM API<qom-api>` and :ref:`QDEV API<qdev-api>` 461da966a8aSAlex Bennéedocuments for the complete API description. 462