![f:id:msyksphinz:20210416000125p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/m/msyksphinz/20210416/20210416000125.png)
Atomicアクセスについて、LR/SCを使う場合にはライブロックが発生する可能性がある。これを解決するために、RISC-VではいくつかLR/SCについて説明が付け足されている。
- LR/SCに制限を付ける
- LR/SCで挟むアトミックな命令シーケンスは、最大で命令16個分とする(これはTLBはキャッシュに過剰な負荷をかけないため)
- LR/SCで挟むアトミックな命令シーケンスには、基本命令セットIと、ロード・ストア・逆方向へのジャンプ、逆方向への分岐、JALR、FENCE、SYSTEM SYSTEM命令を含めるべきではない。また、C命令を挿入することもできるがその条件は基本命令セットIに準ずる。
- LR/SCを再実行するための逆方向へのジャンプを持つことができる。
- LR/SCにおけるSCは常に最新のLRで実行された同じ実行アドレスとデータサイズでなければならない。
そして、RISC-VスレッドがLR/SCループに入る場合、以下の事象が発生することを保証しなければならないとなっている。
- 任意のスレッドが、上記の制約付き LR/SC ループ内の LR 命令の予約セットに対してSCを成功させる。
- 他のスレッド(hart)がLR/SCループを実行しているスレッドが設定したLR 命令の予約セットに対して、無条件に Store や AMO 命令 を実行したり、システム内の他のデバイスがその予約セットに書き込みを行う。
- 制約された LR/SC ループを抜ける分岐やジャンプを実行する。
- スレッドがトラップを発生させる。
ぬーん、良く分かっていないが、LR/SCの場合って、LRがアクセスしたアドレスに対して別のスレッドがSCを実行しても成功する、という意味なんだろうか? 仕様を見ても良く分からなかった。