From 734208a49bf6c1205f653c0acfe54a7ee1404d1d Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Thu, 12 Jun 2025 09:02:59 -0500 Subject: [PATCH] bsp/shared/atomics: New directory Provide missing GCC atomics helpers as part of BSPs where GCC does not know how to provide it since the CPU's ISA has no atomic instructions. The implementation provided in bsps/shared/atomics/__atomic_test_and_set.c should work on any single core CPU. The BSPs that need thie function tend to have older cores. This is the list of BSPs: arm - csb336, csb337, csb637, edb7312, gumstix, kit637_v6, lpc24xx_ea, lpc24xx_ncs_ram, lpc24xx_ncs_rom_ext, lpc24xx_ncs_rom_int, lpc24xx_plx800_ram, lpc24xx_plx800_rom_int, lpc32xx_mzx, lpc32xx_mzx_stage_1, lpc32xx_mzx_stage_2, lpc32xx_phycore, rtl22xx, rtl22xx_t, smdk2410 m68k - av5282, mcf5329 mips - jmr3904 moxie - moxiesim nios2 - nios2_iss riscv - grv32i, grv32im, niosvc10lp, noel32im, rv32i, rv32im, sparc - ut699 --- bsps/shared/atomics/__atomic_test_and_set.c | 62 +++++++++++++++++++ spec/build/bsps/arm/csb336/bspcsb336.yml | 1 + spec/build/bsps/arm/csb337/obj.yml | 1 + spec/build/bsps/arm/edb7312/bspedb7312.yml | 1 + spec/build/bsps/arm/gumstix/bspgumstix.yml | 1 + spec/build/bsps/arm/lpc24xx/obj.yml | 1 + spec/build/bsps/arm/lpc32xx/obj.yml | 1 + spec/build/bsps/arm/rtl22xx/obj.yml | 1 + spec/build/bsps/arm/smdk2410/bspsmdk2410.yml | 1 + spec/build/bsps/m68k/av5282/bspav5282.yml | 1 + spec/build/bsps/m68k/mcf5329/bspmcf5329.yml | 1 + spec/build/bsps/m68k/tstcoldfireatomicbug.yml | 15 ----- spec/build/bsps/m68k/uC5282/bspuc5282.yml | 3 +- spec/build/bsps/mips/jmr3904/bspjmr3904.yml | 1 + .../build/bsps/moxie/moxiesim/bspmoxiesim.yml | 1 + .../bsps/nios2/nios2_iss/bspnios2iss.yml | 1 + spec/build/bsps/riscv/griscv/bspgrv32i.yml | 3 +- spec/build/bsps/riscv/griscv/bspgrv32im.yml | 3 +- spec/build/bsps/riscv/niosv/objniosvc10lp.yml | 1 + spec/build/bsps/riscv/noel/bspnoel32im.yml | 3 +- spec/build/bsps/riscv/riscv/bsprv32i.yml | 3 +- spec/build/bsps/riscv/riscv/bsprv32im.yml | 3 +- spec/build/bsps/sparc/leon3/bsput699.yml | 3 +- 23 files changed, 89 insertions(+), 23 deletions(-) create mode 100644 bsps/shared/atomics/__atomic_test_and_set.c delete mode 100644 spec/build/bsps/m68k/tstcoldfireatomicbug.yml diff --git a/bsps/shared/atomics/__atomic_test_and_set.c b/bsps/shared/atomics/__atomic_test_and_set.c new file mode 100644 index 0000000000..a1b6ddd758 --- /dev/null +++ b/bsps/shared/atomics/__atomic_test_and_set.c @@ -0,0 +1,62 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup RTEMSBSPGCCAtomics + * + * @brief Implementation of GCC Atomic Helper + * + * This implementation is used on BSPs with older cores which do not + * have atomic instructions. If the CPU core has atomic instructions, + * GCC will do the right thing. + * + * https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html + * describes the interface for __atomic_test_and_set with the *mem + * being precisely one byte. + */ + +/* + * COPYRIGHT (c) 2025. On-Line Applications Research Corporation (OAR). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include + +#include + +bool __atomic_test_and_set( volatile void *mem, int access ) +{ + volatile uint8_t *lock = (volatile uint8_t *) mem; + rtems_interrupt_level level; + uint8_t value; + + rtems_interrupt_disable( level ); + + value = *lock; + *lock = 1; + + rtems_interrupt_enable( level ); + + return value; +} diff --git a/spec/build/bsps/arm/csb336/bspcsb336.yml b/spec/build/bsps/arm/csb336/bspcsb336.yml index 835f494157..826b44e7ff 100644 --- a/spec/build/bsps/arm/csb336/bspcsb336.yml +++ b/spec/build/bsps/arm/csb336/bspcsb336.yml @@ -57,4 +57,5 @@ source: - bsps/shared/start/bspreset-loop.c - bsps/shared/start/gettargethash-default.c - bsps/shared/start/sbrk.c +- bsps/shared/atomics/__atomic_test_and_set.c type: build diff --git a/spec/build/bsps/arm/csb337/obj.yml b/spec/build/bsps/arm/csb337/obj.yml index 2d7e3d02ad..4fffe03425 100644 --- a/spec/build/bsps/arm/csb337/obj.yml +++ b/spec/build/bsps/arm/csb337/obj.yml @@ -51,4 +51,5 @@ source: - bsps/shared/irq/irq-default-handler.c - bsps/shared/start/gettargethash-default.c - bsps/shared/start/sbrk.c +- bsps/shared/atomics/__atomic_test_and_set.c type: build diff --git a/spec/build/bsps/arm/edb7312/bspedb7312.yml b/spec/build/bsps/arm/edb7312/bspedb7312.yml index a2558ab02f..9af75eaaec 100644 --- a/spec/build/bsps/arm/edb7312/bspedb7312.yml +++ b/spec/build/bsps/arm/edb7312/bspedb7312.yml @@ -60,4 +60,5 @@ source: - bsps/shared/irq/irq-default-handler.c - bsps/shared/start/gettargethash-default.c - bsps/shared/start/sbrk.c +- bsps/shared/atomics/__atomic_test_and_set.c type: build diff --git a/spec/build/bsps/arm/gumstix/bspgumstix.yml b/spec/build/bsps/arm/gumstix/bspgumstix.yml index 1548975dbd..041543515e 100644 --- a/spec/build/bsps/arm/gumstix/bspgumstix.yml +++ b/spec/build/bsps/arm/gumstix/bspgumstix.yml @@ -64,4 +64,5 @@ source: - bsps/shared/irq/irq-default-handler.c - bsps/shared/start/gettargethash-default.c - bsps/shared/start/sbrk.c +- bsps/shared/atomics/__atomic_test_and_set.c type: build diff --git a/spec/build/bsps/arm/lpc24xx/obj.yml b/spec/build/bsps/arm/lpc24xx/obj.yml index 9a5c91fc51..b5281021a6 100644 --- a/spec/build/bsps/arm/lpc24xx/obj.yml +++ b/spec/build/bsps/arm/lpc24xx/obj.yml @@ -85,4 +85,5 @@ source: - bsps/shared/start/gettargethash-default.c - bsps/shared/start/sbrk.c - bsps/shared/start/stackalloc.c +- bsps/shared/atomics/__atomic_test_and_set.c type: build diff --git a/spec/build/bsps/arm/lpc32xx/obj.yml b/spec/build/bsps/arm/lpc32xx/obj.yml index 3b69804d46..748323d3ec 100644 --- a/spec/build/bsps/arm/lpc32xx/obj.yml +++ b/spec/build/bsps/arm/lpc32xx/obj.yml @@ -65,4 +65,5 @@ source: - bsps/shared/start/gettargethash-default.c - bsps/shared/start/sbrk.c - bsps/shared/start/stackalloc.c +- bsps/shared/atomics/__atomic_test_and_set.c type: build diff --git a/spec/build/bsps/arm/rtl22xx/obj.yml b/spec/build/bsps/arm/rtl22xx/obj.yml index 3ad68dbaa7..ca6a426ce7 100644 --- a/spec/build/bsps/arm/rtl22xx/obj.yml +++ b/spec/build/bsps/arm/rtl22xx/obj.yml @@ -36,4 +36,5 @@ source: - bsps/shared/irq/irq-default-handler.c - bsps/shared/start/gettargethash-default.c - bsps/shared/start/sbrk.c +- bsps/shared/atomics/__atomic_test_and_set.c type: build diff --git a/spec/build/bsps/arm/smdk2410/bspsmdk2410.yml b/spec/build/bsps/arm/smdk2410/bspsmdk2410.yml index 6a28ae995e..53163bd45d 100644 --- a/spec/build/bsps/arm/smdk2410/bspsmdk2410.yml +++ b/spec/build/bsps/arm/smdk2410/bspsmdk2410.yml @@ -69,4 +69,5 @@ source: - bsps/shared/irq/irq-default-handler.c - bsps/shared/start/gettargethash-default.c - bsps/shared/start/sbrk.c +- bsps/shared/atomics/__atomic_test_and_set.c type: build diff --git a/spec/build/bsps/m68k/av5282/bspav5282.yml b/spec/build/bsps/m68k/av5282/bspav5282.yml index d433f62e39..2e45843588 100644 --- a/spec/build/bsps/m68k/av5282/bspav5282.yml +++ b/spec/build/bsps/m68k/av5282/bspav5282.yml @@ -50,4 +50,5 @@ source: - bsps/shared/start/gettargethash-default.c - bsps/shared/start/sbrk.c - bsps/shared/start/setvec.c +- bsps/shared/atomics/__atomic_test_and_set.c type: build diff --git a/spec/build/bsps/m68k/mcf5329/bspmcf5329.yml b/spec/build/bsps/m68k/mcf5329/bspmcf5329.yml index aa44e104f8..8a31d898df 100644 --- a/spec/build/bsps/m68k/mcf5329/bspmcf5329.yml +++ b/spec/build/bsps/m68k/mcf5329/bspmcf5329.yml @@ -52,4 +52,5 @@ source: - bsps/shared/start/gettargethash-default.c - bsps/shared/start/sbrk.c - bsps/shared/start/setvec.c +- bsps/shared/atomics/__atomic_test_and_set.c type: build diff --git a/spec/build/bsps/m68k/tstcoldfireatomicbug.yml b/spec/build/bsps/m68k/tstcoldfireatomicbug.yml deleted file mode 100644 index de5a37e225..0000000000 --- a/spec/build/bsps/m68k/tstcoldfireatomicbug.yml +++ /dev/null @@ -1,15 +0,0 @@ -SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause -actions: -- set-test-state: - reason: "Coldfire ISA A atomics missing. See RTEMS Issue 5217" - state: exclude - tests: - - spcxx01 -build-type: option -copyrights: -- Copyright (C) 2025 OAR Corporation -default: [] -description: 'spcxx01 disable to avoid atomics issue. See 5217' -enabled-by: true -links: [] -type: build diff --git a/spec/build/bsps/m68k/uC5282/bspuc5282.yml b/spec/build/bsps/m68k/uC5282/bspuc5282.yml index 5e953d4799..6f74912c13 100644 --- a/spec/build/bsps/m68k/uC5282/bspuc5282.yml +++ b/spec/build/bsps/m68k/uC5282/bspuc5282.yml @@ -24,8 +24,6 @@ links: uid: ../grp - role: build-dependency uid: abi -- role: build-dependency - uid: ../tstcoldfireatomicbug - role: build-dependency uid: start - role: build-dependency @@ -52,4 +50,5 @@ source: - bsps/shared/start/gettargethash-default.c - bsps/shared/start/sbrk.c - bsps/shared/start/setvec.c +- bsps/shared/atomics/__atomic_test_and_set.c type: build diff --git a/spec/build/bsps/mips/jmr3904/bspjmr3904.yml b/spec/build/bsps/mips/jmr3904/bspjmr3904.yml index a13fda60ad..595111458c 100644 --- a/spec/build/bsps/mips/jmr3904/bspjmr3904.yml +++ b/spec/build/bsps/mips/jmr3904/bspjmr3904.yml @@ -54,4 +54,5 @@ source: - bsps/shared/dev/serial/console-polled.c - bsps/shared/start/gettargethash-default.c - bsps/shared/start/sbrk.c +- bsps/shared/atomics/__atomic_test_and_set.c type: build diff --git a/spec/build/bsps/moxie/moxiesim/bspmoxiesim.yml b/spec/build/bsps/moxie/moxiesim/bspmoxiesim.yml index 207905bd06..a70587cc16 100644 --- a/spec/build/bsps/moxie/moxiesim/bspmoxiesim.yml +++ b/spec/build/bsps/moxie/moxiesim/bspmoxiesim.yml @@ -50,4 +50,5 @@ source: - bsps/shared/start/bspstart-empty.c - bsps/shared/start/gettargethash-default.c - bsps/shared/start/sbrk.c +- bsps/shared/atomics/__atomic_test_and_set.c type: build diff --git a/spec/build/bsps/nios2/nios2_iss/bspnios2iss.yml b/spec/build/bsps/nios2/nios2_iss/bspnios2iss.yml index d4a3d23a23..1c8444be1b 100644 --- a/spec/build/bsps/nios2/nios2_iss/bspnios2iss.yml +++ b/spec/build/bsps/nios2/nios2_iss/bspnios2iss.yml @@ -46,4 +46,5 @@ source: - bsps/shared/start/bspreset-loop.c - bsps/shared/start/gettargethash-default.c - bsps/shared/start/sbrk.c +- bsps/shared/atomics/__atomic_test_and_set.c type: build diff --git a/spec/build/bsps/riscv/griscv/bspgrv32i.yml b/spec/build/bsps/riscv/griscv/bspgrv32i.yml index 154113a492..847e8355e6 100644 --- a/spec/build/bsps/riscv/griscv/bspgrv32i.yml +++ b/spec/build/bsps/riscv/griscv/bspgrv32i.yml @@ -15,5 +15,6 @@ links: uid: ../../opto2 - role: build-dependency uid: grp -source: [] +source: +- bsps/shared/atomics/__atomic_test_and_set.c type: build diff --git a/spec/build/bsps/riscv/griscv/bspgrv32im.yml b/spec/build/bsps/riscv/griscv/bspgrv32im.yml index 2be6c589f2..21f487683b 100644 --- a/spec/build/bsps/riscv/griscv/bspgrv32im.yml +++ b/spec/build/bsps/riscv/griscv/bspgrv32im.yml @@ -15,5 +15,6 @@ links: uid: ../../opto2 - role: build-dependency uid: grp -source: [] +source: +- bsps/shared/atomics/__atomic_test_and_set.c type: build diff --git a/spec/build/bsps/riscv/niosv/objniosvc10lp.yml b/spec/build/bsps/riscv/niosv/objniosvc10lp.yml index ae0041481f..a79e304c46 100644 --- a/spec/build/bsps/riscv/niosv/objniosvc10lp.yml +++ b/spec/build/bsps/riscv/niosv/objniosvc10lp.yml @@ -26,4 +26,5 @@ source: - bsps/riscv/niosv/niosvc10lp/bspstart.c - bsps/riscv/niosv/niosvc10lp/status_led_device_driver.c - bsps/riscv/niosv/niosvc10lp/system_device_driver.c +- bsps/shared/atomics/__atomic_test_and_set.c type: build diff --git a/spec/build/bsps/riscv/noel/bspnoel32im.yml b/spec/build/bsps/riscv/noel/bspnoel32im.yml index 4741cadf56..6f56f30b3c 100644 --- a/spec/build/bsps/riscv/noel/bspnoel32im.yml +++ b/spec/build/bsps/riscv/noel/bspnoel32im.yml @@ -15,5 +15,6 @@ links: uid: ../../opto2 - role: build-dependency uid: grp -source: [] +source: +- bsps/shared/atomics/__atomic_test_and_set.c type: build diff --git a/spec/build/bsps/riscv/riscv/bsprv32i.yml b/spec/build/bsps/riscv/riscv/bsprv32i.yml index 8c35a4abaa..f9d16d3854 100644 --- a/spec/build/bsps/riscv/riscv/bsprv32i.yml +++ b/spec/build/bsps/riscv/riscv/bsprv32i.yml @@ -15,5 +15,6 @@ links: uid: ../../opto2 - role: build-dependency uid: grp -source: [] +source: +- bsps/shared/atomics/__atomic_test_and_set.c type: build diff --git a/spec/build/bsps/riscv/riscv/bsprv32im.yml b/spec/build/bsps/riscv/riscv/bsprv32im.yml index a7dab33e94..4e136853f8 100644 --- a/spec/build/bsps/riscv/riscv/bsprv32im.yml +++ b/spec/build/bsps/riscv/riscv/bsprv32im.yml @@ -15,5 +15,6 @@ links: uid: ../../opto2 - role: build-dependency uid: grp -source: [] +source: +- bsps/shared/atomics/__atomic_test_and_set.c type: build diff --git a/spec/build/bsps/sparc/leon3/bsput699.yml b/spec/build/bsps/sparc/leon3/bsput699.yml index 74349a2eed..4d3bc2d785 100644 --- a/spec/build/bsps/sparc/leon3/bsput699.yml +++ b/spec/build/bsps/sparc/leon3/bsput699.yml @@ -15,5 +15,6 @@ links: uid: ../../opto2 - role: build-dependency uid: grp -source: [] +source: +- bsps/shared/atomics/__atomic_test_and_set.c type: build