Files
rtems/bsps/shared/atomics/__atomic_test_and_set.c
Joel Sherrill 734208a49b 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
2025-06-19 23:30:57 +00:00

63 lines
2.2 KiB
C

/* 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 <stdbool.h>
#include <rtems.h>
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;
}