xref: /openbmc/qemu/docs/devel/qom.rst (revision 158a054c4d1a40179f5e83cd7e1cfe65de457b92)
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