Binary Semaphore upset by FIQ

semaphore_take:   

    mov    w2, #1                 // LOCK value
    dmb    sy                     // ensure all observers observe data before aquire is attempted
    ldaxr    w1, [x0]             // attempt to read and aquire lock
    cbnz    w1, semaphore_take    // lock is not zero so loop and try and aquire again
    stxr    w3, w2, [x0]          // attempt to store LOCK value
    cbnz    w3, semaphore_take    // retry if store failed
    dmb    sy                     // ensures that all subsequent accesses are observed after gaining of the lock is observed

The above semaphore code worked flawlessly until the moment I added FIQ code.

Now the semaphore leaks thru critical sections even though the FIQ does not come anywhere near the semaphore.

Is there something I need to know about FIQ and LDREX/STREX functions?

Parents
No Data
Reply Children