simple_mem.hh revision 4626
18012Ssaidi@eecs.umich.edu/* 28013Sbinkertn@umich.edu * Copyright (c) 2001-2005 The Regents of The University of Michigan 38013Sbinkertn@umich.edu * All rights reserved. 48013Sbinkertn@umich.edu * 58013Sbinkertn@umich.edu * Redistribution and use in source and binary forms, with or without 68013Sbinkertn@umich.edu * modification, are permitted provided that the following conditions are 78013Sbinkertn@umich.edu * met: redistributions of source code must retain the above copyright 88013Sbinkertn@umich.edu * notice, this list of conditions and the following disclaimer; 98013Sbinkertn@umich.edu * redistributions in binary form must reproduce the above copyright 108013Sbinkertn@umich.edu * notice, this list of conditions and the following disclaimer in the 118013Sbinkertn@umich.edu * documentation and/or other materials provided with the distribution; 128013Sbinkertn@umich.edu * neither the name of the copyright holders nor the names of its 138013Sbinkertn@umich.edu * contributors may be used to endorse or promote products derived from 148013Sbinkertn@umich.edu * this software without specific prior written permission. 158013Sbinkertn@umich.edu * 168013Sbinkertn@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 178013Sbinkertn@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 188013Sbinkertn@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 198013Sbinkertn@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 208013Sbinkertn@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 218013Sbinkertn@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 228013Sbinkertn@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 238013Sbinkertn@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 248013Sbinkertn@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 258013Sbinkertn@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 268013Sbinkertn@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 278013Sbinkertn@umich.edu * 288013Sbinkertn@umich.edu * Authors: Ron Dreslinski 298013Sbinkertn@umich.edu */ 308012Ssaidi@eecs.umich.edu 318013Sbinkertn@umich.edu/* @file 328013Sbinkertn@umich.edu */ 338013Sbinkertn@umich.edu 348013Sbinkertn@umich.edu#ifndef __PHYSICAL_MEMORY_HH__ 358013Sbinkertn@umich.edu#define __PHYSICAL_MEMORY_HH__ 368013Sbinkertn@umich.edu 378013Sbinkertn@umich.edu#include "base/range.hh" 388013Sbinkertn@umich.edu#include "mem/mem_object.hh" 398013Sbinkertn@umich.edu#include "mem/packet.hh" 408013Sbinkertn@umich.edu#include "mem/tport.hh" 418013Sbinkertn@umich.edu#include "sim/eventq.hh" 428013Sbinkertn@umich.edu#include <map> 438013Sbinkertn@umich.edu#include <string> 448013Sbinkertn@umich.edu 458013Sbinkertn@umich.edu// 468013Sbinkertn@umich.edu// Functional model for a contiguous block of physical memory. (i.e. RAM) 478013Sbinkertn@umich.edu// 488013Sbinkertn@umich.educlass PhysicalMemory : public MemObject 498013Sbinkertn@umich.edu{ 508013Sbinkertn@umich.edu class MemoryPort : public SimpleTimingPort 518013Sbinkertn@umich.edu { 528013Sbinkertn@umich.edu PhysicalMemory *memory; 538013Sbinkertn@umich.edu 548012Ssaidi@eecs.umich.edu public: 558013Sbinkertn@umich.edu 568013Sbinkertn@umich.edu MemoryPort(const std::string &_name, PhysicalMemory *_memory); 578013Sbinkertn@umich.edu 588013Sbinkertn@umich.edu protected: 598012Ssaidi@eecs.umich.edu 608012Ssaidi@eecs.umich.edu virtual Tick recvAtomic(PacketPtr pkt); 618013Sbinkertn@umich.edu 628013Sbinkertn@umich.edu virtual void recvFunctional(PacketPtr pkt); 638013Sbinkertn@umich.edu 648013Sbinkertn@umich.edu virtual void recvStatusChange(Status status); 658013Sbinkertn@umich.edu 668013Sbinkertn@umich.edu virtual void getDeviceAddressRanges(AddrRangeList &resp, 678013Sbinkertn@umich.edu bool &snoop); 688013Sbinkertn@umich.edu 698013Sbinkertn@umich.edu virtual int deviceBlockSize(); 708013Sbinkertn@umich.edu }; 718008Ssaidi@eecs.umich.edu 728008Ssaidi@eecs.umich.edu int numPorts; 738008Ssaidi@eecs.umich.edu 748008Ssaidi@eecs.umich.edu 758008Ssaidi@eecs.umich.edu private: 768008Ssaidi@eecs.umich.edu // prevent copying of a MainMemory object 778008Ssaidi@eecs.umich.edu PhysicalMemory(const PhysicalMemory &specmem); 788008Ssaidi@eecs.umich.edu const PhysicalMemory &operator=(const PhysicalMemory &specmem); 798008Ssaidi@eecs.umich.edu 808008Ssaidi@eecs.umich.edu protected: 818008Ssaidi@eecs.umich.edu 828008Ssaidi@eecs.umich.edu class LockedAddr { 838008Ssaidi@eecs.umich.edu public: 848008Ssaidi@eecs.umich.edu // on alpha, minimum LL/SC granularity is 16 bytes, so lower 858008Ssaidi@eecs.umich.edu // bits need to masked off. 868008Ssaidi@eecs.umich.edu static const Addr Addr_Mask = 0xf; 878008Ssaidi@eecs.umich.edu 888008Ssaidi@eecs.umich.edu static Addr mask(Addr paddr) { return (paddr & ~Addr_Mask); } 898008Ssaidi@eecs.umich.edu 908008Ssaidi@eecs.umich.edu Addr addr; // locked address 918013Sbinkertn@umich.edu int cpuNum; // locking CPU 928008Ssaidi@eecs.umich.edu int threadNum; // locking thread ID within CPU 938008Ssaidi@eecs.umich.edu 948008Ssaidi@eecs.umich.edu // check for matching execution context 958008Ssaidi@eecs.umich.edu bool matchesContext(Request *req) 968008Ssaidi@eecs.umich.edu { 978008Ssaidi@eecs.umich.edu return (cpuNum == req->getCpuNum() && 988008Ssaidi@eecs.umich.edu threadNum == req->getThreadNum()); 998008Ssaidi@eecs.umich.edu } 1008013Sbinkertn@umich.edu 1018008Ssaidi@eecs.umich.edu LockedAddr(Request *req) 1028008Ssaidi@eecs.umich.edu : addr(mask(req->getPaddr())), 1038008Ssaidi@eecs.umich.edu cpuNum(req->getCpuNum()), 1048008Ssaidi@eecs.umich.edu threadNum(req->getThreadNum()) 1058013Sbinkertn@umich.edu { 1068008Ssaidi@eecs.umich.edu } 1078008Ssaidi@eecs.umich.edu }; 1088008Ssaidi@eecs.umich.edu 1098008Ssaidi@eecs.umich.edu std::list<LockedAddr> lockedAddrList; 1108008Ssaidi@eecs.umich.edu 1118008Ssaidi@eecs.umich.edu // helper function for checkLockedAddrs(): we really want to 1128013Sbinkertn@umich.edu // inline a quick check for an empty locked addr list (hopefully 1138008Ssaidi@eecs.umich.edu // the common case), and do the full list search (if necessary) in 1148013Sbinkertn@umich.edu // this out-of-line function 1158008Ssaidi@eecs.umich.edu bool checkLockedAddrList(PacketPtr pkt); 1168008Ssaidi@eecs.umich.edu 1178008Ssaidi@eecs.umich.edu // Record the address of a load-locked operation so that we can 1188013Sbinkertn@umich.edu // clear the execution context's lock flag if a matching store is 1198013Sbinkertn@umich.edu // performed 1208008Ssaidi@eecs.umich.edu void trackLoadLocked(PacketPtr pkt); 1218013Sbinkertn@umich.edu 1228008Ssaidi@eecs.umich.edu // Compare a store address with any locked addresses so we can 1238008Ssaidi@eecs.umich.edu // clear the lock flag appropriately. Return value set to 'false' 1248008Ssaidi@eecs.umich.edu // if store operation should be suppressed (because it was a 1258013Sbinkertn@umich.edu // conditional store and the address was no longer locked by the 1268013Sbinkertn@umich.edu // requesting execution context), 'true' otherwise. Note that 1278008Ssaidi@eecs.umich.edu // this method must be called on *all* stores since even 1288008Ssaidi@eecs.umich.edu // non-conditional stores must clear any matching lock addresses. 1298008Ssaidi@eecs.umich.edu bool writeOK(PacketPtr pkt) { 1308008Ssaidi@eecs.umich.edu Request *req = pkt->req; 1318008Ssaidi@eecs.umich.edu if (lockedAddrList.empty()) { 1328013Sbinkertn@umich.edu // no locked addrs: nothing to check, store_conditional fails 1338008Ssaidi@eecs.umich.edu bool isLocked = pkt->isLocked(); 1348008Ssaidi@eecs.umich.edu if (isLocked) { 1358008Ssaidi@eecs.umich.edu req->setExtraData(0); 1368013Sbinkertn@umich.edu } 1378008Ssaidi@eecs.umich.edu return !isLocked; // only do write if not an sc 1388008Ssaidi@eecs.umich.edu } else { 1398008Ssaidi@eecs.umich.edu // iterate over list... 1408008Ssaidi@eecs.umich.edu return checkLockedAddrList(pkt); 1418008Ssaidi@eecs.umich.edu } 1428008Ssaidi@eecs.umich.edu } 1438008Ssaidi@eecs.umich.edu 1448008Ssaidi@eecs.umich.edu uint8_t *pmemAddr; 1458008Ssaidi@eecs.umich.edu int pagePtr; 1468008Ssaidi@eecs.umich.edu Tick lat; 1478013Sbinkertn@umich.edu std::vector<MemoryPort*> ports; 1488008Ssaidi@eecs.umich.edu typedef std::vector<MemoryPort*>::iterator PortIterator; 1498008Ssaidi@eecs.umich.edu 1508008Ssaidi@eecs.umich.edu public: 1518008Ssaidi@eecs.umich.edu Addr new_page(); 1528008Ssaidi@eecs.umich.edu uint64_t size() { return params()->addrRange.size(); } 1538008Ssaidi@eecs.umich.edu uint64_t start() { return params()->addrRange.start; } 1548008Ssaidi@eecs.umich.edu 1558008Ssaidi@eecs.umich.edu struct Params 1568008Ssaidi@eecs.umich.edu { 1578008Ssaidi@eecs.umich.edu std::string name; 1588013Sbinkertn@umich.edu Range<Addr> addrRange; 1598008Ssaidi@eecs.umich.edu Tick latency; 1608008Ssaidi@eecs.umich.edu bool zero; 1618008Ssaidi@eecs.umich.edu }; 1628008Ssaidi@eecs.umich.edu 1638008Ssaidi@eecs.umich.edu protected: 1648008Ssaidi@eecs.umich.edu Params *_params; 1658008Ssaidi@eecs.umich.edu 1668008Ssaidi@eecs.umich.edu public: 1678008Ssaidi@eecs.umich.edu const Params *params() const { return _params; } 1688008Ssaidi@eecs.umich.edu PhysicalMemory(Params *p); 1698013Sbinkertn@umich.edu virtual ~PhysicalMemory(); 1708008Ssaidi@eecs.umich.edu 1718008Ssaidi@eecs.umich.edu public: 1728008Ssaidi@eecs.umich.edu int deviceBlockSize(); 1738008Ssaidi@eecs.umich.edu void getAddressRanges(AddrRangeList &resp, bool &snoop); 1748008Ssaidi@eecs.umich.edu virtual Port *getPort(const std::string &if_name, int idx = -1); 1758008Ssaidi@eecs.umich.edu void virtual init(); 1768008Ssaidi@eecs.umich.edu unsigned int drain(Event *de); 1778008Ssaidi@eecs.umich.edu 1788008Ssaidi@eecs.umich.edu protected: 1798008Ssaidi@eecs.umich.edu Tick doAtomicAccess(PacketPtr pkt); 1808013Sbinkertn@umich.edu void doFunctionalAccess(PacketPtr pkt); 1818008Ssaidi@eecs.umich.edu virtual Tick calculateLatency(PacketPtr pkt); 1828008Ssaidi@eecs.umich.edu void recvStatusChange(Port::Status status); 1838008Ssaidi@eecs.umich.edu 1848008Ssaidi@eecs.umich.edu public: 1858013Sbinkertn@umich.edu virtual void serialize(std::ostream &os); 1868008Ssaidi@eecs.umich.edu virtual void unserialize(Checkpoint *cp, const std::string §ion); 187 188}; 189 190#endif //__PHYSICAL_MEMORY_HH__ 191