Skip to content

Commit ccdcb4e

Browse files
committed
Assembler atomics
Reimplement atomic code in inline assembly. This can improve optimisation, and avoids potential architectural problems with using LDREX/STREX intrinsics. API further extended: * Bitwise operations (fetch_and/fetch_or/fetch_xor) * fetch_add and fetch_sub (like incr/decr, but returning old value - aligning with C++11) * compare_exchange_weak * Explicit memory order specification * Basic freestanding template overloads for C++ This gives our existing C implementation essentially all the functionality needed by C++11. An actual Atomic<T> template based upon these C functions could follow.
1 parent beed42e commit ccdcb4e

File tree

45 files changed

+2622
-1222
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+2622
-1222
lines changed

UNITTESTS/features/lorawan/lorawanstack/unittest.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ set(unittest-test-sources
3535
stubs/LoRaPHY_stub.cpp
3636
stubs/LoRaMac_stub.cpp
3737
stubs/mbed_assert_stub.c
38-
stubs/mbed_critical_stub.c
38+
stubs/mbed_atomic_stub.c
3939
stubs/LoRaMacCrypto_stub.cpp
4040
stubs/LoRaMacChannelPlan_stub.cpp
4141
stubs/LoRaWANTimer_stub.cpp

UNITTESTS/features/netsocket/DTLSSocket/unittest.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ set(unittest-test-sources
2222
features/netsocket/DTLSSocket/test_DTLSSocket.cpp
2323
stubs/Mutex_stub.cpp
2424
stubs/mbed_assert_stub.c
25+
stubs/mbed_atomic_stub.c
2526
stubs/mbed_critical_stub.c
2627
stubs/equeue_stub.c
2728
../features/nanostack/coap-service/test/coap-service/unittest/stub/mbedtls_stub.c

UNITTESTS/features/netsocket/DTLSSocketWrapper/unittest.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ set(unittest-test-sources
2121
features/netsocket/DTLSSocketWrapper/test_DTLSSocketWrapper.cpp
2222
stubs/Mutex_stub.cpp
2323
stubs/mbed_assert_stub.c
24+
stubs/mbed_atomic_stub.c
2425
stubs/mbed_critical_stub.c
2526
stubs/equeue_stub.c
2627
../features/nanostack/coap-service/test/coap-service/unittest/stub/mbedtls_stub.c

UNITTESTS/features/netsocket/InternetSocket/unittest.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ set(unittest-test-sources
1818
features/netsocket/InternetSocket/test_InternetSocket.cpp
1919
stubs/Mutex_stub.cpp
2020
stubs/mbed_assert_stub.c
21+
stubs/mbed_atomic_stub.c
2122
stubs/mbed_critical_stub.c
2223
stubs/equeue_stub.c
2324
stubs/EventQueue_stub.cpp

UNITTESTS/features/netsocket/TCPServer/unittest.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ set(unittest-sources
2222
set(unittest-test-sources
2323
stubs/Mutex_stub.cpp
2424
stubs/mbed_assert_stub.c
25+
stubs/mbed_atomic_stub.c
2526
stubs/mbed_critical_stub.c
2627
stubs/equeue_stub.c
2728
stubs/EventQueue_stub.cpp

UNITTESTS/features/netsocket/TCPSocket/unittest.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ set(unittest-test-sources
1919
features/netsocket/TCPSocket/test_TCPSocket.cpp
2020
stubs/Mutex_stub.cpp
2121
stubs/mbed_assert_stub.c
22+
stubs/mbed_atomic_stub.c
2223
stubs/mbed_critical_stub.c
2324
stubs/equeue_stub.c
2425
stubs/EventQueue_stub.cpp

UNITTESTS/features/netsocket/TLSSocket/unittest.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ set(unittest-test-sources
2121
features/netsocket/TLSSocket/test_TLSSocket.cpp
2222
stubs/Mutex_stub.cpp
2323
stubs/mbed_assert_stub.c
24+
stubs/mbed_atomic_stub.c
2425
stubs/mbed_critical_stub.c
2526
stubs/equeue_stub.c
2627
../features/nanostack/coap-service/test/coap-service/unittest/stub/mbedtls_stub.c

UNITTESTS/features/netsocket/TLSSocketWrapper/unittest.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ set(unittest-test-sources
2020
features/netsocket/TLSSocketWrapper/test_TLSSocketWrapper.cpp
2121
stubs/Mutex_stub.cpp
2222
stubs/mbed_assert_stub.c
23+
stubs/mbed_atomic_stub.c
2324
stubs/mbed_critical_stub.c
2425
stubs/equeue_stub.c
2526
../features/nanostack/coap-service/test/coap-service/unittest/stub/mbedtls_stub.c

UNITTESTS/features/netsocket/UDPSocket/unittest.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ set(unittest-test-sources
1919
features/netsocket/UDPSocket/test_UDPSocket.cpp
2020
stubs/Mutex_stub.cpp
2121
stubs/mbed_assert_stub.c
22+
stubs/mbed_atomic_stub.c
2223
stubs/mbed_critical_stub.c
2324
stubs/equeue_stub.c
2425
stubs/EventQueue_stub.cpp

UNITTESTS/stubs/mbed_atomic_stub.c

Lines changed: 233 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,233 @@
1+
/*
2+
* Copyright (c) 2017, Arm Limited and affiliates.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
#include "platform/mbed_atomic.h"
19+
20+
bool core_util_atomic_flag_test_and_set(volatile core_util_atomic_flag *flagPtr)
21+
{
22+
return false;
23+
}
24+
25+
bool core_util_atomic_cas_u8(volatile uint8_t *ptr, uint8_t *expectedCurrentValue, uint8_t desiredValue)
26+
{
27+
return false;
28+
}
29+
30+
bool core_util_atomic_cas_u16(volatile uint16_t *ptr, uint16_t *expectedCurrentValue, uint16_t desiredValue)
31+
{
32+
return false;
33+
}
34+
35+
36+
bool core_util_atomic_cas_u32(volatile uint32_t *ptr, uint32_t *expectedCurrentValue, uint32_t desiredValue)
37+
{
38+
return false;
39+
}
40+
41+
42+
uint8_t core_util_atomic_exchange_u8(volatile uint8_t *ptr, uint8_t desiredValue)
43+
{
44+
return 0;
45+
}
46+
47+
uint16_t core_util_atomic_exchange_u16(volatile uint16_t *ptr, uint16_t desiredValue)
48+
{
49+
return 0;
50+
}
51+
52+
uint32_t core_util_atomic_exchange_u32(volatile uint32_t *ptr, uint32_t desiredValue)
53+
{
54+
return 0;
55+
}
56+
57+
58+
uint8_t core_util_atomic_incr_u8(volatile uint8_t *valuePtr, uint8_t delta)
59+
{
60+
return 0;
61+
}
62+
63+
uint16_t core_util_atomic_incr_u16(volatile uint16_t *valuePtr, uint16_t delta)
64+
{
65+
return 0;
66+
}
67+
68+
uint32_t core_util_atomic_incr_u32(volatile uint32_t *valuePtr, uint32_t delta)
69+
{
70+
return 0;
71+
}
72+
73+
74+
uint8_t core_util_atomic_decr_u8(volatile uint8_t *valuePtr, uint8_t delta)
75+
{
76+
return 0;
77+
}
78+
79+
uint16_t core_util_atomic_decr_u16(volatile uint16_t *valuePtr, uint16_t delta)
80+
{
81+
return 0;
82+
}
83+
84+
uint32_t core_util_atomic_decr_u32(volatile uint32_t *valuePtr, uint32_t delta)
85+
{
86+
return 0;
87+
}
88+
89+
90+
uint8_t core_util_atomic_fetch_add_u8(volatile uint8_t *valuePtr, uint8_t arg)
91+
{
92+
return 0;
93+
}
94+
95+
uint16_t core_util_atomic_fetch_add_u16(volatile uint16_t *valuePtr, uint16_t arg)
96+
{
97+
return 0;
98+
}
99+
100+
uint32_t core_util_atomic_fetch_add_u32(volatile uint32_t *valuePtr, uint32_t arg)
101+
{
102+
return 0;
103+
}
104+
105+
106+
uint8_t core_util_atomic_fetch_sub_u8(volatile uint8_t *valuePtr, uint8_t arg)
107+
{
108+
return 0;
109+
}
110+
111+
uint16_t core_util_atomic_fetch_sub_u16(volatile uint16_t *valuePtr, uint16_t arg)
112+
{
113+
return 0;
114+
}
115+
116+
uint32_t core_util_atomic_fetch_sub_u32(volatile uint32_t *valuePtr, uint32_t arg)
117+
{
118+
return 0;
119+
}
120+
121+
122+
uint8_t core_util_atomic_fetch_and_u8(volatile uint8_t *valuePtr, uint8_t arg)
123+
{
124+
return 0;
125+
}
126+
127+
uint16_t core_util_atomic_fetch_and_u16(volatile uint16_t *valuePtr, uint16_t arg)
128+
{
129+
return 0;
130+
}
131+
132+
uint32_t core_util_atomic_fetch_and_u32(volatile uint32_t *valuePtr, uint32_t arg)
133+
{
134+
return 0;
135+
}
136+
137+
138+
uint8_t core_util_atomic_fetch_or_u8(volatile uint8_t *valuePtr, uint8_t arg)
139+
{
140+
return 0;
141+
}
142+
143+
uint16_t core_util_atomic_fetch_or_u16(volatile uint16_t *valuePtr, uint16_t arg)
144+
{
145+
return 0;
146+
}
147+
148+
uint32_t core_util_atomic_fetch_or_u32(volatile uint32_t *valuePtr, uint32_t arg)
149+
{
150+
return 0;
151+
}
152+
153+
154+
uint8_t core_util_atomic_fetch_xor_u8(volatile uint8_t *valuePtr, uint8_t arg)
155+
{
156+
return 0;
157+
}
158+
159+
uint16_t core_util_atomic_fetch_xor_u16(volatile uint16_t *valuePtr, uint16_t arg)
160+
{
161+
return 0;
162+
}
163+
164+
uint32_t core_util_atomic_fetch_xor_u32(volatile uint32_t *valuePtr, uint32_t arg)
165+
{
166+
return 0;
167+
}
168+
169+
170+
uint64_t core_util_atomic_load_u64(const volatile uint64_t *valuePtr)
171+
{
172+
return 0;
173+
}
174+
175+
void core_util_atomic_store_u64(volatile uint64_t *valuePtr, uint64_t desiredValue)
176+
{
177+
}
178+
179+
uint64_t core_util_atomic_exchange_u64(volatile uint64_t *valuePtr, uint64_t desiredValue)
180+
{
181+
return 0;
182+
}
183+
184+
bool core_util_atomic_cas_u64(volatile uint64_t *ptr, uint64_t *expectedCurrentValue, uint64_t desiredValue)
185+
{
186+
return false;
187+
}
188+
189+
bool core_util_atomic_compare_exchange_weak_u64(volatile uint64_t *ptr, uint64_t *expectedCurrentValue, uint64_t desiredValue)
190+
{
191+
return false;
192+
}
193+
194+
uint64_t core_util_atomic_incr_u64(volatile uint64_t *valuePtr, uint64_t delta)
195+
{
196+
return 0;
197+
}
198+
199+
uint64_t core_util_atomic_decr_u64(volatile uint64_t *valuePtr, uint64_t delta)
200+
{
201+
return 0;
202+
}
203+
204+
uint64_t core_util_atomic_fetch_add_u64(volatile uint64_t *valuePtr, uint64_t arg)
205+
{
206+
return 0;
207+
}
208+
209+
uint64_t core_util_atomic_fetch_sub_u64(volatile uint64_t *valuePtr, uint64_t arg)
210+
{
211+
return 0;
212+
}
213+
214+
uint64_t core_util_atomic_fetch_and_u64(volatile uint64_t *valuePtr, uint64_t arg)
215+
{
216+
return 0;
217+
}
218+
219+
uint64_t core_util_atomic_fetch_or_u64(volatile uint64_t *valuePtr, uint64_t arg)
220+
{
221+
return 0;
222+
}
223+
224+
uint64_t core_util_atomic_fetch_xor_u64(volatile uint64_t *valuePtr, uint64_t arg)
225+
{
226+
return 0;
227+
}
228+
229+
/* Similar functions for s32 etc are static inline, but these are extern inline for legacy binary compatibility */
230+
extern inline void *core_util_atomic_exchange_ptr(void *volatile *valuePtr, void *desiredValue);
231+
extern inline void *core_util_atomic_incr_ptr(void *volatile *valuePtr, ptrdiff_t delta);
232+
extern inline void *core_util_atomic_decr_ptr(void *volatile *valuePtr, ptrdiff_t delta);
233+
extern inline bool core_util_atomic_cas_ptr(void *volatile *ptr, void **expectedCurrentValue, void *desiredValue);

0 commit comments

Comments
 (0)