キャッシュ可能読み出し中に外部中止が受信されると、中止されたラインがデータ キャッシュで無効として割り当てられ、データ キャッシュでそのラインが割り当てられると内部排他モニターがクリアされます。そのため、プログラムにより DSB 命令を含む LDREX/STREX ループが実行され、LDREX/STREX シーケンス中に中止応答が受信され続けると、LDREX/STREX シーケンスは正しく完了しません。
この問題は、キャッシュ可能メモリ要求への応答として外部中止を生成する可能性のあるシステムで発生します。この問題を回避するには、分岐予測をオンにするか、LDREX/STREX シーケンスから DSB を削除します。
影響: | 深刻な問題ではありません。 |
回避策: | この問題を回避するには、分岐予測をオンにするか、LDREX/STREX シーケンスから DSB を削除します。 |
対象となる構成: | プロセッサの 1 つまたは両方を使用するシステム |
対象となるデバイス リビジョン: | すべて。修正の予定はありません。(Xilinx Answer 47916) - 「Zynq-7000 SoC デバイス - シリコン リビジョン間の相違点」を参照してください。 |
Cortex-A9 では、キャッシュ可能読み出し中に外部中止が受信されると、中止されたラインがデータ キャッシュで無効として割り当てられ、データ キャッシュでそのラインが割り当てられると内部排他モニターがクリアされます。そのため、プログラムにより DSB 命令を含む LDREX/STREX ループが実行され、LDREX/STREX シーケンス中に中止応答が受信され続けると、LDREX/STREX シーケンスが正しく完了せず、プロセッサがライブロック状態になることがあります。
たとえば、次のようなコード シーケンスで問題が発生する可能性があります。
loop LDREX ... DSB STREX CMP BNE loop ...LDR (中止する領域に対して)
LDREX/STREX ループの最初の反復が正しく完了せず、 BNE が予測され、LDR が投機的に実行されて、プロセッサが次を実行し続けます。
LDR to aborting region (この投機的 LDR は LDREX および DSB の前にあるように見える) LDREX DSB STREX
L1 キャッシュで LDR がミスとなり、中止されているので有効として割り当てられることはありません。
LDREX が実行され、排他モニターが設定されます。
DSB が実行されます。LDR が完了するまで待機しますが、中止されるので、データ キャッシュで無効として割り当てられ、排他モニターがクリアされます。STREX が実行されますが、排他モニターがクリアされているので、STREX は正しく実行されません。
BNE が再び予測される場合があり、そのため LDR が投機的に再び実行され、正しく実行されなかった LDREX/STREX シーケンスにループバックします。
影響の詳細
この問題は、キャッシュ可能メモリ要求への応答として外部中止を生成する可能性のあるシステムで発生します。LDREX/STREX シーケンス中に内部排他モニターが継続的にクリアされる状態になると、プロセッサがライブロック状態になることがあります。
実際には、いくつかの条件によりエラーが発生するのが回避されるので、この状態はほとんど発生しません。
回避策の詳細
この問題の回避策は 2 つあります。
Answer Number | アンサータイトル | 問題の発生したバージョン | 修正バージョン |
---|---|---|---|
47916 | Zynq-7000 AP SoC デバイス - シリコン リビジョン間の相違点 | N/A | N/A |
AR# 47586 | |
---|---|
日付 | 05/25/2018 |
ステータス | アクティブ |
種類 | デザイン アドバイザリ |
デバイス |