HVMドメインの状態保存/復帰

例によってXenのバージョンは3.1.

割と簡単.ここでいう"状態"とは,広い意味でのレジスタを意味する.
xen/include/public/hvm/save.h

/* 
 * Each entry has a datatype associated with it: for example, the CPU state 
 * is saved as a HVM_SAVE_TYPE(CPU), which has HVM_SAVE_LENGTH(CPU), 
 * and is identified by a descriptor with typecode HVM_SAVE_CODE(CPU).
 * DECLARE_HVM_SAVE_TYPE binds these things together with some type-system
 * ugliness.
 */

#define DECLARE_HVM_SAVE_TYPE(_x, _code, _type)                   \
  struct __HVM_SAVE_TYPE_##_x { _type t; char c[_code]; }

に基づき,レジスタセットを定義しておく.
具体例は,同save.h の下の方をみれば判る.


実際に保存復帰を行う処理もまた,マクロを使って宣言する.pmtimer.cが最もシンプルで解りやすいと思う.

HVM_REGISTER_SAVE_RESTORE(PMTIMER, pmtimer_save, pmtimer_load,
                          1, HVMSR_PER_DOM);

このマクロの在処は,xen/include/asm-x86/hvm/support.h

/* Syntactic sugar around that function: specify the max number of
 * saves, and this calculates the size of buffer needed */
#define HVM_REGISTER_SAVE_RESTORE(_x, _save, _load, _num, _k)             \
static int __hvm_register_##_x##_save_and_restore(void)                   \
{                                                                         \
    hvm_register_savevm(HVM_SAVE_CODE(_x),                                \
                        #_x,                                              \
                        &_save,                                           \
                        &_load,                                           \
                        (_num) * (HVM_SAVE_LENGTH(_x)                     \
                                  + sizeof (struct hvm_save_descriptor)), \
                        _k);                                              \
    return 0;                                                             \
}                                                                         \
__initcall(__hvm_register_##_x##_save_and_restore);

最後の __initcall にもちょっとしたトリックがあるけれども,その辺の説明については,省略.

ざっと読んでみたところ,手を抜を抜いて保存復帰を行わなくても,Xenそのものが即座に落ちるということは無さそうな雰囲気.でも,保存復帰でレジスタが消えてしまえば副作用の発生は容易に想定できる.性能計測用にパラレルポートに穴をあけるとか,そういう手のquick hackでなければ,絶対に実装すべき.