diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_add_16.S b/common/lib/libc/arch/aarch64/atomic/atomic_add_16.S index a088a2bb070f..56154c7ffd07 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_add_16.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_add_16.S @@ -35,12 +35,24 @@ ATOMIC_OP16(add, add) ATOMIC_OP_ALIAS(atomic_add_16,_atomic_add_16) ATOMIC_OP_ALIAS(atomic_add_short,_atomic_add_16) -STRONG_ALIAS(__sync_fetch_and_add_2,_atomic_add_16) STRONG_ALIAS(_atomic_add_short,_atomic_add_16) +ENTRY_NP(__sync_fetch_and_add_2) + mov x5, lr + bl _atomic_add_16 + dmb ish + ret x5 +END(__sync_fetch_and_add_2) + ATOMIC_OP16_NV(add, add) ATOMIC_OP_ALIAS(atomic_add_16_nv,_atomic_add_16_nv) ATOMIC_OP_ALIAS(atomic_add_short_nv,_atomic_add_16_nv) -STRONG_ALIAS(__sync_add_and_fetch_2,_atomic_add_16_nv) STRONG_ALIAS(_atomic_add_short_nv,_atomic_add_16_nv) + +ENTRY_NP(__sync_add_and_fetch_2) + mov x5, lr + bl _atomic_add_16_nv + dmb ish + ret x5 +END(__sync_add_and_fetch_2) diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_add_32.S b/common/lib/libc/arch/aarch64/atomic/atomic_add_32.S index c157f6895a5f..7f898e7b89eb 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_add_32.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_add_32.S @@ -35,12 +35,24 @@ ATOMIC_OP32(add, add) ATOMIC_OP_ALIAS(atomic_add_32,_atomic_add_32) ATOMIC_OP_ALIAS(atomic_add_int,_atomic_add_32) -STRONG_ALIAS(__sync_fetch_and_add_4,_atomic_add_32) STRONG_ALIAS(_atomic_add_int,_atomic_add_32) +ENTRY_NP(__sync_fetch_and_add_4) + mov x5, lr + bl _atomic_add_32 + dmb ish + ret x5 +END(__sync_fetch_and_add_4) + ATOMIC_OP32_NV(add, add) ATOMIC_OP_ALIAS(atomic_add_32_nv,_atomic_add_32_nv) ATOMIC_OP_ALIAS(atomic_add_int_nv,_atomic_add_32_nv) -STRONG_ALIAS(__sync_add_and_fetch_4,_atomic_add_32_nv) STRONG_ALIAS(_atomic_add_int_nv,_atomic_add_32_nv) + +ENTRY_NP(__sync_add_and_fetch_4) + mov x5, lr + bl _atomic_add_32_nv + dmb ish + ret x5 +END(__sync_add_and_fetch_4) diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_add_64.S b/common/lib/libc/arch/aarch64/atomic/atomic_add_64.S index d815b8db456a..c29f6485e13f 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_add_64.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_add_64.S @@ -38,7 +38,13 @@ ATOMIC_OP_ALIAS(atomic_add_ptr_nv,_atomic_add_64_nv) ATOMIC_OP_ALIAS(atomic_add_long_nv,_atomic_add_64_nv) STRONG_ALIAS(_atomic_add_ptr_nv,_atomic_add_64_nv) STRONG_ALIAS(_atomic_add_long_nv,_atomic_add_64_nv) -STRONG_ALIAS(__sync_add_and_fetch_8,_atomic_add_64_nv) + +ENTRY_NP(__sync_add_and_fetch_8) + mov x5, lr + bl _atomic_add_64_nv + dmb ish + ret x5 +END(__sync_add_and_fetch_8) ATOMIC_OP64_NV(add, add) @@ -47,4 +53,10 @@ ATOMIC_OP_ALIAS(atomic_add_ptr,_atomic_add_64) ATOMIC_OP_ALIAS(atomic_add_long,_atomic_add_64) STRONG_ALIAS(_atomic_add_ptr,_atomic_add_64) STRONG_ALIAS(_atomic_add_long,_atomic_add_64) -STRONG_ALIAS(__sync_fetch_and_add_8,_atomic_add_64) + +ENTRY_NP(__sync_fetch_and_add_8) + mov x5, lr + bl _atomic_add_64 + dmb ish + ret x5 +END(__sync_fetch_and_add_8) diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_add_8.S b/common/lib/libc/arch/aarch64/atomic/atomic_add_8.S index 3dc5a2a55e42..e26b11ed60e8 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_add_8.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_add_8.S @@ -35,12 +35,24 @@ ATOMIC_OP8(add, add) ATOMIC_OP_ALIAS(atomic_add_8,_atomic_add_8) ATOMIC_OP_ALIAS(atomic_add_char,_atomic_add_8) -STRONG_ALIAS(__sync_fetch_and_add_1,_atomic_add_8) STRONG_ALIAS(_atomic_add_char,_atomic_add_8) +ENTRY_NP(__sync_fetch_and_add_1) + mov x5, lr + bl _atomic_add_8 + dmb ish + ret x5 +END(__sync_fetch_and_add_1) + ATOMIC_OP8_NV(add, add) ATOMIC_OP_ALIAS(atomic_add_8_nv,_atomic_add_8_nv) ATOMIC_OP_ALIAS(atomic_add_char_nv,_atomic_add_8_nv) -STRONG_ALIAS(__sync_add_and_fetch_1,_atomic_add_8_nv) STRONG_ALIAS(_atomic_add_char_nv,_atomic_add_8_nv) + +ENTRY_NP(__sync_add_and_fetch_1) + mov x5, lr + bl _atomic_add_8_nv + dmb ish + ret x5 +END(__sync_add_and_fetch_1) diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_and_16.S b/common/lib/libc/arch/aarch64/atomic/atomic_and_16.S index f7427fe45b06..a020883f7528 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_and_16.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_and_16.S @@ -35,12 +35,24 @@ ATOMIC_OP16(and, and) ATOMIC_OP_ALIAS(atomic_and_16,_atomic_and_16) ATOMIC_OP_ALIAS(atomic_and_ushort,_atomic_and_16) -STRONG_ALIAS(__sync_fetch_and_and_2,_atomic_and_16) STRONG_ALIAS(_atomic_and_ushort,_atomic_and_16) +ENTRY_NP(__sync_fetch_and_and_2) + mov x5, lr + bl _atomic_and_16 + dmb ish + ret x5 +END(__sync_fetch_and_and_2) + ATOMIC_OP16_NV(and, and) ATOMIC_OP_ALIAS(atomic_and_16_nv,_atomic_and_16_nv) ATOMIC_OP_ALIAS(atomic_and_ushort_nv,_atomic_and_16_nv) -STRONG_ALIAS(__sync_and_and_fetch_2,_atomic_and_16_nv) STRONG_ALIAS(_atomic_and_ushort_nv,_atomic_and_16_nv) + +ENTRY_NP(__sync_and_and_fetch_2) + mov x5, lr + bl _atomic_and_16_nv + dmb ish + ret x5 +END(__sync_and_and_fetch_2) diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_and_32.S b/common/lib/libc/arch/aarch64/atomic/atomic_and_32.S index 44ea5f04a589..45f9c18f25d1 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_and_32.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_and_32.S @@ -35,12 +35,24 @@ ATOMIC_OP32(and, and) ATOMIC_OP_ALIAS(atomic_and_32,_atomic_and_32) ATOMIC_OP_ALIAS(atomic_and_uint,_atomic_and_32) -STRONG_ALIAS(__sync_fetch_and_and_4,_atomic_and_32) STRONG_ALIAS(_atomic_and_uint,_atomic_and_32) +ENTRY_NP(__sync_fetch_and_and_4) + mov x5, lr + bl _atomic_and_32 + dmb ish + ret x5 +END(__sync_fetch_and_and_4) + ATOMIC_OP32_NV(and, and) ATOMIC_OP_ALIAS(atomic_and_32_nv,_atomic_and_32_nv) ATOMIC_OP_ALIAS(atomic_and_uint_nv,_atomic_and_32_nv) -STRONG_ALIAS(__sync_and_and_fetch_4,_atomic_and_32_nv) STRONG_ALIAS(_atomic_and_uint_nv,_atomic_and_32_nv) + +ENTRY_NP(__sync_and_and_fetch_4) + mov x5, lr + bl _atomic_and_32_nv + dmb ish + ret x5 +END(__sync_and_and_fetch_4) diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_and_64.S b/common/lib/libc/arch/aarch64/atomic/atomic_and_64.S index 9e3a86eb0c35..a6c4d0157858 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_and_64.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_and_64.S @@ -36,11 +36,23 @@ ATOMIC_OP64(and, and) ATOMIC_OP_ALIAS(atomic_and_64,_atomic_and_64) ATOMIC_OP_ALIAS(atomic_and_ulong,_atomic_and_64) STRONG_ALIAS(_atomic_and_ulong,_atomic_and_64) -STRONG_ALIAS(__sync_fetch_and_and_8,_atomic_and_64) + +ENTRY_NP(__sync_fetch_and_and_8) + mov x5, lr + bl _atomic_and_64 + dmb ish + ret x5 +END(__sync_fetch_and_and_8) ATOMIC_OP64_NV(and, and) ATOMIC_OP_ALIAS(atomic_and_64_nv,_atomic_and_64_nv) ATOMIC_OP_ALIAS(atomic_and_ulong_nv,_atomic_and_64_nv) STRONG_ALIAS(_atomic_and_ulong_nv,_atomic_and_64_nv) -STRONG_ALIAS(__sync_and_and_fetch_8,_atomic_and_64_nv) + +ENTRY_NP(__sync_and_and_fetch_8) + mov x5, lr + bl _atomic_and_64_nv + dmb ish + ret x5 +END(__sync_and_and_fetch_8) diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_and_8.S b/common/lib/libc/arch/aarch64/atomic/atomic_and_8.S index bad4e7e02cf2..63f21602e6d0 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_and_8.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_and_8.S @@ -35,12 +35,24 @@ ATOMIC_OP8(and, and) ATOMIC_OP_ALIAS(atomic_and_8,_atomic_and_8) ATOMIC_OP_ALIAS(atomic_and_uchar,_atomic_and_8) -STRONG_ALIAS(__sync_fetch_and_and_1,_atomic_and_8) STRONG_ALIAS(_atomic_and_uchar,_atomic_and_8) +ENTRY_NP(__sync_fetch_and_and_1) + mov x5, lr + bl _atomic_and_8 + dmb ish + ret x5 +END(__sync_fetch_and_and_1) + ATOMIC_OP8_NV(and, and) ATOMIC_OP_ALIAS(atomic_and_8_nv,_atomic_and_8_nv) ATOMIC_OP_ALIAS(atomic_and_uchar_nv,_atomic_and_8_nv) -STRONG_ALIAS(__sync_and_and_fetch_1,_atomic_and_8_nv) STRONG_ALIAS(_atomic_and_uchar_nv,_atomic_and_8_nv) + +ENTRY_NP(__sync_and_and_fetch_1) + mov x5, lr + bl _atomic_and_8_nv + dmb ish + ret x5 +END(__sync_and_and_fetch_1) diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_cas_16.S b/common/lib/libc/arch/aarch64/atomic/atomic_cas_16.S index a499ff6dbef9..364451f8cbfb 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_cas_16.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_cas_16.S @@ -46,3 +46,10 @@ ATOMIC_OP_ALIAS(atomic_cas_16,_atomic_cas_16) STRONG_ALIAS(_atomic_cas_short,_atomic_cas_16) STRONG_ALIAS(_atomic_cas_ushort,_atomic_cas_16) STRONG_ALIAS(__sync_val_compare_and_swap_2,_atomic_cas_16) + +ENTRY_NP(__sync_val_compare_and_swap_2) + mov x5, lr + bl _atomic_cas_16 + dmb ish + ret x5 +END(__sync_val_compare_and_swap_2) diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_cas_32.S b/common/lib/libc/arch/aarch64/atomic/atomic_cas_32.S index ec538f16b70f..9091a9a99839 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_cas_32.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_cas_32.S @@ -46,7 +46,13 @@ ATOMIC_OP_ALIAS(atomic_cas_32,_atomic_cas_32) ATOMIC_OP_ALIAS(atomic_cas_uint,_atomic_cas_32) ATOMIC_OP_ALIAS(atomic_cas_32_ni,_atomic_cas_32) ATOMIC_OP_ALIAS(atomic_cas_uint_ni,_atomic_cas_32) -STRONG_ALIAS(__sync_val_compare_and_swap_4,_atomic_cas_32) STRONG_ALIAS(_atomic_cas_uint,_atomic_cas_32) STRONG_ALIAS(_atomic_cas_32_ni,_atomic_cas_32) STRONG_ALIAS(_atomic_cas_uint_ni,_atomic_cas_32) + +ENTRY_NP(__sync_val_compare_and_swap_4) + mov x5, lr + bl _atomic_cas_32 + dmb ish + ret x5 +END(__sync_val_compare_and_swap_4) diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_cas_64.S b/common/lib/libc/arch/aarch64/atomic/atomic_cas_64.S index a46545dd050f..b4bcd6149975 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_cas_64.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_cas_64.S @@ -48,9 +48,15 @@ ATOMIC_OP_ALIAS(atomic_cas_ptr,_atomic_cas_64) ATOMIC_OP_ALIAS(atomic_cas_64_ni,_atomic_cas_64) ATOMIC_OP_ALIAS(atomic_cas_ulong_ni,_atomic_cas_64) ATOMIC_OP_ALIAS(atomic_cas_ptr_ni,_atomic_cas_64) -STRONG_ALIAS(__sync_val_compare_and_swap_8,_atomic_cas_64) STRONG_ALIAS(_atomic_cas_ulong,_atomic_cas_64) STRONG_ALIAS(_atomic_cas_ptr,_atomic_cas_64) STRONG_ALIAS(_atomic_cas_64_ni,_atomic_cas_64) STRONG_ALIAS(_atomic_cas_ulong_ni,_atomic_cas_64) STRONG_ALIAS(_atomic_cas_ptr_ni,_atomic_cas_64) + +ENTRY_NP(__sync_val_compare_and_swap_8) + mov x5, lr + bl _atomic_cas_64 + dmb ish + ret x5 +END(__sync_val_compare_and_swap_8) diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_cas_8.S b/common/lib/libc/arch/aarch64/atomic/atomic_cas_8.S index 939ff2a8db3a..86493dd8a89c 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_cas_8.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_cas_8.S @@ -45,4 +45,10 @@ END(_atomic_cas_8) ATOMIC_OP_ALIAS(atomic_cas_8,_atomic_cas_8) STRONG_ALIAS(_atomic_cas_char,_atomic_cas_8) STRONG_ALIAS(_atomic_cas_uchar,_atomic_cas_8) -STRONG_ALIAS(__sync_val_compare_and_swap_1,_atomic_cas_8) + +ENTRY_NP(__sync_val_compare_and_swap_1) + mov x5, lr + bl _atomic_cas_8 + dmb ish + ret x5 +END(__sync_val_compare_and_swap_1) diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_nand_16.S b/common/lib/libc/arch/aarch64/atomic/atomic_nand_16.S index df65b9f4d55c..6087ada762e0 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_nand_16.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_nand_16.S @@ -44,9 +44,16 @@ END(_atomic_nand_16) ATOMIC_OP_ALIAS(atomic_nand_16,_atomic_nand_16) ATOMIC_OP_ALIAS(atomic_nand_ushort,_atomic_nand_16) -STRONG_ALIAS(__sync_fetch_and_nand_2,_atomic_nand_16) STRONG_ALIAS(_atomic_nand_ushort,_atomic_nand_16) +ENTRY_NP(__sync_fetch_and_nand_2) + mov x5, lr + bl _atomic_nand_16 + dmb ish + ret x5 +END(__sync_fetch_and_nand_2) + + ENTRY_NP(_atomic_nand_16_nv) mov x4, x0 /* need r0 for return value */ 1: ldxrh w0, [x4] /* load old value */ @@ -60,5 +67,11 @@ END(_atomic_nand_16_nv) ATOMIC_OP_ALIAS(atomic_nand_16_nv,_atomic_nand_16_nv) ATOMIC_OP_ALIAS(atomic_nand_ushort_nv,_atomic_nand_16_nv) -STRONG_ALIAS(__sync_nand_and_fetch_2,_atomic_nand_16_nv) STRONG_ALIAS(_atomic_nand_ushort_nv,_atomic_nand_16_nv) + +ENTRY_NP(__sync_nand_and_fetch_2) + mov x5, lr + bl _atomic_nand_16_nv + dmb ish + ret x5 +END(__sync_nand_and_fetch_2) diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_nand_32.S b/common/lib/libc/arch/aarch64/atomic/atomic_nand_32.S index bb5724cc5a54..32e5beace9df 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_nand_32.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_nand_32.S @@ -44,9 +44,15 @@ END(_atomic_nand_32) ATOMIC_OP_ALIAS(atomic_nand_32,_atomic_nand_32) ATOMIC_OP_ALIAS(atomic_nand_uint,_atomic_nand_32) -STRONG_ALIAS(__sync_fetch_and_nand_4,_atomic_nand_32) STRONG_ALIAS(_atomic_nand_uint,_atomic_nand_32) +ENTRY_NP(__sync_fetch_and_nand_4) + mov x5, lr + bl _atomic_nand_32 + dmb ish + ret x5 +END(__sync_fetch_and_nand_4) + ENTRY_NP(_atomic_nand_32_nv) mov x4, x0 /* need r0 for return value */ 1: ldxr w0, [x4] /* load old value */ @@ -60,5 +66,11 @@ END(_atomic_nand_32_nv) ATOMIC_OP_ALIAS(atomic_nand_32_nv,_atomic_nand_32_nv) ATOMIC_OP_ALIAS(atomic_nand_uint_nv,_atomic_nand_32_nv) -STRONG_ALIAS(__sync_nand_and_fetch_4,_atomic_nand_32_nv) STRONG_ALIAS(_atomic_nand_uint_nv,_atomic_nand_32_nv) + +ENTRY_NP(__sync_nand_and_fetch_4) + mov x5, lr + bl _atomic_nand_32_nv + dmb ish + ret x5 +END(__sync_nand_and_fetch_4) diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_nand_64.S b/common/lib/libc/arch/aarch64/atomic/atomic_nand_64.S index f21498dcfe6d..1c42bbead8a9 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_nand_64.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_nand_64.S @@ -44,9 +44,15 @@ END(_atomic_nand_64) ATOMIC_OP_ALIAS(atomic_nand_64,_atomic_nand_64) ATOMIC_OP_ALIAS(atomic_nand_ulong,_atomic_nand_64) -STRONG_ALIAS(__sync_fetch_and_nand_8,_atomic_nand_64) STRONG_ALIAS(_atomic_nand_ulong,_atomic_nand_64) +ENTRY_NP(__sync_fetch_and_nand_8) + mov x5, lr + bl _atomic_nand_64 + dmb ish + ret x5 +END(__sync_fetch_and_nand_8) + ENTRY_NP(_atomic_nand_64_nv) mov x4, x0 /* need r0 for return value */ 1: ldxr x0, [x4] /* load old value */ @@ -60,5 +66,11 @@ END(_atomic_nand_64_nv) ATOMIC_OP_ALIAS(atomic_nand_64_nv,_atomic_nand_64_nv) ATOMIC_OP_ALIAS(atomic_nand_ulong_nv,_atomic_nand_64_nv) -STRONG_ALIAS(__sync_nand_and_fetch_8,_atomic_nand_64_nv) STRONG_ALIAS(_atomic_nand_ulong_nv,_atomic_nand_64_nv) + +ENTRY_NP(__sync_nand_and_fetch_8) + mov x5, lr + bl _atomic_nand_64_nv + dmb ish + ret x5 +END(__sync_nand_and_fetch_8) diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_nand_8.S b/common/lib/libc/arch/aarch64/atomic/atomic_nand_8.S index 8b473e28b1de..ce78873343b8 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_nand_8.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_nand_8.S @@ -44,9 +44,16 @@ END(_atomic_nand_8) ATOMIC_OP_ALIAS(atomic_nand_8,_atomic_nand_8) ATOMIC_OP_ALIAS(atomic_nand_uchar,_atomic_nand_8) -STRONG_ALIAS(__sync_fetch_and_nand_1,_atomic_nand_8) STRONG_ALIAS(_atomic_nand_uchar,_atomic_nand_8) +ENTRY_NP(__sync_fetch_and_nand_1) + mov x5, lr + bl _atomic_nand_8 + dmb ish + ret x5 +END(__sync_fetch_and_nand_1) + + ENTRY_NP(_atomic_nand_8_nv) mov x4, x0 /* need r0 for return value */ 1: ldxrb w0, [x4] /* load old value */ @@ -60,5 +67,11 @@ END(_atomic_nand_8_nv) ATOMIC_OP_ALIAS(atomic_nand_8_nv,_atomic_nand_8_nv) ATOMIC_OP_ALIAS(atomic_nand_uchar_nv,_atomic_nand_8_nv) -STRONG_ALIAS(__sync_nand_and_fetch_1,_atomic_nand_8_nv) STRONG_ALIAS(_atomic_nand_uchar_nv,_atomic_nand_8_nv) + +ENTRY_NP(__sync_nand_and_fetch_1) + mov x5, lr + bl _atomic_nand_8_nv + dmb ish + ret x5 +END(__sync_nand_and_fetch_1) diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_or_16.S b/common/lib/libc/arch/aarch64/atomic/atomic_or_16.S index e167734759cc..2b9a7a62bb97 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_or_16.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_or_16.S @@ -35,12 +35,24 @@ ATOMIC_OP16(or, orr) ATOMIC_OP_ALIAS(atomic_or_16,_atomic_or_16) ATOMIC_OP_ALIAS(atomic_or_ushort,_atomic_or_16) -STRONG_ALIAS(__sync_fetch_and_or_2,_atomic_or_16) STRONG_ALIAS(_atomic_or_ushort,_atomic_or_16) +ENTRY_NP(__sync_fetch_and_or_2) + mov x5, lr + bl _atomic_or_16 + dmb ish + ret x5 +END(__sync_fetch_and_or_2) + ATOMIC_OP16_NV(or, orr) ATOMIC_OP_ALIAS(atomic_or_16_nv,_atomic_or_16_nv) ATOMIC_OP_ALIAS(atomic_or_ushort_nv,_atomic_or_16_nv) -STRONG_ALIAS(__sync_or_and_fetch_2,_atomic_or_16_nv) STRONG_ALIAS(_atomic_or_ushort_nv,_atomic_or_16_nv) + +ENTRY_NP(__sync_or_and_fetch_2) + mov x5, lr + bl _atomic_or_16_nv + dmb ish + ret x5 +END(__sync_or_and_fetch_2) diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_or_32.S b/common/lib/libc/arch/aarch64/atomic/atomic_or_32.S index 2411812ca7d3..9f19ca6ce4fe 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_or_32.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_or_32.S @@ -35,12 +35,24 @@ ATOMIC_OP32(or, orr) ATOMIC_OP_ALIAS(atomic_or_32,_atomic_or_32) ATOMIC_OP_ALIAS(atomic_or_uint,_atomic_or_32) -STRONG_ALIAS(__sync_fetch_and_or_4,_atomic_or_32) STRONG_ALIAS(_atomic_or_uint,_atomic_or_32) +ENTRY_NP(__sync_fetch_and_or_4) + mov x5, lr + bl _atomic_or_32 + dmb ish + ret x5 +END(__sync_fetch_and_or_4) + ATOMIC_OP32_NV(or, orr) ATOMIC_OP_ALIAS(atomic_or_32_nv,_atomic_or_32_nv) ATOMIC_OP_ALIAS(atomic_or_uint_nv,_atomic_or_32_nv) -STRONG_ALIAS(__sync_or_and_fetch_4,_atomic_or_32_nv) STRONG_ALIAS(_atomic_or_uint_nv,_atomic_or_32_nv) + +ENTRY_NP(__sync_or_and_fetch_4) + mov x5, lr + bl _atomic_or_32_nv + dmb ish + ret x5 +END(__sync_or_and_fetch_4) diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_or_64.S b/common/lib/libc/arch/aarch64/atomic/atomic_or_64.S index c99351930c33..b443dbde7fae 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_or_64.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_or_64.S @@ -36,11 +36,23 @@ ATOMIC_OP64(or, orr) ATOMIC_OP_ALIAS(atomic_or_64,_atomic_or_64) ATOMIC_OP_ALIAS(atomic_or_ulong,_atomic_or_64) STRONG_ALIAS(_atomic_or_ulong,_atomic_or_64) -STRONG_ALIAS(__sync_fetch_and_or_8,_atomic_or_64) + +ENTRY_NP(__sync_fetch_and_or_8) + mov x5, lr + bl _atomic_or_64 + dmb ish + ret x5 +END(__sync_fetch_and_or_8) ATOMIC_OP64_NV(or, orr) STRONG_ALIAS(_atomic_or_ulong_nv,_atomic_or_64_nv) ATOMIC_OP_ALIAS(atomic_or_64_nv,_atomic_or_64_nv) ATOMIC_OP_ALIAS(atomic_or_ulong_nv,_atomic_or_64_nv) -STRONG_ALIAS(__sync_or_and_fetch_8,_atomic_or_64_nv) + +ENTRY_NP(__sync_or_and_fetch_8) + mov x5, lr + bl _atomic_or_64_nv + dmb ish + ret x5 +END(__sync_or_and_fetch_8) diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_or_8.S b/common/lib/libc/arch/aarch64/atomic/atomic_or_8.S index 3f4e5615f277..49738f1ef0fb 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_or_8.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_or_8.S @@ -35,12 +35,24 @@ ATOMIC_OP8(or, orr) ATOMIC_OP_ALIAS(atomic_or_8,_atomic_or_8) ATOMIC_OP_ALIAS(atomic_or_uchar,_atomic_or_8) -STRONG_ALIAS(__sync_fetch_and_or_1,_atomic_or_8) STRONG_ALIAS(_atomic_or_uchar,_atomic_or_8) +ENTRY_NP(__sync_fetch_and_or_1) + mov x5, lr + bl _atomic_or_8 + dmb ish + ret x5 +END(__sync_fetch_and_or_1) + ATOMIC_OP8_NV(or, orr) ATOMIC_OP_ALIAS(atomic_or_8_nv,_atomic_or_8_nv) ATOMIC_OP_ALIAS(atomic_or_uchar_nv,_atomic_or_8_nv) -STRONG_ALIAS(__sync_or_and_fetch_1,_atomic_or_8_nv) STRONG_ALIAS(_atomic_or_uchar_nv,_atomic_or_8_nv) + +ENTRY_NP(__sync_or_and_fetch_1) + mov x5, lr + bl _atomic_or_8_nv + dmb ish + ret x5 +END(__sync_or_and_fetch_1) diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_sub_16.S b/common/lib/libc/arch/aarch64/atomic/atomic_sub_16.S index 44554e475013..2df3ccc94945 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_sub_16.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_sub_16.S @@ -36,15 +36,27 @@ ATOMIC_OP16(sub, sub) ATOMIC_OP_ALIAS(atomic_sub_16,_atomic_sub_16) ATOMIC_OP_ALIAS(atomic_sub_short,_atomic_sub_16) ATOMIC_OP_ALIAS(atomic_sub_ushort,_atomic_sub_16) -STRONG_ALIAS(__sync_fetch_and_sub_2,_atomic_sub_16) STRONG_ALIAS(_atomic_sub_short,_atomic_sub_16) STRONG_ALIAS(_atomic_sub_ushort,_atomic_sub_16) +ENTRY_NP(__sync_fetch_and_sub_2) + mov x5, lr + bl _atomic_sub_16 + dmb ish + ret x5 +END(__sync_fetch_and_sub_2) + ATOMIC_OP16_NV(sub, sub) ATOMIC_OP_ALIAS(atomic_sub_16_nv,_atomic_sub_16_nv) ATOMIC_OP_ALIAS(atomic_sub_short_nv,_atomic_sub_16_nv) ATOMIC_OP_ALIAS(atomic_sub_ushort_nv,_atomic_sub_16_nv) -STRONG_ALIAS(__sync_sub_and_fetch_2,_atomic_sub_16_nv) STRONG_ALIAS(_atomic_sub_short_nv,_atomic_sub_16_nv) STRONG_ALIAS(_atomic_sub_ushort_nv,_atomic_sub_16_nv) + +ENTRY_NP(__sync_sub_and_fetch_2) + mov x5, lr + bl _atomic_sub_16_nv + dmb ish + ret x5 +END(__sync_sub_and_fetch_2) diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_sub_32.S b/common/lib/libc/arch/aarch64/atomic/atomic_sub_32.S index b59c1d9399db..bf50e17dd831 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_sub_32.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_sub_32.S @@ -35,12 +35,24 @@ ATOMIC_OP32(sub, sub) ATOMIC_OP_ALIAS(atomic_sub_32,_atomic_sub_32) ATOMIC_OP_ALIAS(atomic_sub_int,_atomic_sub_32) -STRONG_ALIAS(__sync_fetch_and_sub_4,_atomic_sub_32) STRONG_ALIAS(_atomic_sub_int,_atomic_sub_32) +ENTRY_NP(__sync_fetch_and_sub_4) + mov x5, lr + bl _atomic_sub_32 + dmb ish + ret x5 +END(__sync_fetch_and_sub_4) + ATOMIC_OP32_NV(sub, sub) ATOMIC_OP_ALIAS(atomic_sub_32_nv,_atomic_sub_32_nv) ATOMIC_OP_ALIAS(atomic_sub_int_nv,_atomic_sub_32_nv) -STRONG_ALIAS(__sync_sub_and_fetch_4,_atomic_sub_32_nv) STRONG_ALIAS(_atomic_sub_int_nv,_atomic_sub_32_nv) + +ENTRY_NP(__sync_sub_and_fetch_4) + mov x5, lr + bl _atomic_sub_32_nv + dmb ish + ret x5 +END(__sync_sub_and_fetch_4) diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_sub_64.S b/common/lib/libc/arch/aarch64/atomic/atomic_sub_64.S index ce1706a04d4c..f9839d6559d8 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_sub_64.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_sub_64.S @@ -38,7 +38,13 @@ ATOMIC_OP_ALIAS(atomic_sub_ptr_nv,_atomic_sub_64_nv) ATOMIC_OP_ALIAS(atomic_sub_long_nv,_atomic_sub_64_nv) STRONG_ALIAS(_atomic_sub_ptr_nv,_atomic_sub_64_nv) STRONG_ALIAS(_atomic_sub_long_nv,_atomic_sub_64_nv) -STRONG_ALIAS(__sync_sub_and_fetch_8,_atomic_sub_64_nv) + +ENTRY_NP(__sync_sub_and_fetch_8) + mov x5, lr + bl _atomic_sub_64_nv + dmb ish + ret x5 +END(__sync_sub_and_fetch_8) ATOMIC_OP64_NV(sub, sub) @@ -47,4 +53,10 @@ ATOMIC_OP_ALIAS(atomic_sub_ptr,_atomic_sub_64) ATOMIC_OP_ALIAS(atomic_sub_long,_atomic_sub_64) STRONG_ALIAS(_atomic_sub_ptr,_atomic_sub_64) STRONG_ALIAS(_atomic_sub_long,_atomic_sub_64) -STRONG_ALIAS(__sync_fetch_and_sub_8,_atomic_sub_64) + +ENTRY_NP(__sync_fetch_and_sub_8) + mov x5, lr + bl _atomic_sub_64 + dmb ish + ret x5 +END(__sync_fetch_and_sub_8) diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_sub_8.S b/common/lib/libc/arch/aarch64/atomic/atomic_sub_8.S index 6bdb77483790..0a8379fc0dec 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_sub_8.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_sub_8.S @@ -35,12 +35,24 @@ ATOMIC_OP8(sub, sub) ATOMIC_OP_ALIAS(atomic_sub_8,_atomic_sub_8) ATOMIC_OP_ALIAS(atomic_sub_char,_atomic_sub_8) -STRONG_ALIAS(__sync_fetch_and_sub_1,_atomic_sub_8) STRONG_ALIAS(_atomic_sub_char,_atomic_sub_8) +ENTRY_NP(__sync_fetch_and_sub_1) + mov x5, lr + bl _atomic_sub_8 + dmb ish + ret x5 +END(__sync_fetch_and_sub_1) + ATOMIC_OP8_NV(sub, sub) ATOMIC_OP_ALIAS(atomic_sub_8_nv,_atomic_sub_8_nv) ATOMIC_OP_ALIAS(atomic_sub_char_nv,_atomic_sub_8_nv) -STRONG_ALIAS(__sync_sub_and_fetch_1,_atomic_sub_8_nv) STRONG_ALIAS(_atomic_sub_char_nv,_atomic_sub_8_nv) + +ENTRY_NP(__sync_sub_and_fetch_1) + mov x5, lr + bl _atomic_sub_8_nv + dmb ish + ret x5 +END(__sync_sub_and_fetch_1) diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_swap_16.S b/common/lib/libc/arch/aarch64/atomic/atomic_swap_16.S index 1f3cd95dfb42..94ad1adfa1a9 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_swap_16.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_swap_16.S @@ -43,10 +43,18 @@ END(_atomic_swap_16) ATOMIC_OP_ALIAS(atomic_swap_16,_atomic_swap_16) ATOMIC_OP_ALIAS(atomic_swap_short,_atomic_swap_16) ATOMIC_OP_ALIAS(atomic_swap_ushort,_atomic_swap_16) -STRONG_ALIAS(__sync_lock_test_and_set_2,_atomic_swap_16) STRONG_ALIAS(_atomic_swap_short,_atomic_swap_16) STRONG_ALIAS(_atomic_swap_ushort,_atomic_swap_16) +ENTRY_NP(__sync_lock_test_and_set_2) + mov x4, x0 +1: ldaxrh w0, [x4] + stxrh w3, w1, [x4] + cbnz w3, 2f + ret +2: b 1b +END(__sync_lock_test_and_set_2) + ENTRY_NP(__sync_lock_release_2) stlrh wzr, [x0] ret diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_swap_32.S b/common/lib/libc/arch/aarch64/atomic/atomic_swap_32.S index 16863d6d0827..b9c6c97964fa 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_swap_32.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_swap_32.S @@ -42,9 +42,17 @@ END(_atomic_swap_32) ATOMIC_OP_ALIAS(atomic_swap_32,_atomic_swap_32) ATOMIC_OP_ALIAS(atomic_swap_uint,_atomic_swap_32) -STRONG_ALIAS(__sync_lock_test_and_set_4,_atomic_swap_32) STRONG_ALIAS(_atomic_swap_uint,_atomic_swap_32) +ENTRY_NP(__sync_lock_test_and_set_4) + mov x4, x0 +1: ldaxr w0, [x4] + stxr w3, w1, [x4] + cbnz w3, 2f + ret +2: b 1b +END(__sync_lock_test_and_set_4) + ENTRY_NP(__sync_lock_release_4) stlr wzr, [x0] ret diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_swap_64.S b/common/lib/libc/arch/aarch64/atomic/atomic_swap_64.S index e9ac40c2a888..aae2e07224fd 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_swap_64.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_swap_64.S @@ -43,10 +43,18 @@ END(_atomic_swap_64) ATOMIC_OP_ALIAS(atomic_swap_64,_atomic_swap_64) ATOMIC_OP_ALIAS(atomic_swap_ulong,_atomic_swap_64) ATOMIC_OP_ALIAS(atomic_swap_ptr,_atomic_swap_64) -STRONG_ALIAS(__sync_lock_test_and_set_8,_atomic_swap_64) STRONG_ALIAS(_atomic_swap_ulong,_atomic_swap_64) STRONG_ALIAS(_atomic_swap_ptr,_atomic_swap_64) +ENTRY_NP(__sync_lock_test_and_set_8) + mov x4, x0 +1: ldaxr x0, [x4] + stxr w3, x1, [x4] + cbnz w3, 2f + ret +2: b 1b +END(_atomic_swap_64) + ENTRY_NP(__sync_lock_release_8) stlr xzr, [x0] ret diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_swap_8.S b/common/lib/libc/arch/aarch64/atomic/atomic_swap_8.S index f2ba13e9fc5f..1d8a700a5265 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_swap_8.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_swap_8.S @@ -43,10 +43,18 @@ END(_atomic_swap_8) ATOMIC_OP_ALIAS(atomic_swap_8,_atomic_swap_8) ATOMIC_OP_ALIAS(atomic_swap_char,_atomic_swap_8) ATOMIC_OP_ALIAS(atomic_swap_uchar,_atomic_swap_8) -STRONG_ALIAS(__sync_lock_test_and_set_1,_atomic_swap_8) STRONG_ALIAS(_atomic_swap_char,_atomic_swap_8) STRONG_ALIAS(_atomic_swap_uchar,_atomic_swap_8) +ENTRY_NP(__sync_lock_test_and_set_1) + mov x4, x0 +1: ldaxrb w0, [x4] + stxrb w3, w1, [x4] + cbnz w3, 2f + ret +2: b 1b +END(__sync_lock_test_and_set_1) + ENTRY_NP(__sync_lock_release_1) stlrb wzr, [x0] ret diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_xor_16.S b/common/lib/libc/arch/aarch64/atomic/atomic_xor_16.S index 564ba86859d0..b87e56b6eef3 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_xor_16.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_xor_16.S @@ -35,12 +35,24 @@ ATOMIC_OP16(xor, eor) ATOMIC_OP_ALIAS(atomic_xor_16,_atomic_xor_16) ATOMIC_OP_ALIAS(atomic_xor_ushort,_atomic_xor_16) -STRONG_ALIAS(__sync_fetch_and_xor_2,_atomic_xor_16) STRONG_ALIAS(_atomic_xor_ushort,_atomic_xor_16) +ENTRY_NP(__sync_fetch_and_xor_2) + mov x5, lr + bl _atomic_xor_16 + dmb ish + ret x5 +END(__sync_fetch_and_xor_2) + ATOMIC_OP16_NV(xor, eor) ATOMIC_OP_ALIAS(atomic_xor_16_nv,_atomic_xor_16_nv) ATOMIC_OP_ALIAS(atomic_xor_ushort_nv,_atomic_xor_16_nv) -STRONG_ALIAS(__sync_xor_and_fetch_2,_atomic_xor_16_nv) STRONG_ALIAS(_atomic_xor_ushort_nv,_atomic_xor_16_nv) + +ENTRY_NP(__sync_xor_and_fetch_2) + mov x5, lr + bl _atomic_xor_16_nv + dmb ish + ret x5 +END(__sync_xor_and_fetch_2) diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_xor_32.S b/common/lib/libc/arch/aarch64/atomic/atomic_xor_32.S index f1bfdc4f43c2..c1a80ac3ce2b 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_xor_32.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_xor_32.S @@ -35,12 +35,25 @@ ATOMIC_OP32(xor, eor) ATOMIC_OP_ALIAS(atomic_xor_32,_atomic_xor_32) ATOMIC_OP_ALIAS(atomic_xor_uint,_atomic_xor_32) -STRONG_ALIAS(__sync_fetch_and_xor_4,_atomic_xor_32) STRONG_ALIAS(_atomic_xor_uint,_atomic_xor_32) +ENTRY_NP(__sync_fetch_and_xor_4) + mov x5, lr + bl _atomic_xor_32 + dmb ish + ret x5 +END(__sync_fetch_and_xor_4) + ATOMIC_OP32_NV(xor, eor) ATOMIC_OP_ALIAS(atomic_xor_32_nv,_atomic_xor_32_nv) ATOMIC_OP_ALIAS(atomic_xor_uint_nv,_atomic_xor_32_nv) -STRONG_ALIAS(__sync_xor_and_fetch_4,_atomic_xor_32_nv) STRONG_ALIAS(_atomic_xor_uint_nv,_atomic_xor_32_nv) + +ENTRY_NP(__sync_xor_and_fetch_4) + mov x5, lr + bl _atomic_xor_32_nv + dmb ish + ret x5 +END(__sync_xor_and_fetch_4) + diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_xor_64.S b/common/lib/libc/arch/aarch64/atomic/atomic_xor_64.S index 588d8a0ef47b..78e402b80fe0 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_xor_64.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_xor_64.S @@ -35,10 +35,22 @@ ATOMIC_OP64(xor, eor) ATOMIC_OP_ALIAS(atomic_xor_64,_atomic_xor_64) ATOMIC_OP_ALIAS(atomic_xor_ulong,_atomic_xor_64) -STRONG_ALIAS(__sync_fetch_and_xor_8,_atomic_xor_64) + +ENTRY_NP(__sync_fetch_and_xor_8) + mov x5, lr + bl _atomic_xor_64 + dmb ish + ret x5 +END(__sync_fetch_and_xor_8) ATOMIC_OP64_NV(xor, eor) ATOMIC_OP_ALIAS(atomic_xor_64_nv,_atomic_xor_64_nv) ATOMIC_OP_ALIAS(atomic_xor_ulong_nv,_atomic_xor_64_nv) -STRONG_ALIAS(__sync_xor_and_fetch_8,_atomic_xor_64_nv) + +ENTRY_NP(__sync_xor_and_fetch_8) + mov x5, lr + bl _atomic_xor_64_nv + dmb ish + ret x5 +END(__sync_xor_and_fetch_8) diff --git a/common/lib/libc/arch/aarch64/atomic/atomic_xor_8.S b/common/lib/libc/arch/aarch64/atomic/atomic_xor_8.S index 9eeff7e519db..d190beccc2dd 100644 --- a/common/lib/libc/arch/aarch64/atomic/atomic_xor_8.S +++ b/common/lib/libc/arch/aarch64/atomic/atomic_xor_8.S @@ -35,12 +35,24 @@ ATOMIC_OP8(xor, eor) ATOMIC_OP_ALIAS(atomic_xor_8,_atomic_xor_8) ATOMIC_OP_ALIAS(atomic_xor_uchar,_atomic_xor_8) -STRONG_ALIAS(__sync_fetch_and_xor_1,_atomic_xor_8) STRONG_ALIAS(_atomic_xor_uchar,_atomic_xor_8) ATOMIC_OP8_NV(xor, eor) +ENTRY_NP(__sync_fetch_and_xor_1) + mov x5, lr + bl _atomic_xor_8 + dmb ish + ret x5 +END(__sync_fetch_and_xor_1) + ATOMIC_OP_ALIAS(atomic_xor_8_nv,_atomic_xor_8_nv) ATOMIC_OP_ALIAS(atomic_xor_uchar_nv,_atomic_xor_8_nv) -STRONG_ALIAS(__sync_xor_and_fetch_1,_atomic_xor_8_nv) STRONG_ALIAS(_atomic_xor_uchar_nv,_atomic_xor_8_nv) + +ENTRY_NP(__sync_xor_and_fetch_1) + mov x5, lr + bl _atomic_xor_8_nv + dmb ish + ret x5 +END(__sync_xor_and_fetch_1)