SFENCE.VMA
の実装に関してちょっと詰まったのでメモ。
これまでSFENCE.VMA
は単なるCSR命令として、In-orderに実行するようにしていたのだが、実際にはストア命令の操作が完了するまで待たなければならない。
3509 : 1325 : PC=[00000000ffc0245c] (M,46,01) 0065a023 sw t1, 0(a1) 3509 : 1326 : PC=[00000000ffc02460] (M,46,02) 12050073 sfence.vma a0, zero
この2つの命令は同じグループで実行されるため、SFENCE.VMA
がコミットされた後にSW
命令がデータをL1Dに書き込むことになる。
もしL1Dへの書き込みが遅れると、後続の命令がPTWへのアクセスをした場合のページテーブルの参照が誤ってしまう。
これを防ぐためには、SFENCE.VMA
は必ず単体で実行されるように制約を変更し、SW
命令がST-Bufferから離れて完全にEmptyになるまで待つように制御を追加しなければならないらしい。