xref: /openbmc/qemu/docs/devel/qom.rst (revision 06831001)
1.. _qom:
2
3===========================
4The QEMU Object Model (QOM)
5===========================
6
7.. highlight:: c
8
9The QEMU Object Model provides a framework for registering user creatable
10types and instantiating objects from those types.  QOM provides the following
11features:
12
13- System for dynamically registering types
14- Support for single-inheritance of types
15- Multiple inheritance of stateless interfaces
16
17.. code-block:: c
18   :caption: Creating a minimal type
19
20   #include "qdev.h"
21
22   #define TYPE_MY_DEVICE "my-device"
23
24   // No new virtual functions: we can reuse the typedef for the
25   // superclass.
26   typedef DeviceClass MyDeviceClass;
27   typedef struct MyDevice
28   {
29       DeviceState parent;
30
31       int reg0, reg1, reg2;
32   } MyDevice;
33
34   static const TypeInfo my_device_info = {
35       .name = TYPE_MY_DEVICE,
36       .parent = TYPE_DEVICE,
37       .instance_size = sizeof(MyDevice),
38   };
39
40   static void my_device_register_types(void)
41   {
42       type_register_static(&my_device_info);
43   }
44
45   type_init(my_device_register_types)
46
47In the above example, we create a simple type that is described by #TypeInfo.
48#TypeInfo describes information about the type including what it inherits
49from, the instance and class size, and constructor/destructor hooks.
50
51Alternatively several static types could be registered using helper macro
52DEFINE_TYPES()
53
54.. code-block:: c
55
56   static const TypeInfo device_types_info[] = {
57       {
58           .name = TYPE_MY_DEVICE_A,
59           .parent = TYPE_DEVICE,
60           .instance_size = sizeof(MyDeviceA),
61       },
62       {
63           .name = TYPE_MY_DEVICE_B,
64           .parent = TYPE_DEVICE,
65           .instance_size = sizeof(MyDeviceB),
66       },
67   };
68
69   DEFINE_TYPES(device_types_info)
70
71Every type has an #ObjectClass associated with it.  #ObjectClass derivatives
72are instantiated dynamically but there is only ever one instance for any
73given type.  The #ObjectClass typically holds a table of function pointers
74for the virtual methods implemented by this type.
75
76Using object_new(), a new #Object derivative will be instantiated.  You can
77cast an #Object to a subclass (or base-class) type using
78object_dynamic_cast().  You typically want to define macro wrappers around
79OBJECT_CHECK() and OBJECT_CLASS_CHECK() to make it easier to convert to a
80specific type:
81
82.. code-block:: c
83   :caption: Typecasting macros
84
85   #define MY_DEVICE_GET_CLASS(obj) \
86      OBJECT_GET_CLASS(MyDeviceClass, obj, TYPE_MY_DEVICE)
87   #define MY_DEVICE_CLASS(klass) \
88      OBJECT_CLASS_CHECK(MyDeviceClass, klass, TYPE_MY_DEVICE)
89   #define MY_DEVICE(obj) \
90      OBJECT_CHECK(MyDevice, obj, TYPE_MY_DEVICE)
91
92In case the ObjectClass implementation can be built as module a
93module_obj() line must be added to make sure qemu loads the module
94when the object is needed.
95
96.. code-block:: c
97
98   module_obj(TYPE_MY_DEVICE);
99
100Class Initialization
101====================
102
103Before an object is initialized, the class for the object must be
104initialized.  There is only one class object for all instance objects
105that is created lazily.
106
107Classes are initialized by first initializing any parent classes (if
108necessary).  After the parent class object has initialized, it will be
109copied into the current class object and any additional storage in the
110class object is zero filled.
111
112The effect of this is that classes automatically inherit any virtual
113function pointers that the parent class has already initialized.  All
114other fields will be zero filled.
115
116Once all of the parent classes have been initialized, #TypeInfo::class_init
117is called to let the class being instantiated provide default initialize for
118its virtual functions.  Here is how the above example might be modified
119to introduce an overridden virtual function:
120
121.. code-block:: c
122   :caption: Overriding a virtual function
123
124   #include "qdev.h"
125
126   void my_device_class_init(ObjectClass *klass, void *class_data)
127   {
128       DeviceClass *dc = DEVICE_CLASS(klass);
129       dc->reset = my_device_reset;
130   }
131
132   static const TypeInfo my_device_info = {
133       .name = TYPE_MY_DEVICE,
134       .parent = TYPE_DEVICE,
135       .instance_size = sizeof(MyDevice),
136       .class_init = my_device_class_init,
137   };
138
139Introducing new virtual methods requires a class to define its own
140struct and to add a .class_size member to the #TypeInfo.  Each method
141will also have a wrapper function to call it easily:
142
143.. code-block:: c
144   :caption: Defining an abstract class
145
146   #include "qdev.h"
147
148   typedef struct MyDeviceClass
149   {
150       DeviceClass parent;
151
152       void (*frobnicate) (MyDevice *obj);
153   } MyDeviceClass;
154
155   static const TypeInfo my_device_info = {
156       .name = TYPE_MY_DEVICE,
157       .parent = TYPE_DEVICE,
158       .instance_size = sizeof(MyDevice),
159       .abstract = true, // or set a default in my_device_class_init
160       .class_size = sizeof(MyDeviceClass),
161   };
162
163   void my_device_frobnicate(MyDevice *obj)
164   {
165       MyDeviceClass *klass = MY_DEVICE_GET_CLASS(obj);
166
167       klass->frobnicate(obj);
168   }
169
170Interfaces
171==========
172
173Interfaces allow a limited form of multiple inheritance.  Instances are
174similar to normal types except for the fact that are only defined by
175their classes and never carry any state.  As a consequence, a pointer to
176an interface instance should always be of incomplete type in order to be
177sure it cannot be dereferenced.  That is, you should define the
178'typedef struct SomethingIf SomethingIf' so that you can pass around
179``SomethingIf *si`` arguments, but not define a ``struct SomethingIf { ... }``.
180The only things you can validly do with a ``SomethingIf *`` are to pass it as
181an argument to a method on its corresponding SomethingIfClass, or to
182dynamically cast it to an object that implements the interface.
183
184Methods
185=======
186
187A *method* is a function within the namespace scope of
188a class. It usually operates on the object instance by passing it as a
189strongly-typed first argument.
190If it does not operate on an object instance, it is dubbed
191*class method*.
192
193Methods cannot be overloaded. That is, the #ObjectClass and method name
194uniquely identity the function to be called; the signature does not vary
195except for trailing varargs.
196
197Methods are always *virtual*. Overriding a method in
198#TypeInfo.class_init of a subclass leads to any user of the class obtained
199via OBJECT_GET_CLASS() accessing the overridden function.
200The original function is not automatically invoked. It is the responsibility
201of the overriding class to determine whether and when to invoke the method
202being overridden.
203
204To invoke the method being overridden, the preferred solution is to store
205the original value in the overriding class before overriding the method.
206This corresponds to ``{super,base}.method(...)`` in Java and C#
207respectively; this frees the overriding class from hardcoding its parent
208class, which someone might choose to change at some point.
209
210.. code-block:: c
211   :caption: Overriding a virtual method
212
213   typedef struct MyState MyState;
214
215   typedef void (*MyDoSomething)(MyState *obj);
216
217   typedef struct MyClass {
218       ObjectClass parent_class;
219
220       MyDoSomething do_something;
221   } MyClass;
222
223   static void my_do_something(MyState *obj)
224   {
225       // do something
226   }
227
228   static void my_class_init(ObjectClass *oc, void *data)
229   {
230       MyClass *mc = MY_CLASS(oc);
231
232       mc->do_something = my_do_something;
233   }
234
235   static const TypeInfo my_type_info = {
236       .name = TYPE_MY,
237       .parent = TYPE_OBJECT,
238       .instance_size = sizeof(MyState),
239       .class_size = sizeof(MyClass),
240       .class_init = my_class_init,
241   };
242
243   typedef struct DerivedClass {
244       MyClass parent_class;
245
246       MyDoSomething parent_do_something;
247   } DerivedClass;
248
249   static void derived_do_something(MyState *obj)
250   {
251       DerivedClass *dc = DERIVED_GET_CLASS(obj);
252
253       // do something here
254       dc->parent_do_something(obj);
255       // do something else here
256   }
257
258   static void derived_class_init(ObjectClass *oc, void *data)
259   {
260       MyClass *mc = MY_CLASS(oc);
261       DerivedClass *dc = DERIVED_CLASS(oc);
262
263       dc->parent_do_something = mc->do_something;
264       mc->do_something = derived_do_something;
265   }
266
267   static const TypeInfo derived_type_info = {
268       .name = TYPE_DERIVED,
269       .parent = TYPE_MY,
270       .class_size = sizeof(DerivedClass),
271       .class_init = derived_class_init,
272   };
273
274Alternatively, object_class_by_name() can be used to obtain the class and
275its non-overridden methods for a specific type. This would correspond to
276``MyClass::method(...)`` in C++.
277
278The first example of such a QOM method was #CPUClass.reset,
279another example is #DeviceClass.realize.
280
281Standard type declaration and definition macros
282===============================================
283
284A lot of the code outlined above follows a standard pattern and naming
285convention. To reduce the amount of boilerplate code that needs to be
286written for a new type there are two sets of macros to generate the
287common parts in a standard format.
288
289A type is declared using the OBJECT_DECLARE macro family. In types
290which do not require any virtual functions in the class, the
291OBJECT_DECLARE_SIMPLE_TYPE macro is suitable, and is commonly placed
292in the header file:
293
294.. code-block:: c
295   :caption: Declaring a simple type
296
297   OBJECT_DECLARE_SIMPLE_TYPE(MyDevice, MY_DEVICE)
298
299This is equivalent to the following:
300
301.. code-block:: c
302   :caption: Expansion from declaring a simple type
303
304   typedef struct MyDevice MyDevice;
305   typedef struct MyDeviceClass MyDeviceClass;
306
307   G_DEFINE_AUTOPTR_CLEANUP_FUNC(MyDeviceClass, object_unref)
308
309   #define MY_DEVICE_GET_CLASS(void *obj) \
310           OBJECT_GET_CLASS(MyDeviceClass, obj, TYPE_MY_DEVICE)
311   #define MY_DEVICE_CLASS(void *klass) \
312           OBJECT_CLASS_CHECK(MyDeviceClass, klass, TYPE_MY_DEVICE)
313   #define MY_DEVICE(void *obj)
314           OBJECT_CHECK(MyDevice, obj, TYPE_MY_DEVICE)
315
316   struct MyDeviceClass {
317       DeviceClass parent_class;
318   };
319
320The 'struct MyDevice' needs to be declared separately.
321If the type requires virtual functions to be declared in the class
322struct, then the alternative OBJECT_DECLARE_TYPE() macro can be
323used. This does the same as OBJECT_DECLARE_SIMPLE_TYPE(), but without
324the 'struct MyDeviceClass' definition.
325
326To implement the type, the OBJECT_DEFINE macro family is available.
327In the simple case the OBJECT_DEFINE_TYPE macro is suitable:
328
329.. code-block:: c
330   :caption: Defining a simple type
331
332   OBJECT_DEFINE_TYPE(MyDevice, my_device, MY_DEVICE, DEVICE)
333
334This is equivalent to the following:
335
336.. code-block:: c
337   :caption: Expansion from defining a simple type
338
339   static void my_device_finalize(Object *obj);
340   static void my_device_class_init(ObjectClass *oc, void *data);
341   static void my_device_init(Object *obj);
342
343   static const TypeInfo my_device_info = {
344       .parent = TYPE_DEVICE,
345       .name = TYPE_MY_DEVICE,
346       .instance_size = sizeof(MyDevice),
347       .instance_init = my_device_init,
348       .instance_finalize = my_device_finalize,
349       .class_size = sizeof(MyDeviceClass),
350       .class_init = my_device_class_init,
351   };
352
353   static void
354   my_device_register_types(void)
355   {
356       type_register_static(&my_device_info);
357   }
358   type_init(my_device_register_types);
359
360This is sufficient to get the type registered with the type
361system, and the three standard methods now need to be implemented
362along with any other logic required for the type.
363
364If the type needs to implement one or more interfaces, then the
365OBJECT_DEFINE_TYPE_WITH_INTERFACES() macro can be used instead.
366This accepts an array of interface type names.
367
368.. code-block:: c
369   :caption: Defining a simple type implementing interfaces
370
371   OBJECT_DEFINE_TYPE_WITH_INTERFACES(MyDevice, my_device,
372                                      MY_DEVICE, DEVICE,
373                                      { TYPE_USER_CREATABLE },
374                                      { NULL })
375
376If the type is not intended to be instantiated, then the
377OBJECT_DEFINE_ABSTRACT_TYPE() macro can be used instead:
378
379.. code-block:: c
380   :caption: Defining a simple abstract type
381
382   OBJECT_DEFINE_ABSTRACT_TYPE(MyDevice, my_device,
383                               MY_DEVICE, DEVICE)
384
385
386
387API Reference
388-------------
389
390.. kernel-doc:: include/qom/object.h
391