30.7.1. ARM LDXR and STXR instructions

Parent section: atomic.cpp

LDXR and STXR vs LDAXR and STLXR: https://stackoverflow.com/questions/21535058/arm64-ldxr-stxr-vs-ldaxr-stlxr TODO understand better and example.

LDXR and STXR for a so-called "Load-link/store-conditional" (LLSC) pattern: https://en.wikipedia.org/wiki/Load-link/store-conditional which appears in many RISC ISAs.

This pattern makes it such that basically:

  • LDXR marks an address for exclusive access by the current CPU

  • STXR:

    • marks the address as not being exclusive to other CPUs that may have done LDXR before

    • loads fine if the address is still marked as exclusive, and stores 0 on a third register for success

    • fails to load if the address is not, and stores 1 on the third register for failure

In case of failure, we just have to loop back to just before the LDXR and try again.

This is therefore basically a spinlock and should only be used to cover very short critical sections such as atomic increments.