Many changes that make the new mem system compile. Now to convert the rest of the...
authorRon Dreslinski <rdreslin@umich.edu>
Wed, 15 Feb 2006 19:21:09 +0000 (14:21 -0500)
committerRon Dreslinski <rdreslin@umich.edu>
Wed, 15 Feb 2006 19:21:09 +0000 (14:21 -0500)
mem/mem_object.hh:
    Create constrtor so it compiles
mem/packet.hh:
    Fix typedefs so they compile, add in a few more headers for compilation
mem/page_table.cc:
    convert to new mem system so it compiles
mem/page_table.hh:
    fix it to the version that had asid support.  Make it compile in the new system
mem/physical.cc:
    Fix some compilation bugs
mem/physical.hh:
    Add a type that made compile fail
mem/port.hh:
    Fix a spelling error that messed up compilation
mem/request.hh:
    fix typedefs and forward declerations so it compiles

--HG--
extra : convert_revision : 580fb1ba31ada799ff0122601b8b5a8d994bb8af

mem/mem_object.hh
mem/packet.hh
mem/page_table.cc
mem/page_table.hh
mem/physical.cc
mem/physical.hh
mem/port.hh
mem/request.hh

index c6c5076e8f2e380bdd9a8e350b6cdb5f056663e7..634fb164af505ca873530da2bc79cb6b9b0c7503 100644 (file)
  * The base MemoryObject class, allows for an accesor function to a
  * simobj that returns the Port.
  */
