cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

qom.rst (12263B)


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