自己修正コード - arch_static_branch_jump
概要
分岐可能なコードを生成し、条件を判断するコードを1を返すコードへのJMP命令で初期化する
詳細
asm_volatile_goto()で分岐可能なアセンブラ命令を生成する
0xe9で示されるJMP命令で初期化し、l_yesラベルへ分岐するため初期状態では常に1を返すことになる
その後pushsectionにより、__jump_tableセクションに書き込み可能なデータとして_ASM_ALIGNでアライメントされ、_ASM_PTRの大きさのデータを保存する
保存したデータはstruct jump_entry型のデータとなり以下の値で初期化される
- code : NOP命令で初期化されたメモリのアドレス
- target : 分岐先のラベルl_yesのアドレス
- key : 引数として取得したstruct static_key型のポインタとbool型の値を加算した値
このデータはjump_label_init()で起動時に初期化され、初期化後は初期化後の値にしたがって0か1を返す