kexecのpurgatory

kexecはメモリ上にカーネル一式(カーネル本体、コマンドライン引数、initrdなど)を展開する
また同時に特別な領域としてpurgatoryというものを展開する

purgatoryはカーネルに入る前の代替初期化ルーチンらしい
cold bootの場合、CPUのモードの初期化などが行われるが、kexecを使用すればそれが必要なくなり、
本来の初期化ルーチンの代わりにkexecではpurgatoryを使うわけだ

purgatoryの大体の流れを追ってみた(kexec-tools-2.0.2)
まずエントリーポイント探す。mainかと思ったけどどうやら違う。
purgatory/Makefileを見るとリンカーを実行しているところで-eオプションでエントリーポイントをpurgatory_startに指定している

#purgatory/Makefile
$(PURGATORY): LDFLAGS=$($(ARCH)_PURGATORY_EXTRA_CFLAGS)\
                        --no-undefined -nostartfiles -nostdlib -nodefaultlibs \
                        -e purgatory_start -r

このpurgatory_startはアーキテクチャ依存のディレクトリに存在していて、x86_64だとarch/x86_64/setup-x86_64.Sの中にある
setup-x86_64.Sの中ではセグメントレジスタの初期化を行った後、purgatory本体に飛び、その後はカーネル本体へジャンプするためにentry_64を呼び出す。

purgatory本体はpurgatory/purgatory.cにある

//purgatory/puragatory.c
void purgatory(void)
{
        printf("I'm in purgatory\n");
        setup_arch();
        verify_sha256_digest();
        post_verification_setup_arch();
}

setup_arch()は以下のようにreset_vgaとlegacy_picオプションが付いていた場合のみ意味がある

void setup_arch(void)
{
        if (reset_vga)    x86_reset_vga();
        if (legacy_pic)   x86_setup_legacy_pic();
}

その後、veryfy_sha256_digest()が実行されるが、これはロードされたカーネルなどのハッシュ値が正しいか確認をしているんだと思う
post_verification_setup_arch();についてはよくわからない

思いの外、大したコード量じゃない気がする。どこかに見落としがあるんだろうか?