2016-04-27 16 views
0

私はXBEGIN()関数とXEND()関数の中でトランザクション型のxbeginとxendを静的なアセンブラlibにカプセル化することに興味があります。しかし、スタックが元のxbegin呼び出し状態に復元される方法(または、もしあれば)が、別のスタックレベル(上位または下位)で発生したxabortを与えられているかどうかは不明です。言い換えれば、ダイナミックスタックコンテキスト(割り込み効果を含む)は、トランザクションの別の部分として管理され、ロールバックされますか?中止されたxbeginトランザクションは、xbeginの開始時に存在していたスタックコンテキストを復元しますか?

_xbegin()および_xend()イントリンシックがサポートされておらず、使用可能でもなく、x64ビルドで_asm {}インライン化を使用できないVC++ 2010ビルドには、このアセンブラの方法が必要です。

答えて

2

関連するもの:は、どのようにボンネットで動作するのか、ソフトウェアがどのように役立つのかについては、this blog postも参照してください(TSXのバグが発見され、ハードウェア)


Intel insn ref manual entry for xbeginはかなり明確です。 (Intelの公式PDF、および他のものへのリンクタグの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を独自のラッパー関数に入れる方が安全です。組み込み関数を持つコンパイラにアップグレードするまでは、ストップギャップが必要です。retcallからの余分な読み取り/書き込みがあまりにも多くのアボートを引き起こさない限り完璧である必要はありません。

関連する問題