physical.hh revision 2413
15433Sgblack@eecs.umich.edu/* 25081Sgblack@eecs.umich.edu * Copyright (c) 2001-2005 The Regents of The University of Michigan 35081Sgblack@eecs.umich.edu * All rights reserved. 47087Snate@binkert.org * 57087Snate@binkert.org * Redistribution and use in source and binary forms, with or without 67087Snate@binkert.org * modification, are permitted provided that the following conditions are 77087Snate@binkert.org * met: redistributions of source code must retain the above copyright 87087Snate@binkert.org * notice, this list of conditions and the following disclaimer; 97087Snate@binkert.org * redistributions in binary form must reproduce the above copyright 107087Snate@binkert.org * notice, this list of conditions and the following disclaimer in the 117087Snate@binkert.org * documentation and/or other materials provided with the distribution; 125081Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 137087Snate@binkert.org * contributors may be used to endorse or promote products derived from 147087Snate@binkert.org * this software without specific prior written permission. 157087Snate@binkert.org * 167087Snate@binkert.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 177087Snate@binkert.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 187087Snate@binkert.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 197087Snate@binkert.org * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 207087Snate@binkert.org * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 215081Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 227087Snate@binkert.org * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 235081Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 245081Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255081Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 265081Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275081Sgblack@eecs.umich.edu */ 285081Sgblack@eecs.umich.edu 295081Sgblack@eecs.umich.edu/* @file 305081Sgblack@eecs.umich.edu */ 315081Sgblack@eecs.umich.edu 325081Sgblack@eecs.umich.edu#ifndef __PHYSICAL_MEMORY_HH__ 335081Sgblack@eecs.umich.edu#define __PHYSICAL_MEMORY_HH__ 345081Sgblack@eecs.umich.edu 355081Sgblack@eecs.umich.edu#include "base/range.hh" 365081Sgblack@eecs.umich.edu#include "mem/memory.hh" 375081Sgblack@eecs.umich.edu 385081Sgblack@eecs.umich.edu// 395081Sgblack@eecs.umich.edu// Functional model for a contiguous block of physical memory. (i.e. RAM) 405081Sgblack@eecs.umich.edu// 415081Sgblack@eecs.umich.educlass PhysicalMemory : public Memory 425081Sgblack@eecs.umich.edu{ 439700Snilay@cs.wisc.edu class MemoryPort : public Port 445081Sgblack@eecs.umich.edu { 455081Sgblack@eecs.umich.edu PhysicalMemory *memory; 465119Sgblack@eecs.umich.edu 475081Sgblack@eecs.umich.edu public: 485081Sgblack@eecs.umich.edu 495081Sgblack@eecs.umich.edu MemoryPort(PhysicalMemory *_memory); 505081Sgblack@eecs.umich.edu 515081Sgblack@eecs.umich.edu protected: 525081Sgblack@eecs.umich.edu 535081Sgblack@eecs.umich.edu virtual bool recvTiming(Packet &pkt); 545081Sgblack@eecs.umich.edu 559700Snilay@cs.wisc.edu virtual Tick recvAtomic(Packet &pkt); 565081Sgblack@eecs.umich.edu 575081Sgblack@eecs.umich.edu virtual void recvFunctional(Packet &pkt); 585081Sgblack@eecs.umich.edu 595119Sgblack@eecs.umich.edu virtual void recvStatusChange(Status status); 605081Sgblack@eecs.umich.edu 615081Sgblack@eecs.umich.edu virtual void getDeviceAddressRanges(AddrRangeList &range_list, 625081Sgblack@eecs.umich.edu bool &owner); 635081Sgblack@eecs.umich.edu 645295Sgblack@eecs.umich.edu virtual int deviceBlockSize(); 655295Sgblack@eecs.umich.edu 665295Sgblack@eecs.umich.edu }; 679700Snilay@cs.wisc.edu 685295Sgblack@eecs.umich.edu MemoryPort memoryPort; 695295Sgblack@eecs.umich.edu 705295Sgblack@eecs.umich.edu Port * PhysicalMemory::getPort(const char *if_name); 715295Sgblack@eecs.umich.edu 725295Sgblack@eecs.umich.edu int lat; 735433Sgblack@eecs.umich.edu 745295Sgblack@eecs.umich.edu //event to send response needs to be here 759671SChristian.Menard@tu-dresden.de 769671SChristian.Menard@tu-dresden.de private: 779671SChristian.Menard@tu-dresden.de // prevent copying of a MainMemory object 789671SChristian.Menard@tu-dresden.de PhysicalMemory(const PhysicalMemory &specmem); 799671SChristian.Menard@tu-dresden.de const PhysicalMemory &operator=(const PhysicalMemory &specmem); 805295Sgblack@eecs.umich.edu 815295Sgblack@eecs.umich.edu protected: 825295Sgblack@eecs.umich.edu Addr base_addr; 835295Sgblack@eecs.umich.edu Addr pmem_size; 845295Sgblack@eecs.umich.edu uint8_t *pmem_addr; 855295Sgblack@eecs.umich.edu int page_ptr; 865295Sgblack@eecs.umich.edu 875295Sgblack@eecs.umich.edu public: 885295Sgblack@eecs.umich.edu Addr new_page(); 895433Sgblack@eecs.umich.edu uint64_t size() { return pmem_size; } 905661Sgblack@eecs.umich.edu 915433Sgblack@eecs.umich.edu public: 925433Sgblack@eecs.umich.edu PhysicalMemory(const std::string &n); 935661Sgblack@eecs.umich.edu virtual ~PhysicalMemory(); 945433Sgblack@eecs.umich.edu 955661Sgblack@eecs.umich.edu protected: 965433Sgblack@eecs.umich.edu // error handling for prot_* functions 975433Sgblack@eecs.umich.edu void prot_access_error(Addr addr, int size, const std::string &func); 985433Sgblack@eecs.umich.edu 995433Sgblack@eecs.umich.edu public: 1005295Sgblack@eecs.umich.edu virtual int deviceBlockSize(); 1015295Sgblack@eecs.umich.edu 1025590Sgblack@eecs.umich.edu // Read/Write arbitrary amounts of data to simulated memory space 1035590Sgblack@eecs.umich.edu void prot_read(Addr addr, uint8_t *p, int size); 1045295Sgblack@eecs.umich.edu void prot_write(Addr addr, const uint8_t *p, int size); 1059700Snilay@cs.wisc.edu void prot_memset(Addr addr, uint8_t val, int size); 1065295Sgblack@eecs.umich.edu 1075295Sgblack@eecs.umich.edu // fast back-door memory access for vtophys(), remote gdb, etc. 1089700Snilay@cs.wisc.edu uint64_t phys_read_qword(Addr addr) const; 1099700Snilay@cs.wisc.edu private: 1105295Sgblack@eecs.umich.edu bool doTimingAccess(Packet &pkt); 1115081Sgblack@eecs.umich.edu Tick doAtomicAccess(Packet &pkt); 112 void doFunctionalAccess(Packet &pkt); 113 114 void recvStatusChange(Port::Status status); 115 116 public: 117 virtual void serialize(std::ostream &os); 118 virtual void unserialize(Checkpoint *cp, const std::string §ion); 119}; 120 121/*uint64_t 122PhysicalMemory::phys_read_qword(Addr addr) const 123{ 124 if (addr + sizeof(uint64_t) > pmem_size) 125 return 0; 126 127 return *(uint64_t *)(pmem_addr + addr); 128}*/ 129 130 131#endif //__PHYSICAL_MEMORY_HH__ 132