Skip to content

Instantly share code, notes, and snippets.

@kotet
Created October 9, 2022 12:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kotet/bef84a682e4aff7a8a5e51a2bbe64379 to your computer and use it in GitHub Desktop.
Save kotet/bef84a682e4aff7a8a5e51a2bbe64379 to your computer and use it in GitHub Desktop.
RISC-V privileged ISA 7 Svinval Standard Extension for Fine-Grained Address-Translation Cache Invalidation, Version 1.0の翻訳

Svinval拡張はハイパフォーマンス実装の一定のクラスにおいてバッチ化/パイプライン化をより効率的にするためにSFENCE.VMA, HFENCE.VMA,HFENCE.GVMA命令をより細粒度のインバリデーション/オーダリング操作に分割する。

31 .. 25 24 .. 20 19 .. 15 14 .. 12 11 .. 7 6 .. 0
funct7 rs2 rs1 funct3 rd opcode
SINVAL.VMA asid vaddr PRIV 0 SYSTEM

SINVAL.VMA命令はアドレス変換キャッシュエントリを、SFENCE.VMA命令を同様のrs1,rs2で実行したときにインバリデートされるのと同じものをインバリデートする。 しかし、SFENCE.VMAと違い、SINVAL.VMA命令はSFENCE.VMAや、後述するSFENCE.W.INVAL, SFENCE.INVAL.IR命令のみに順序付けられる。

31 .. 25 24 .. 20 19 .. 15 14 .. 12 11 .. 7 6 .. 0
funct7 rs2 rs1 funct3 rd opcode
SFENCE.INVAL 0 0 PRIV 0 SYSTEM
31 .. 25 24 .. 20 19 .. 15 14 .. 12 11 .. 7 6 .. 0
funct7 rs2 rs1 funct3 rd opcode
SFENCE.INVAL.IR 1 0 PRIV 0 SYSTEM

SFENCE.W.INVAL命令は現在のRISC-V hartから可視である任意のストアが、同じhartでそれに続いて実行されるSINVAL.VMA命令より前に順序付けられることを保証する。 SFENCE.INVAL.IR命令は現在のhartで実行されたSINVAL.VMA命令がそれに続くメモリ管理データ構造への暗黙的参照よりも前に順序付けられることを保証する。

1つのhartにおいてインオーダーで(ただし連続である必要はない)実行された時、SFENCE.W.INVAL, SINVAL.VMA, SFENCE.INVAL.IRの命令列は以下のようなSFENCE.VMA命令と同じ効果を持つ。

  • rs1とrs2の値はSFENCE.VMASINVAL.VMAで同じように使われる
  • SFENCE.W.INVALより前の読み書きはそのようなSFENCE.VMAの前にあると扱われ、
  • SFENCE.INVAL.IRに続く読み書きはそのようなSFENCE.VMAより後にあると扱われる。
31 .. 25 24 .. 20 19 .. 15 14 .. 12 11 .. 7 6 .. 0
funct7 rs2 rs1 funct3 rd opcode
HINVAL.VVMA asid vaddr PRIV 0 SYSTEM
31 .. 25 24 .. 20 19 .. 15 14 .. 12 11 .. 7 6 .. 0
funct7 rs2 rs1 funct3 rd opcode
HINVAL.GVMA vmid gaddr PRIV 0 SYSTEM

ハイパーバイザ拡張が実装されているなら、Svinval拡張はさらにHINVAL.VVMAHINVAL.GVMAの2つの命令を提供する。 これらはSINVAL.VMAと同じセマンティクスを持つが、SFENCE.VMAの代わりに、SFENCE.W.INVALSFENCE.INVAL.IRをそれぞれHFENCE.VVMAHFENCE.GVMAに置き換える。 加えて、HINVAL.GVMAはASIDではなくVMIDを使う。

SINVAL.VMA, HINVAL.VVMA, HINVAL.GVMASFENCE.VMA, HFENCE.VVMA, HFENCE.GVMAと同じパーミッションを必要とし、同じ例外を発生させる。 特に、これらの命令をUモードで実行しようとすると常に不正命令例外を発生させ、SINVAL.VMAHINVAL.GVMAをSモードかmstatus.TVM==1のHSモードで実行しようとする試みもまた不正命令例外を発生させる。 HINVAL.VVMAHINVAL.GVMAをVSモードやVUモードで実行しようとする、またはSINVAL.VMAをVUモードで実行しようとすると、仮想命令例外が発生する。 hstatus.VTVM==1のとき、SINVAL.VMAをVSモードで実行しようとしても仮想命令例外が発生する。

SFENCE.W.INVALSFENCE.INVAL.IR命令は順序付けのみに影響し、観測可能な副作用がないため、mstatus.TVM==1hstatus.VTVM==1の時にトラップする必要はない。 SINVAL.VMA命令をトラップすればTLB管理機能全体をエミュレーションするのに十分である。

典型的な使用法において、ソフトウェアはSFENCE.W.INVAL命令の実行によってアドレス変換キャッシュ内の仮想アドレスのある範囲をインバリデートし、問題のアドレス(に加えて、必要に応じてASIDやVMID)にSINVAL.VMA, HINVAL.VVMA, HINVAL.GVMA命令を実行し、それからSFENCE.INVAL.IR命令を実行する。

ハイパフォーマンス実装はアドレス変換キャッシュのインバリデート操作をパイプライン化し、SFENCE.W.INVAL, SFENCE.INVAL.IR, SFENCE.VMA, HFENCE.GVMA, HFENCE.VVMA命令が実行されるまでパイプラインストールやメモリオーダリング強制を遅延させる。 よりシンプルな実装はSINVAL.VMA, HINVAL.VVMA, HINVAL.GVMAをそれぞれSFENCE.VMA, HFENCE.VVMA, HFENCE.GVMAと同じように実装し、SFENCE.W.INVALSFENCE.INVAL.IR命令を何もしない命令として実装できる。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment