Description
Conditionally stores the contents of register rD, into the word aligned memory location that results from adding the contents of registers rA and rB. If an AXI4 interconnect with exclusive access enabled is used, the store occurs if the interconnect response is EXOKAY, and the reservation bit is set; otherwise the store occurs when the reservation bit is set. The carry flag (MSR[C]) is set if the store does not occur, otherwise it is cleared. The reservation bit is cleared.
A data TLB miss exception occurs if virtual protected mode is enabled, and a valid translation entry corresponding to the address is not found in the TLB.
A data storage exception occurs if virtual protected mode is enabled, and access is prevented by no-access-allowed or read-only zone protection. No-access-allowed can only occur in user mode.
An unaligned data access exception will not occur even if the two least significant bits in the address are not zero.
Enabling AXI exclusive access ensures that the operation is protected from
other bus masters, but requires that the addressed slave supports exclusive access.
When exclusive access is not enabled, only the internal reservation bit is used.
Exclusive access is enabled using the two parameters
C_M_AXI_DP_EXCLUSIVE_ACCESS
and
C_M_AXI_DC_EXCLUSIVE_ACCESS
for the peripheral and cache
interconnect, respectively.
Pseudocode
Addr ← (rA) + (rB)
if Reservation = 0 then
MSR[C] ← 1
else
if TLB_Miss(Addr) and MSR[VM] = 1 then
ESR[EC ← 10010; ESR[S] ← 1
MSR[UMS] ← MSR[UM]; MSR[VMS] ← MSR[VM]; MSR[UM] ← 0; MSR[VM] ← 0
else if Access_Protected(Addr) and MSR[VM] = 1 then
ESR[EC] ← 10000; ESR[S] ← 1 ; ESR[DIZ] ← No-access-allowed
MSR[UMS] ← MSR[UM]; MSR[VMS] ← MSR[VM]; MSR[UM] ← 0; MSR[VM] ← 0
else
Reservation ← 0
if AXI_Exclusive(Addr) and AXI_Response ≠ EXOKAY then
MSR[C] ← 1
else
Mem(Addr) ← (rD)[0:31]
MSR[C] ← 0
Registers Altered
- MSR[C], unless an exception is generated
- MSR[UM], MSR[VM], MSR[UMS], MSR[VMS], if a TLB miss exception or a data storage exception is generated
- ESR[EC], ESR[S], if an exception is generated
- ESR[DIZ], if a data storage exception is generated
Latency
- 1 cycle with
C_AREA_OPTIMIZED
=0 or 2 - 2 cycles with
C_AREA_OPTIMIZED
=1
Notes
- This instruction is used together with LWX to implement exclusive access, such as semaphores and spinlocks.
- The carry flag (MSR[C]) might not be set immediately (dependent on pipeline stall behavior). The SWX instruction should not be immediately followed by an MSRCLR, MSRSET, MTS, or SRC instruction, to ensure the correct value of the carry flag is obtained.