X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Farch%2Fmips%2Flocked_mem.hh;h=153a991b66d5aeab450e559b39a44368064b0457;hb=56e53cafe0e68551f456c1da85913022704e573b;hp=ddda47a0afff5f07fafca5968f011904f9b0bad5;hpb=719f9a6d4fba16af38dcfd62b25a4d708156699f;p=gem5.git diff --git a/src/arch/mips/locked_mem.hh b/src/arch/mips/locked_mem.hh index ddda47a0a..153a991b6 100644 --- a/src/arch/mips/locked_mem.hh +++ b/src/arch/mips/locked_mem.hh @@ -1,4 +1,16 @@ /* + * Copyright (c) 2012 ARM Limited + * All rights reserved + * + * The license below extends only to copyright in the software and shall + * not be construed as granting a license to any other intellectual + * property including but not limited to intellectual property relating + * to a hardware implementation of the functionality of the software + * licensed hereunder. You may use the software subject to the license + * terms below provided that you ensure that this notice is replicated + * unmodified and in its entirety in all distributions of the software, + * modified or unmodified, in source code or in binary form. + * * Copyright (c) 2006-2007 The Regents of The University of Michigan * All rights reserved. * @@ -24,8 +36,6 @@ * 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. - * - * Authors: Steve Reinhardt */ #ifndef __ARCH_MIPS_LOCKED_MEM_HH__ @@ -38,27 +48,50 @@ */ #include "arch/registers.hh" -#include "base/misc.hh" +#include "base/logging.hh" #include "base/trace.hh" +#include "cpu/base.hh" +#include "debug/LLSC.hh" +#include "mem/packet.hh" #include "mem/request.hh" namespace MipsISA { +template +inline void +handleLockedSnoop(XC *xc, PacketPtr pkt, Addr cacheBlockMask) +{ + if (!xc->readMiscReg(MISCREG_LLFLAG)) + return; + + Addr locked_addr = xc->readMiscReg(MISCREG_LLADDR) & cacheBlockMask; + Addr snoop_addr = pkt->getAddr() & cacheBlockMask; + + if (locked_addr == snoop_addr) + xc->setMiscReg(MISCREG_LLFLAG, false); +} + template inline void -handleLockedRead(XC *xc, Request *req) +handleLockedRead(XC *xc, const RequestPtr &req) { xc->setMiscReg(MISCREG_LLADDR, req->getPaddr() & ~0xf); xc->setMiscReg(MISCREG_LLFLAG, true); - DPRINTF(LLSC, "[tid:%i]: Load-Link Flag Set & Load-Link" + DPRINTF(LLSC, "[cid:%i]: Load-Link Flag Set & Load-Link" " Address set to %x.\n", - req->threadId(), req->getPaddr() & ~0xf); + req->contextId(), req->getPaddr() & ~0xf); +} + +template +inline void +handleLockedSnoopHit(XC *xc) +{ } template inline bool -handleLockedWrite(XC *xc, Request *req) +handleLockedWrite(XC *xc, const RequestPtr &req, Addr cacheBlockMask) { if (req->isUncacheable()) { // Funky Turbolaser mailbox access...don't update @@ -85,17 +118,17 @@ handleLockedWrite(XC *xc, Request *req) if (stCondFailures % 100000 == 0) { warn("%i: context %d: %d consecutive " "store conditional failures\n", - curTick, xc->contextId(), stCondFailures); + curTick(), xc->contextId(), stCondFailures); } if (!lock_flag){ - DPRINTF(LLSC, "[tid:%i]: Lock Flag Set, " + DPRINTF(LLSC, "[cid:%i]: Lock Flag Set, " "Store Conditional Failed.\n", - req->threadId()); + req->contextId()); } else if ((req->getPaddr() & ~0xf) != lock_addr) { - DPRINTF(LLSC, "[tid:%i]: Load-Link Address Mismatch, " + DPRINTF(LLSC, "[cid:%i]: Load-Link Address Mismatch, " "Store Conditional Failed.\n", - req->threadId()); + req->contextId()); } // store conditional failed already, so don't issue it to mem return false; @@ -105,6 +138,13 @@ handleLockedWrite(XC *xc, Request *req) return true; } +template +inline void +globalClearExclusive(XC *xc) +{ + xc->getCpuPtr()->wakeup(xc->threadId()); +} + } // namespace MipsISA #endif