関連するもの:は、どのようにボンネットで動作するのか、ソフトウェアがどのように役立つのかについては、this blog postも参照してください(TSXのバグが発見され、ハードウェア)
Intel insn ref manual entry for xbegin
はかなり明確です。 (Intelの公式PDF、および他のものへのリンクx86タグのwikiを参照してください。)
RTMで中止し、論理プロセッサは、RTMの実行と リストア中に実行すべての建築 レジスタやメモリの更新を破棄しますアーキテクチャ状態を、最も外側の XBEGIN命令に対応するものに変更します。アボート後のフォールバックアドレスは、最も外側のXBEGIN命令から計算されます。
この命令は、分岐条件が「XEND
より前に中止されましたか?」という条件分岐のように機能します。例えば:
; NASM syntax, I assume MASM is similar
ALIGN 16
retry:
; eax holds abort info, all other architectural state + memory is unchanged
inc [retry_count] ; or whatever other debug instrumentation you want to add
global xbegin_wrapper_with_retry
xbegin_wrapper_with_retry:
xbegin retry
ret
アボートが発生した場合は、それをすべてでは実行されませんでしたxbegin
後に走ったすべてのコード、eax
とフォールバック・アドレスへのちょうどジャンプが修正かのようです。
もちろん、アボートで無限の再試行以外の処理をしたい場合があります。これは実際の例ではありません。 (This articleは、コンパイラがそのチェックを最適化しない限り、if
のジャンプとしてxbegin
をジャンプとして使用する代わりに、eax
をテストするように見えます。最も効率的な方法です)。
「割り込み効果」とはどういう意味ですか?現在の実装では、(システムコールや割り込みなどの)特権レベルを変更するものは、トランザクションを中断させます。したがって、リングレベルの変更をロールバックする必要はありません。 CPUはロールバックできないものがあればトランザクションを中止します。。つまり、バグにはトランザクション内に何かを置くことが含まれますが、これには常に中断が発生しますが、ロールバックできないものはありません。あなたはとてもスタックにリターンアドレスをプッシュ、関数呼び出しなしで3バイトXEND
命令を発するようにコンパイラを取得しようとする場合があります
は、トランザクションの一部ではありません。例えば
// no idea if this is safe, or if it might get reordered by the optimizer
#define xend_MSVC __asm _emit 0x0F __asm _emit 0x01 __asm _emit 0xD5
I think this does still work in 64bit mode
、ドキュメントが
rax
言及し、および
IACA's header fileは
__asm _emit
を使用するように見えるからです。
XEND
を独自のラッパー関数に入れる方が安全です。組み込み関数を持つコンパイラにアップグレードするまでは、ストップギャップが必要です。ret
とcall
からの余分な読み取り/書き込みがあまりにも多くのアボートを引き起こさない限り完璧である必要はありません。