From d36ddb5790838ab029114f0d0eaaa3c437305649 Mon Sep 17 00:00:00 2001 From: chao an Date: Fri, 20 Dec 2024 14:37:57 +0800 Subject: [PATCH] arm/modifyreg: Use common lock to protect the modify address to ensure consistency Signed-off-by: chao an --- arch/arm/src/common/CMakeLists.txt | 4 +- arch/arm/src/common/Make.defs | 3 +- .../{arm_modifyreg16.c => arm_modifyreg.c} | 44 ++++++++++++- arch/arm/src/common/arm_modifyreg32.c | 65 ------------------- arch/arm/src/common/arm_modifyreg8.c | 65 ------------------- 5 files changed, 45 insertions(+), 136 deletions(-) rename arch/arm/src/common/{arm_modifyreg16.c => arm_modifyreg.c} (65%) delete mode 100644 arch/arm/src/common/arm_modifyreg32.c delete mode 100644 arch/arm/src/common/arm_modifyreg8.c diff --git a/arch/arm/src/common/CMakeLists.txt b/arch/arm/src/common/CMakeLists.txt index b0f87f4a78..4353c82435 100644 --- a/arch/arm/src/common/CMakeLists.txt +++ b/arch/arm/src/common/CMakeLists.txt @@ -33,9 +33,7 @@ set(SRCS arm_getintstack.c arm_initialize.c arm_lowputs.c - arm_modifyreg8.c - arm_modifyreg16.c - arm_modifyreg32.c + arm_modifyreg.c arm_nputs.c arm_releasestack.c arm_registerdump.c diff --git a/arch/arm/src/common/Make.defs b/arch/arm/src/common/Make.defs index c099dbe02e..1694083e28 100644 --- a/arch/arm/src/common/Make.defs +++ b/arch/arm/src/common/Make.defs @@ -24,9 +24,8 @@ CMN_CSRCS += arm_allocateheap.c arm_createstack.c arm_exit.c CMN_CSRCS += arm_getintstack.c arm_initialize.c arm_lowputs.c -CMN_CSRCS += arm_modifyreg8.c arm_modifyreg16.c arm_modifyreg32.c CMN_CSRCS += arm_nputs.c arm_releasestack.c arm_registerdump.c -CMN_CSRCS += arm_stackframe.c +CMN_CSRCS += arm_stackframe.c arm_modifyreg.c CMN_CSRCS += arm_usestack.c arm_fork.c ifneq ($(CONFIG_ALARM_ARCH),y) diff --git a/arch/arm/src/common/arm_modifyreg16.c b/arch/arm/src/common/arm_modifyreg.c similarity index 65% rename from arch/arm/src/common/arm_modifyreg16.c rename to arch/arm/src/common/arm_modifyreg.c index 53f536f164..c1818a7dc1 100644 --- a/arch/arm/src/common/arm_modifyreg16.c +++ b/arch/arm/src/common/arm_modifyreg.c @@ -1,5 +1,5 @@ /**************************************************************************** - * arch/arm/src/common/arm_modifyreg16.c + * arch/arm/src/common/arm_modifyreg.c * * SPDX-License-Identifier: Apache-2.0 * @@ -43,6 +43,27 @@ static spinlock_t g_modifyreg_lock = SP_UNLOCKED; * Public Functions ****************************************************************************/ +/**************************************************************************** + * Name: modifyreg8 + * + * Description: + * Atomically modify the specified bits in a memory mapped register + * + ****************************************************************************/ + +void modifyreg8(unsigned int addr, uint8_t clearbits, uint8_t setbits) +{ + irqstate_t flags; + uint8_t regval; + + flags = spin_lock_irqsave(&g_modifyreg_lock); + regval = getreg8(addr); + regval &= ~clearbits; + regval |= setbits; + putreg8(regval, addr); + spin_unlock_irqrestore(&g_modifyreg_lock, flags); +} + /**************************************************************************** * Name: modifyreg16 * @@ -63,3 +84,24 @@ void modifyreg16(unsigned int addr, uint16_t clearbits, uint16_t setbits) putreg16(regval, addr); spin_unlock_irqrestore(&g_modifyreg_lock, flags); } + +/**************************************************************************** + * Name: modifyreg32 + * + * Description: + * Atomically modify the specified bits in a memory mapped register + * + ****************************************************************************/ + +void modifyreg32(unsigned int addr, uint32_t clearbits, uint32_t setbits) +{ + irqstate_t flags; + uint32_t regval; + + flags = spin_lock_irqsave(&g_modifyreg_lock); + regval = getreg32(addr); + regval &= ~clearbits; + regval |= setbits; + putreg32(regval, addr); + spin_unlock_irqrestore(&g_modifyreg_lock, flags); +} diff --git a/arch/arm/src/common/arm_modifyreg32.c b/arch/arm/src/common/arm_modifyreg32.c deleted file mode 100644 index ccc7d75829..0000000000 --- a/arch/arm/src/common/arm_modifyreg32.c +++ /dev/null @@ -1,65 +0,0 @@ -/**************************************************************************** - * arch/arm/src/common/arm_modifyreg32.c - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. The - * ASF licenses this file to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the - * License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - ****************************************************************************/ - -/**************************************************************************** - * Included Files - ****************************************************************************/ - -#include - -#include -#include - -#include - -#include "arm_internal.h" - -/**************************************************************************** - * Private Data - ****************************************************************************/ - -static spinlock_t g_modifyreg_lock = SP_UNLOCKED; - -/**************************************************************************** - * Public Functions - ****************************************************************************/ - -/**************************************************************************** - * Name: modifyreg32 - * - * Description: - * Atomically modify the specified bits in a memory mapped register - * - ****************************************************************************/ - -void modifyreg32(unsigned int addr, uint32_t clearbits, uint32_t setbits) -{ - irqstate_t flags; - uint32_t regval; - - flags = spin_lock_irqsave(&g_modifyreg_lock); - regval = getreg32(addr); - regval &= ~clearbits; - regval |= setbits; - putreg32(regval, addr); - spin_unlock_irqrestore(&g_modifyreg_lock, flags); -} diff --git a/arch/arm/src/common/arm_modifyreg8.c b/arch/arm/src/common/arm_modifyreg8.c deleted file mode 100644 index 0e40bc1b5f..0000000000 --- a/arch/arm/src/common/arm_modifyreg8.c +++ /dev/null @@ -1,65 +0,0 @@ -/**************************************************************************** - * arch/arm/src/common/arm_modifyreg8.c - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. The - * ASF licenses this file to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the - * License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - ****************************************************************************/ - -/**************************************************************************** - * Included Files - ****************************************************************************/ - -#include - -#include -#include - -#include - -#include "arm_internal.h" - -/**************************************************************************** - * Private Data - ****************************************************************************/ - -static spinlock_t g_modifyreg_lock = SP_UNLOCKED; - -/**************************************************************************** - * Public Functions - ****************************************************************************/ - -/**************************************************************************** - * Name: modifyreg8 - * - * Description: - * Atomically modify the specified bits in a memory mapped register - * - ****************************************************************************/ - -void modifyreg8(unsigned int addr, uint8_t clearbits, uint8_t setbits) -{ - irqstate_t flags; - uint8_t regval; - - flags = spin_lock_irqsave(&g_modifyreg_lock); - regval = getreg8(addr); - regval &= ~clearbits; - regval |= setbits; - putreg8(regval, addr); - spin_unlock_irqrestore(&g_modifyreg_lock, flags); -}