; Implementation of synchronization functions for ARM architecture (AArch64) ; ; Copyright (c) 2012-2015, ARM Limited. All rights reserved. ; Copyright (c) 2015, Linaro Limited. All rights reserved. ; ; This program and the accompanying materials ; are licensed and made available under the terms and conditions of the BSD License ; which accompanies this distribution. The full text of the license may be found at ; http://opensource.org/licenses/bsd-license.php ; ; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, ; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. ; ; EXPORT InternalSyncCompareExchange16 EXPORT InternalSyncCompareExchange32 EXPORT InternalSyncCompareExchange64 EXPORT InternalSyncIncrement EXPORT InternalSyncDecrement AREA BaseSynchronizationLib_LowLevel, CODE, READONLY ;/** ; Performs an atomic compare exchange operation on a 16-bit unsigned integer. ; ; Performs an atomic compare exchange operation on the 16-bit unsigned integer ; specified by Value. If Value is equal to CompareValue, then Value is set to ; ExchangeValue and CompareValue is returned. If Value is not equal to CompareValue, ; then Value is returned. The compare exchange operation must be performed using ; MP safe mechanisms. ; ; @param Value A pointer to the 16-bit value for the compare exchange ; operation. ; @param CompareValue 16-bit value used in compare operation. ; @param ExchangeValue 16-bit value used in exchange operation. ; ; @return The original *Value before exchange. ; ;**/ ;UINT16 ;EFIAPI ;InternalSyncCompareExchange16 ( ; IN volatile UINT16 *Value, ; IN UINT16 CompareValue, ; IN UINT16 ExchangeValue ; ) InternalSyncCompareExchange16 uxth w1, w1 uxth w2, w2 dmb sy InternalSyncCompareExchange16Again ldxrh w3, [x0] cmp w3, w1 bne InternalSyncCompareExchange16Fail InternalSyncCompareExchange16Exchange stxrh w4, w2, [x0] cbnz w4, InternalSyncCompareExchange16Again InternalSyncCompareExchange16Fail dmb sy mov w0, w3 ret ;/** ; Performs an atomic compare exchange operation on a 32-bit unsigned integer. ; ; Performs an atomic compare exchange operation on the 32-bit unsigned integer ; specified by Value. If Value is equal to CompareValue, then Value is set to ; ExchangeValue and CompareValue is returned. If Value is not equal to CompareValue, ; then Value is returned. The compare exchange operation must be performed using ; MP safe mechanisms. ; ; @param Value A pointer to the 32-bit value for the compare exchange ; operation. ; @param CompareValue 32-bit value used in compare operation. ; @param ExchangeValue 32-bit value used in exchange operation. ; ; @return The original *Value before exchange. ; ;**/ ;UINT32 ;EFIAPI ;InternalSyncCompareExchange32 ( ; IN volatile UINT32 *Value, ; IN UINT32 CompareValue, ; IN UINT32 ExchangeValue ; ) InternalSyncCompareExchange32 dmb sy InternalSyncCompareExchange32Again ldxr w3, [x0] cmp w3, w1 bne InternalSyncCompareExchange32Fail InternalSyncCompareExchange32Exchange stxr w4, w2, [x0] cbnz w4, InternalSyncCompareExchange32Again InternalSyncCompareExchange32Fail dmb sy mov w0, w3 ret ;/** ; Performs an atomic compare exchange operation on a 64-bit unsigned integer. ; ; Performs an atomic compare exchange operation on the 64-bit unsigned integer specified ; by Value. If Value is equal to CompareValue, then Value is set to ExchangeValue and ; CompareValue is returned. If Value is not equal to CompareValue, then Value is returned. ; The compare exchange operation must be performed using MP safe mechanisms. ; ; @param Value A pointer to the 64-bit value for the compare exchange ; operation. ; @param CompareValue 64-bit value used in compare operation. ; @param ExchangeValue 64-bit value used in exchange operation. ; ; @return The original *Value before exchange. ; ;**/ ;UINT64 ;EFIAPI ;InternalSyncCompareExchange64 ( ; IN volatile UINT64 *Value, ; IN UINT64 CompareValue, ; IN UINT64 ExchangeValue ; ) InternalSyncCompareExchange64 dmb sy InternalSyncCompareExchange64Again ldxr x3, [x0] cmp x3, x1 bne InternalSyncCompareExchange64Fail InternalSyncCompareExchange64Exchange stxr w4, x2, [x0] cbnz w4, InternalSyncCompareExchange64Again InternalSyncCompareExchange64Fail dmb sy mov x0, x3 ret ;/** ; Performs an atomic increment of an 32-bit unsigned integer. ; ; Performs an atomic increment of the 32-bit unsigned integer specified by ; Value and returns the incremented value. The increment operation must be ; performed using MP safe mechanisms. The state of the return value is not ; guaranteed to be MP safe. ; ; @param Value A pointer to the 32-bit value to increment. ; ; @return The incremented value. ; ;**/ ;UINT32 ;EFIAPI ;InternalSyncIncrement ( ; IN volatile UINT32 *Value ; ) InternalSyncIncrement dmb sy TryInternalSyncIncrement ldxr w1, [x0] add w1, w1, #1 stxr w2, w1, [x0] cbnz w2, TryInternalSyncIncrement mov w0, w1 dmb sy ret ;/** ; Performs an atomic decrement of an 32-bit unsigned integer. ; ; Performs an atomic decrement of the 32-bit unsigned integer specified by ; Value and returns the decrement value. The decrement operation must be ; performed using MP safe mechanisms. The state of the return value is not ; guaranteed to be MP safe. ; ; @param Value A pointer to the 32-bit value to decrement. ; ; @return The decrement value. ; ;**/ ;UINT32 ;EFIAPI ;InternalSyncDecrement ( ; IN volatile UINT32 *Value ; ) InternalSyncDecrement dmb sy TryInternalSyncDecrement ldxr w1, [x0] sub w1, w1, #1 stxr w2, w1, [x0] cbnz w2, TryInternalSyncDecrement mov w0, w1 dmb sy ret END