abstract_mem.hh revision 2665
112855Sgabeblack@google.com/*
212855Sgabeblack@google.com * Copyright (c) 2001-2005 The Regents of The University of Michigan
312855Sgabeblack@google.com * All rights reserved.
412855Sgabeblack@google.com *
512855Sgabeblack@google.com * Redistribution and use in source and binary forms, with or without
612855Sgabeblack@google.com * modification, are permitted provided that the following conditions are
712855Sgabeblack@google.com * met: redistributions of source code must retain the above copyright
812855Sgabeblack@google.com * notice, this list of conditions and the following disclaimer;
912855Sgabeblack@google.com * redistributions in binary form must reproduce the above copyright
1012855Sgabeblack@google.com * notice, this list of conditions and the following disclaimer in the
1112855Sgabeblack@google.com * documentation and/or other materials provided with the distribution;
1212855Sgabeblack@google.com * neither the name of the copyright holders nor the names of its
1312855Sgabeblack@google.com * contributors may be used to endorse or promote products derived from
1412855Sgabeblack@google.com * this software without specific prior written permission.
1512855Sgabeblack@google.com *
1612855Sgabeblack@google.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1712855Sgabeblack@google.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1812855Sgabeblack@google.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1912855Sgabeblack@google.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2012855Sgabeblack@google.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2112855Sgabeblack@google.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2212855Sgabeblack@google.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2312855Sgabeblack@google.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2412855Sgabeblack@google.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2512855Sgabeblack@google.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2612855Sgabeblack@google.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2712855Sgabeblack@google.com *
2812855Sgabeblack@google.com * Authors: Ron Dreslinski
2912855Sgabeblack@google.com */
3012855Sgabeblack@google.com
3112855Sgabeblack@google.com/* @file
3212855Sgabeblack@google.com */
3312855Sgabeblack@google.com
3412855Sgabeblack@google.com#ifndef __PHYSICAL_MEMORY_HH__
3512855Sgabeblack@google.com#define __PHYSICAL_MEMORY_HH__
3612855Sgabeblack@google.com
3712855Sgabeblack@google.com#include "base/range.hh"
3812855Sgabeblack@google.com#include "mem/mem_object.hh"
3912855Sgabeblack@google.com#include "mem/packet.hh"
4012855Sgabeblack@google.com#include "mem/port.hh"
4112855Sgabeblack@google.com#include "sim/eventq.hh"
4212855Sgabeblack@google.com#include <map>
4312855Sgabeblack@google.com#include <string>
4412855Sgabeblack@google.com
4512855Sgabeblack@google.com//
4612855Sgabeblack@google.com// Functional model for a contiguous block of physical memory. (i.e. RAM)
4712855Sgabeblack@google.com//
4812855Sgabeblack@google.comclass PhysicalMemory : public MemObject
4912855Sgabeblack@google.com{
5012855Sgabeblack@google.com    class MemoryPort : public Port
5112855Sgabeblack@google.com    {
5212855Sgabeblack@google.com        PhysicalMemory *memory;
5312855Sgabeblack@google.com
5412855Sgabeblack@google.com      public:
5512855Sgabeblack@google.com
5612855Sgabeblack@google.com        MemoryPort(const std::string &_name, PhysicalMemory *_memory);
5712855Sgabeblack@google.com
5812855Sgabeblack@google.com      protected:
5912855Sgabeblack@google.com
6012855Sgabeblack@google.com        virtual bool recvTiming(Packet *pkt);
6112855Sgabeblack@google.com
6212855Sgabeblack@google.com        virtual Tick recvAtomic(Packet *pkt);
6312855Sgabeblack@google.com
6412855Sgabeblack@google.com        virtual void recvFunctional(Packet *pkt);
6512855Sgabeblack@google.com
6612855Sgabeblack@google.com        virtual void recvStatusChange(Status status);
6712855Sgabeblack@google.com
6812855Sgabeblack@google.com        virtual void getDeviceAddressRanges(AddrRangeList &resp,
6912855Sgabeblack@google.com                                            AddrRangeList &snoop);
7012855Sgabeblack@google.com
7112855Sgabeblack@google.com        virtual int deviceBlockSize();
7212855Sgabeblack@google.com    };
7312855Sgabeblack@google.com
7412855Sgabeblack@google.com    int numPorts;
7512855Sgabeblack@google.com
7612855Sgabeblack@google.com
7712855Sgabeblack@google.com    struct MemResponseEvent : public Event
7812855Sgabeblack@google.com    {
7912855Sgabeblack@google.com        Packet *pkt;
8012855Sgabeblack@google.com        MemoryPort *memoryPort;
8112855Sgabeblack@google.com
8212855Sgabeblack@google.com        MemResponseEvent(Packet *pkt, MemoryPort *memoryPort);
8312855Sgabeblack@google.com        void process();
8412855Sgabeblack@google.com        const char *description();
8512855Sgabeblack@google.com    };
8612855Sgabeblack@google.com
8712855Sgabeblack@google.com  private:
8812855Sgabeblack@google.com    // prevent copying of a MainMemory object
8912855Sgabeblack@google.com    PhysicalMemory(const PhysicalMemory &specmem);
9012855Sgabeblack@google.com    const PhysicalMemory &operator=(const PhysicalMemory &specmem);
9112855Sgabeblack@google.com
9212855Sgabeblack@google.com  protected:
9312855Sgabeblack@google.com    Addr base_addr;
9412855Sgabeblack@google.com    Addr pmem_size;
9512855Sgabeblack@google.com    uint8_t *pmem_addr;
9612855Sgabeblack@google.com    MemoryPort *port;
9712855Sgabeblack@google.com    int page_ptr;
9812855Sgabeblack@google.com    Tick lat;
9912855Sgabeblack@google.com
10012855Sgabeblack@google.com  public:
10112855Sgabeblack@google.com    Addr new_page();
10212855Sgabeblack@google.com    uint64_t size() { return pmem_size; }
10312855Sgabeblack@google.com
10412855Sgabeblack@google.com  public:
10512855Sgabeblack@google.com    PhysicalMemory(const std::string &n, Tick latency);
10612855Sgabeblack@google.com    virtual ~PhysicalMemory();
10712855Sgabeblack@google.com
10812855Sgabeblack@google.com  public:
10912855Sgabeblack@google.com    int deviceBlockSize();
11012855Sgabeblack@google.com    void getAddressRanges(AddrRangeList &resp, AddrRangeList &snoop);
11112855Sgabeblack@google.com    virtual Port *getPort(const std::string &if_name);
11212855Sgabeblack@google.com    void virtual init();
11312855Sgabeblack@google.com
11412855Sgabeblack@google.com    // fast back-door memory access for vtophys(), remote gdb, etc.
11512855Sgabeblack@google.com    // uint64_t phys_read_qword(Addr addr) const;
11612855Sgabeblack@google.com  private:
11712855Sgabeblack@google.com    bool doTimingAccess(Packet *pkt, MemoryPort *memoryPort);
11812855Sgabeblack@google.com    Tick doAtomicAccess(Packet *pkt);
11912855Sgabeblack@google.com    void doFunctionalAccess(Packet *pkt);
12012855Sgabeblack@google.com
12112855Sgabeblack@google.com    void recvStatusChange(Port::Status status);
12212855Sgabeblack@google.com
12312855Sgabeblack@google.com  public:
12412855Sgabeblack@google.com    virtual void serialize(std::ostream &os);
12512855Sgabeblack@google.com    virtual void unserialize(Checkpoint *cp, const std::string &section);
12612855Sgabeblack@google.com
12712855Sgabeblack@google.com};
12812855Sgabeblack@google.com
12912855Sgabeblack@google.com#endif //__PHYSICAL_MEMORY_HH__
13012855Sgabeblack@google.com