-class MemoryObject : public SimObject
+class MemObject : public SimObject
 {
+  public:
+    MemObject(const std::string &name)
+        : SimObject(name)
+    {};
+
   public:
     /** Additional function to return the Port of a memory object. */
     virtual Port *getPort(const char *if_name) = 0;
index ca2a84fb3d0e615f19e3142f327301e4ebadde59..ef4eb85d9c7b64eae4a8fbb8c009e1ce9e06521b 100644 (file)
 #define __MEM_PACKET_HH__
 
 #include "mem/request.hh"
+#include "targetarch/isa_traits.hh"
+#include "sim/root.hh"
+
+struct Packet;
+typedef Packet* PacketPtr;
+typedef uint8_t* PacketDataPtr;
 
 /** List of all commands associated with a packet. */
 enum Command
@@ -54,8 +60,6 @@ enum PacketResult
 class SenderState{};
 class Coherence{};
 
-typedef PacketDataPtr *unit8_t;
-
 /**
  * A Packet is the structure to handle requests between two levels
  * of the memory system.  The Request is a global object that trancends
@@ -118,6 +122,4 @@ struct Packet
     short getDest() const { return dest; }
 };
 
-typedef PacketPtr *Packet;
-
 #endif //__MEM_PACKET_HH
index 2b2145503d4574eb1ee7061f3829e99004a09e7a..cd93c0692276e42bcc717557fc04961326c32ec1 100644 (file)
 #include <map>
 #include <fstream>
 
-#include "base/bitfield.hh"
+using namespace std;
+
 #include "base/intmath.hh"
 #include "base/trace.hh"
-#include "mem/mem_cmd.hh"
-#include "mem/mem_req.hh"
+#include "mem/physical.hh"
 #include "mem/page_table.hh"
 #include "sim/builder.hh"
 #include "sim/sim_object.hh"
-#include "sim/system.hh"
-
-using namespace std;
 
-PageTable::PageTable(System *_system, Addr _pageSize)
-    : pageSize(_pageSize), offsetMask(mask(FloorLog2(_pageSize))),
-      system(_system)
+PageTable::PageTable(const std::string &name)
+    : SimObject(name)
 {
-    assert(IsPowerOf2(pageSize));
 }
 
 PageTable::~PageTable()
 {
+    //Iterate the page table freeing the memoruy
+    //Addr addr;
+    //std::map<Addr,Addr>::iterator iter;
+
+    //iter = pTable.begin();
+    //while(iter != pTable.end())
+    //{
+    //delete [] (uint8_t *)iter->second;
+//     iter ++;
+    //  }
+
 }
 
 Fault
 PageTable::page_check(Addr addr, int size) const
 {
     if (size < sizeof(uint64_t)) {
-        if (!IsPowerOf2(size)) {
+        if (!isPowerOf2(size)) {
             panic("Invalid request size!\n");
             return Machine_Check_Fault;
         }
@@ -83,49 +89,78 @@ PageTable::page_check(Addr addr, int size) const
 }
 
 
+Fault
+PageTable::translate(CpuRequestPtr &req)
+{
+//Should I check here for accesses that are > VMPageSize?
+    req->paddr = translate(req->vaddr, req->asid);
+    return page_check(req->paddr, req->size);
+}
 
 
-void
-PageTable::allocate(Addr vaddr, int size)
+Addr
+PageTable::translate(Addr vaddr, unsigned asid)
 {
-    // starting address must be page aligned
-    assert(pageOffset(vaddr) == 0);
+    Addr hash_addr;
+    std::map<Addr,Addr>::iterator iter;
 
-    for (; size > 0; size -= pageSize, vaddr += pageSize) {
-        std::map<Addr,Addr>::iterator iter = pTable.find(vaddr);
+    //DPRINTF(PageTable,"PageTable: Virtual Address %#x Translating for ASID %i\n",
+    //    vaddr,asid);
 
-        if (iter != pTable.end()) {
-            // already mapped
-            fatal("PageTable::allocate: address 0x%x already mapped", vaddr);
-        }
+    //Create the hash_addr
+    //Combine vaddr and asid
+    hash_addr = vaddr & (~(VMPageSize - 1)) | asid;
 
-        pTable[vaddr] = system->new_page();
-    }
-}
+    //DPRINTF(PageTable,"PageTable: Hash Address %#x\n",hash_addr);
 
+    //Look into the page table
+    iter=pTable.find(hash_addr);
 
+    //bool page_fault = true;
 
-bool
-PageTable::translate(Addr vaddr, Addr &paddr)
-{
-    Addr page_addr = pageAlign(vaddr);
-    std::map<Addr,Addr>::iterator iter = pTable.find(page_addr);
+    //Store the translated address if found, and return
+    if (iter != pTable.end()) //Found??
+    {
+      Addr return_addr = iter->second + (vaddr & (VMPageSize - 1));
 
-    if (iter == pTable.end()) {
-        return false;
+      return return_addr;
     }
+    else//Alocate a new page, register translation
+    {
+        Addr return_addr;
+
+        //DPRINTF(PageTable,"PageTable: Page Not Found. Allocating new page\n");
 
-    paddr = iter->second + pageOffset(vaddr);
-    return true;
+        Addr new_page = mem->new_page();
+
+        pTable[hash_addr] = new_page;
+
+        return_addr = new_page + (vaddr & (VMPageSize - 1));
+
+        return return_addr;
+    }
 }
 
+BEGIN_DECLARE_SIM_OBJECT_PARAMS(PageTable)
 
-Fault
-PageTable::translate(MemReqPtr &req)
+    SimObjectParam<PhysicalMemory *> physmem;
+
+END_DECLARE_SIM_OBJECT_PARAMS(PageTable)
+
+BEGIN_INIT_SIM_OBJECT_PARAMS(PageTable)
+
+    INIT_PARAM_DFLT(physmem, "Pointer to functional memory", NULL)
+
+END_INIT_SIM_OBJECT_PARAMS(PageTable)
+
+CREATE_SIM_OBJECT(PageTable)
 {
-    assert(pageAlign(req->vaddr + req->size - 1) == pageAlign(req->vaddr));
-    if (!translate(req->vaddr, req->paddr)) {
-        return Machine_Check_Fault;
-    }
-    return page_check(req->paddr, req->size);
+    PageTable *pTable = new PageTable(getInstanceName());
+
+    if (physmem)
+        pTable->setPhysMem(physmem);
+
+    return pTable;
 }
+
+REGISTER_SIM_OBJECT("PageTable", PageTable)
index 785f0928fb205b26fabf64b9ba720d5ca8475df2..7e534899f464ffbf919f432eab3e56672483c817 100644 (file)
 #include <map>
 
 #include "base/trace.hh"
-#include "mem/mem_req.hh"
-#include "mem/mem_cmd.hh"
+#include "mem/request.hh"
+#include "mem/packet.hh"
 #include "sim/sim_object.hh"
 
-class System;
+class PhysicalMemory;
 
 /**
  * Page Table Decleration.
  */
-class PageTable
+class PageTable : public SimObject
 {
   protected:
     std::map<Addr,Addr> pTable;
 
-    const Addr pageSize;
-    const Addr offsetMask;
-
-    System *system;
+    PhysicalMemory *mem;
 
   public:
 
-    PageTable(System *_system, Addr _pageSize = VMPageSize);
+    /**
+     * Construct this interface.
+     * @param name The name of this interface.
+     * @param hier Pointer to the hierarchy wide parameters.
+     * @param _mem the connected memory.
+     */
+    PageTable(const std::string &name);
 
     ~PageTable();
 
-    Addr pageAlign(Addr a)  { return (a & ~offsetMask); }
-    Addr pageOffset(Addr a) { return (a &  offsetMask); }
+    void setPhysMem(PhysicalMemory *_mem) { mem = _mem; }
 
     Fault page_check(Addr addr, int size) const;
 
-    void allocate(Addr vaddr, int size);
-
     /**
      * Translate function
      * @param vaddr The virtual address.
+     * @param asid The address space id.
      * @return Physical address from translation.
      */
-    bool translate(Addr vaddr, Addr &paddr);
+    Addr translate(Addr vaddr, unsigned asid);
 
     /**
      * Perform a translation on the memory request, fills in paddr field of mem_req.
      * @param req The memory request.
      */
-    Fault translate(MemReqPtr &req);
+    Fault translate(CpuRequestPtr &req);
 
 };
 
index c45e1275025a58e2f4224c90c8df29050913e197..02563ac70bf81a6b3bd3f904f952d7257bd83ab4 100644 (file)
 #if FULL_SYSTEM
 #include "mem/functional/memory_control.hh"
 #endif
-#include "mem/functional/physical.hh"
+#include "mem/physical.hh"
 #include "sim/host.hh"
 #include "sim/builder.hh"
 #include "targetarch/isa_traits.hh"
 
+
 using namespace std;
 
 #if FULL_SYSTEM
@@ -89,7 +90,7 @@ PhysicalMemory::PhysicalMemory(const string &n, Range<Addr> range,
 #endif
 
 PhysicalMemory::PhysicalMemory(const string &n)
-    : FunctionalMemory(n), base_addr(0), pmem_addr(NULL)
+    : Memory(n), base_addr(0), pmem_addr(NULL)
 {
     // Hardcoded to 128 MB for now.
     pmem_size = 1 << 27;
index 5410024e5b1cb7e7369985268c965b5eb5004ef1..a8ed45115d85d38d76db7d253f4225b01de98357 100644 (file)
@@ -78,6 +78,7 @@ class PhysicalMemory : public Memory
     virtual void unserialize(Checkpoint *cp, const std::string &section);
 };
 
+uint64_t
 PhysicalMemory::phys_read_qword(Addr addr) const
 {
     if (addr + sizeof(uint64_t) > pmem_size)
index 81150b2a30834e8e7e1307109218be16d3d10e5e..6b32adb578b5bf24c5058a0931a92640d068c065 100644 (file)
@@ -120,7 +120,7 @@ class Port
         an object wants to own some ranges and snoop on others, it will
         need to use two different ports.
     */
-    virtual void recvAddressRangeQuery(std::list<Range<Addr> > &range_list,
+    virtual void recvAddressRangesQuery(std::list<Range<Addr> > &range_list,
                                        bool &owner) = 0;
 
   public:
index bcbf3fecfe098a7e8cd9b28be6b7393dfba8699c..9f03c4e75a45c64fc8b67701f98597d2164dbe4c 100644 (file)
 #ifndef __MEM_REQUEST_HH__
 #define __MEM_REQUEST_HH__
 
+#include "targetarch/isa_traits.hh"
+
+class Request;
+class CpuRequest;
+
+typedef Request* RequestPtr;
+typedef CpuRequest* CpuRequestPtr;
+
 class Request
 {
-
+    //@todo Make Accesor functions, make these private.
+  public:
     /** The physical address of the request. */
     Addr paddr;
 
@@ -53,10 +62,10 @@ class Request
     Addr copyDest;
 };
 
-typedef RequestPtr *Request;
-
 class CpuRequest : public Request
 {
+    //@todo Make Accesor functions, make these private.
+  public:
     /** The virtual address of the request. */
     Addr vaddr;