From 72f7d7fa81a0692e56b586e7f851c6d8ab338be0 Mon Sep 17 00:00:00 2001 From: Lucjan Bryndza Date: Fri, 3 Sep 2021 15:55:23 +0200 Subject: [PATCH] [EGD-7391] Fix random crash on idle Add atomic primitives for fix random crash on idle mode Signed-off-by: Lucjan Bryndza (cherry picked from commit 7b75494ba59d6490f72284308ceb9d5850990368) --- board/rt1051/newlib/include/ext/atomicity.h | 98 +++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 board/rt1051/newlib/include/ext/atomicity.h diff --git a/board/rt1051/newlib/include/ext/atomicity.h b/board/rt1051/newlib/include/ext/atomicity.h new file mode 100644 index 0000000000000000000000000000000000000000..4c417d548975cfc985a0531e28e54706b1880e71 --- /dev/null +++ b/board/rt1051/newlib/include/ext/atomicity.h @@ -0,0 +1,98 @@ +// Support for atomic operations -*- C++ -*- + +// Copyright (C) 2004-2020 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// Under Section 7 of GPL version 3, you are granted additional +// permissions described in the GCC Runtime Library Exception, version +// 3.1, as published by the Free Software Foundation. + +// You should have received a copy of the GNU General Public License and +// a copy of the GCC Runtime Library Exception along with this program; +// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +// . + +/** @file ext/atomicity.h + * This file is a GNU extension to the Standard C++ Library. + */ + +#ifndef _GLIBCXX_ATOMICITY_H +#define _GLIBCXX_ATOMICITY_H 1 + +#pragma GCC system_header + +#include +#include +#include + +namespace __gnu_cxx _GLIBCXX_VISIBILITY(default) +{ + _GLIBCXX_BEGIN_NAMESPACE_VERSION + + // Functions for portable atomic access. + // To abstract locking primitives across all thread policies, use: + // __exchange_and_add_dispatch + // __atomic_add_dispatch +#ifdef _GLIBCXX_ATOMIC_BUILTINS + static inline _Atomic_word __attribute__((__always_inline__)) + __exchange_and_add(volatile _Atomic_word * __mem, int __val) + { + return __atomic_add_fetch(__mem, __val, __ATOMIC_ACQ_REL); + } + + static inline void __attribute__((__always_inline__)) __atomic_add(volatile _Atomic_word * __mem, int __val) + { + __atomic_add_fetch(__mem, __val, __ATOMIC_ACQ_REL); + } +#else + _Atomic_word __exchange_and_add(volatile _Atomic_word *, int) _GLIBCXX_NOTHROW; + + void __atomic_add(volatile _Atomic_word *, int) _GLIBCXX_NOTHROW; +#endif + + static inline _Atomic_word __attribute__((__always_inline__)) + __exchange_and_add_single(_Atomic_word * __mem, int __val) + { + return __atomic_add_fetch(__mem, __val, __ATOMIC_ACQ_REL); + } + + static inline void __attribute__((__always_inline__)) __atomic_add_single(_Atomic_word * __mem, int __val) + { + __atomic_add_fetch(__mem, __val, __ATOMIC_ACQ_REL); + } + + static inline _Atomic_word __attribute__((__always_inline__)) + __exchange_and_add_dispatch(_Atomic_word * __mem, int __val) + { + return __exchange_and_add_single(__mem, __val); + } + + static inline void __attribute__((__always_inline__)) __atomic_add_dispatch(_Atomic_word * __mem, int __val) + { + __atomic_add_single(__mem, __val); + } + + _GLIBCXX_END_NAMESPACE_VERSION +} // namespace ) + +// Even if the CPU doesn't need a memory barrier, we need to ensure +// that the compiler doesn't reorder memory accesses across the +// barriers. +#ifndef _GLIBCXX_READ_MEM_BARRIER +#define _GLIBCXX_READ_MEM_BARRIER __atomic_thread_fence(__ATOMIC_ACQUIRE) +#endif +#ifndef _GLIBCXX_WRITE_MEM_BARRIER +#define _GLIBCXX_WRITE_MEM_BARRIER __atomic_thread_fence(__ATOMIC_RELEASE) +#endif + +#endif