RustのtargetにRISC-Vを指定するとspin crateが使えない!?

RustでRISC-Vをターゲットに試行錯誤しています。 試行錯誤の途中経過ですので、情報や解釈が誤っている可能性があります。

先日、Mutexを使うためにspin crateを使おうとしました。

mvdnes.github.io

ところが、次のようなコンパイルエラーが発生しています。

cargo xbuild --target riscv32imac-unknown-none-elf
   Compiling version_check v0.1.5
   Compiling spin v0.4.10
error[E0599]: no method named `compare_and_swap` found for type `core::sync::atomic::AtomicBool` in the current scope
   --> /home/tomoyuki/.cargo/registry/src/github.com-1ecc6299db9ec823/spin-0.4.10/src/mutex.rs:157:25
    |
157 |         while self.lock.compare_and_swap(false, true, Ordering::Acquire) != false
    |          

RISC-Vは、compare and swap命令を持っていないので、sync::atomicの条件を満たしていないようです (要調査)。 compare and swap命令を持っていない命令セットへの対応が話し合われた形跡があります。

github.com

targetがcompare and swapをサポートしているかどうかを指定する設定が追加され、Atomic変数に対する、load/storeを許容するオプションが追加されたようです。

RISC-Vサポートのトラッキングissueで、次のアイテムにチェックがついていないので、atomicな部分はllvmの改善待ち、ということでしょうか。

port to riscv32-unknown-linux-gnu (waiting on better atomic support in llvm)

github.com

ちなみに、Rust embedded WGのriscv crateでは、bare-metal crateのMutexを使っています。 bare-metal crateの中身は追々調査していく予定です。

spin crateが使えないと、lazy_staticなど便利なcrateが使えないため、継続して調査を実施する予定です。