SFENCE.VMA
を適当にCSR命令として実装していたのだがテストを実行すると不具合を見つけた。
SFENCE.VMA
はページテーブルのアップデートなどを行った際にそれを適用するためのフェンスで、ページテーブルを更新した後にそれを適用するための命令だ。
この命令と、前のページを更新するストア命令を同じコミットグループに入れることが出来るように実装してしまった。
すると、SFENCE.VMA
自体はインオーダで実行するように制御しているものの、ストア命令が実際にストアバッファからL1Dに更新を行うのはそのコミットグループがコミットされた後のため、SFENCE.VMA
がコミットした後にストアバッファがL1Dに書き込みを発生させてしまい後続の命令がページテーブルを正しく参照することが出来ない。
これを防ぐためには、SFENCE.VMA
は別の通常命令と独立したコミットグループとして扱った方が良さそうだ。
いっそのことCSR系の命令は完全に別の命令と分離した方が良いような気がしてくる。
もう一つは、SFENCE.VMA
をCSRのパイプラインに流すかどうかだ。SFENCE.VMA
自体はCSRレジスタを触らないため、LSU側で実行しても良い気がしてきた。
この方がストアバッファを近くで参照することができるし、道理が通っているような気がする。