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 &section);
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