自己修正コード - ALTINSTR_ENTRY()
概要
alt_inster構造体のデータを初期化する
詳細
alt_inster構造体では以下のメンバを持つ
- instr_offset : 32bit整数
- repl_offset : 32bit整数
- cpuid : 16bit符号無し整数
- instrlen : 8bit符号無し整数
- replacementlen : 8bit符号無し整数
- padlen : 8bit符号無し整数
よってそれぞれの値を以下のように初期化する
- instr_offset : 置換元の命令のアドレスの相対位置を保持
- 661bラベル*1のアドレスから現在位置のアドレスを減算して得られた値を、long型のデータとして保存
- 現在位置より前のアドレスを減算するため、演算した結果は負数となる
- repl_offset : 挿入する命令のアドレスの相対位置を保持
- b_replacement()で得られる挿入する命令の開始アドレスから現在位置のアドレスを減算して得られた値をlong型のデータとして保存
- cpuid : 機能番号を保持
- featureとして渡された機能番号をword型のデータとして保存
- インラインアセンブラとして展開するため、__stringify()マクロで数値型を文字列に変換する
- instrlen : 置換元の命令のサイズを保持
- OLDINSTR()やOLDINSTR_2()で確保したメモリのサイズをalt_total_slenから取得し、byte型のデータとして保存
- replacementlen : 挿入する命令のサイズを保持
- alt_rlen()で新たに挿入する命令のサイズを取得しbyte型のデータとして保存
- padlen : 余白分のメモリサイズを保持
- 置換元の命令より挿入する命令が大きい場合に確保したアドレスのサイズをalt_pad_lenから取得しbyte型のデータとして保存
*1:置換元の命令の開始ラベル