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

virtio-migration.txt (4070B)


      1Virtio devices and migration
      2============================
      3
      4Copyright 2015 IBM Corp.
      5
      6This work is licensed under the terms of the GNU GPL, version 2 or later.  See
      7the COPYING file in the top-level directory.
      8
      9Saving and restoring the state of virtio devices is a bit of a twisty maze,
     10for several reasons:
     11- state is distributed between several parts:
     12  - virtio core, for common fields like features, number of queues, ...
     13  - virtio transport (pci, ccw, ...), for the different proxy devices and
     14    transport specific state (msix vectors, indicators, ...)
     15  - virtio device (net, blk, ...), for the different device types and their
     16    state (mac address, request queue, ...)
     17- most fields are saved via the stream interface; subsequently, subsections
     18  have been added to make cross-version migration possible
     19
     20This file attempts to document the current procedure and point out some
     21caveats.
     22
     23
     24Save state procedure
     25====================
     26
     27virtio core               virtio transport          virtio device
     28-----------               ----------------          -------------
     29
     30                                                    save() function registered
     31                                                    via VMState wrapper on
     32                                                    device class
     33virtio_save()                                       <----------
     34             ------>      save_config()
     35                          - save proxy device
     36                          - save transport-specific
     37                            device fields
     38- save common device
     39  fields
     40- save common virtqueue
     41  fields
     42             ------>      save_queue()
     43                          - save transport-specific
     44                            virtqueue fields
     45             ------>                               save_device()
     46                                                   - save device-specific
     47                                                     fields
     48- save subsections
     49  - device endianness,
     50    if changed from
     51    default endianness
     52  - 64 bit features, if
     53    any high feature bit
     54    is set
     55  - virtio-1 virtqueue
     56    fields, if VERSION_1
     57    is set
     58
     59
     60Load state procedure
     61====================
     62
     63virtio core               virtio transport          virtio device
     64-----------               ----------------          -------------
     65
     66                                                    load() function registered
     67                                                    via VMState wrapper on
     68                                                    device class
     69virtio_load()                                       <----------
     70             ------>      load_config()
     71                          - load proxy device
     72                          - load transport-specific
     73                            device fields
     74- load common device
     75  fields
     76- load common virtqueue
     77  fields
     78             ------>      load_queue()
     79                          - load transport-specific
     80                            virtqueue fields
     81- notify guest
     82             ------>                               load_device()
     83                                                   - load device-specific
     84                                                     fields
     85- load subsections
     86  - device endianness
     87  - 64 bit features
     88  - virtio-1 virtqueue
     89    fields
     90- sanitize endianness
     91- sanitize features
     92- virtqueue index sanity
     93  check
     94                                                   - feature-dependent setup
     95
     96
     97Implications of this setup
     98==========================
     99
    100Devices need to be careful in their state processing during load: The
    101load_device() procedure is invoked by the core before subsections have
    102been loaded. Any code that depends on information transmitted in subsections
    103therefore has to be invoked in the device's load() function _after_
    104virtio_load() returned (like e.g. code depending on features).
    105
    106Any extension of the state being migrated should be done in subsections
    107added to the core for compatibility reasons. If transport or device specific
    108state is added, core needs to invoke a callback from the new subsection.