From 1410ffb696f63e98b6308ca92f95c68892b1cceb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Dziepak?= Date: Fri, 6 Mar 2015 18:47:45 +0100 Subject: [PATCH] boot/arm: use std::atomic<> to access bcm2708 mailbox MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Paweł Dziepak --- .../boot/arch/arm/arch_mailbox_bcm2708.cpp | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/system/boot/arch/arm/arch_mailbox_bcm2708.cpp b/src/system/boot/arch/arm/arch_mailbox_bcm2708.cpp index 4b14f0f9f2..a68c5988e2 100644 --- a/src/system/boot/arch/arm/arch_mailbox_bcm2708.cpp +++ b/src/system/boot/arch/arm/arch_mailbox_bcm2708.cpp @@ -8,6 +8,7 @@ * Alexander von Gluck IV, kallisti5@unixzen.com */ +#include #include "arch_mailbox.h" @@ -26,6 +27,7 @@ virtual status_t Write(uint8 channel, uint32 value); virtual status_t Read(uint8 channel, uint32& value); private: + auto& GetRegister(unsigned reg); void RegisterWrite(addr_t reg, uint32 value); uint32 RegisterRead(addr_t reg); }; @@ -73,18 +75,22 @@ ArchMailboxArmBCM2708::Read(uint8 channel, uint32& value) } -uint32 +inline auto& +ArchMailboxArmBCM2708::GetRegister(unsigned reg) +{ + auto addr = fBase + ARM_CTRL_0_MAILBOX_BASE + reg; + return *reinterpret_cast*>(addr); +} + +inline uint32 ArchMailboxArmBCM2708::RegisterRead(addr_t reg) { - uint32 result = *(volatile uint32*)(fBase + ARM_CTRL_0_MAILBOX_BASE + reg); - arch_cpu_memory_read_barrier(); - return result; + return GetRegister(reg).load(std::memory_order_acquire); } -void +inline void ArchMailboxArmBCM2708::RegisterWrite(addr_t reg, uint32 value) { - arch_cpu_memory_write_barrier(); - *(volatile uint32*)(fBase + ARM_CTRL_0_MAILBOX_BASE + reg) = value; + GetRegister(reg).store(value, std::memory_order_release); }