自己修正コード - arch_static_branch()
概要
分岐可能なコードを生成し、条件を判断するコードをNOP命令で初期化する
詳細
asm_volatile_goto()で分岐可能なアセンブラ命令を生成する
__stringify()にSTATIC_KEY_INIT_NOPを渡すことで5byteのNOP命令の文字列を生成するため、初期状態では常に0を返すことになる
その後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を返す