summaryrefslogtreecommitdiffstats
path: root/cpukit/score/src/libatomic.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-04-19 09:25:03 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-05-30 08:11:39 +0200
commitfd6fde85a9977c6f176aa1fd4a021ba021f0793f (patch)
tree6316db7fb41dfa9c479ce4a9d2be82535216bb76 /cpukit/score/src/libatomic.c
parentscore: Add Status_Control for all APIs (diff)
downloadrtems-fd6fde85a9977c6f176aa1fd4a021ba021f0793f.tar.bz2
score: Add libatomic support
Close #2695.
Diffstat (limited to 'cpukit/score/src/libatomic.c')
-rw-r--r--cpukit/score/src/libatomic.c79
1 files changed, 79 insertions, 0 deletions
diff --git a/cpukit/score/src/libatomic.c b/cpukit/score/src/libatomic.c
new file mode 100644
index 0000000000..bfa3e6fb25
--- /dev/null
+++ b/cpukit/score/src/libatomic.c
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2016 embedded brains GmbH. All rights reserved.
+ *
+ * embedded brains GmbH
+ * Dornierstr. 4
+ * 82178 Puchheim
+ * Germany
+ * <rtems@embedded-brains.de>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <machine/_libatomic.h>
+
+#include <rtems/score/apimutex.h>
+#include <rtems/score/atomic.h>
+#include <rtems/score/isrlevel.h>
+
+#if defined(RTEMS_SMP)
+/*
+ * For real SMP targets this is not useful. The main purpose is support for
+ * testing on simulators like SIS.
+ */
+static Atomic_Flag _Libatomic_The_one_lock = ATOMIC_INITIALIZER_FLAG;
+#endif
+
+__uint32_t _Libatomic_Protect_start( void *ptr )
+{
+ ISR_Level isr_level;
+
+ (void) ptr;
+ _ISR_Local_disable( isr_level );
+
+#if defined(RTEMS_SMP)
+ while (
+ _Atomic_Flag_test_and_set( &_Libatomic_The_one_lock, ATOMIC_ORDER_SEQ_CST )
+ ) {
+ /* Next try. Yes, a TAS spin lock implementation is stupid. */
+ }
+#endif
+
+ return isr_level;
+}
+
+void _Libatomic_Protect_end( void *ptr, __uint32_t isr_level )
+{
+ (void) ptr;
+
+#if defined(RTEMS_SMP)
+ _Atomic_Flag_clear( &_Libatomic_The_one_lock, ATOMIC_ORDER_SEQ_CST );
+#endif
+
+ _ISR_Local_enable( isr_level );
+}
+
+/*
+ * FIXME: The once lock should be only a temporary solution. We need a
+ * dedicated internal mutex for this.
+ */
+
+void _Libatomic_Lock_n( void *ptr, __size_t n )
+{
+ (void) ptr;
+ (void) n;
+ _Once_Lock();
+}
+
+void _Libatomic_Unlock_n( void *ptr, __size_t n )
+{
+ (void) ptr;
+ (void) n;
+ _Once_Unlock();
+}