changeset af28085882dc in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=af28085882dc
description:
        SE: move page allocation from PageTable to Process

        PageTable supported an allocate() call that called back
        through the Process to allocate memory, but did not have
        a method to map addresses without allocating new pages.
        It makes more sense for Process to do the allocation, so
        this method was renamed allocateMem() and moved to Process,
        and uses a new map() call on PageTable.

        The remaining uses of the process pointer in PageTable
        were only to get the name and the PID, so by passing these
        in directly in the constructor, we can make PageTable
        completely independent of Process.

diffstat:

 src/arch/alpha/process.cc     |   2 +-
 src/arch/arm/linux/process.cc |   2 +-
 src/arch/arm/process.cc       |   3 +--
 src/arch/mips/process.cc      |   2 +-
 src/arch/power/process.cc     |   3 +--
 src/arch/sparc/process.cc     |   3 +--
 src/arch/x86/process.cc       |   9 ++++-----
 src/kern/tru64/tru64.hh       |   4 ++--
 src/mem/page_table.cc         |  23 ++++++++++-------------
 src/mem/page_table.hh         |  15 +++++++++------
 src/mem/translating_port.cc   |   8 ++++----
 src/sim/process.cc            |  14 +++++++++++---
 src/sim/process.hh            |   2 ++
 src/sim/syscall_emul.cc       |   3 +--
 src/sim/syscall_emul.hh       |  10 +++++-----
 src/sim/system.cc             |   4 ++--
 src/sim/system.hh             |   4 +++-
 17 files changed, 59 insertions(+), 52 deletions(-)

diffs (truncated from 424 to 300 lines):

diff -r b0d7c64ada19 -r af28085882dc src/arch/alpha/process.cc
--- a/src/arch/alpha/process.cc Sat Oct 22 22:30:07 2011 -0700
+++ b/src/arch/alpha/process.cc Sat Oct 22 22:30:08 2011 -0700
@@ -126,7 +126,7 @@
     stack_min = roundDown(stack_min, pageSize);
     stack_size = stack_base - stack_min;
     // map memory
-    pTable->allocate(stack_min, roundUp(stack_size, pageSize));
+    allocateMem(stack_min, roundUp(stack_size, pageSize));
 
     // map out initial stack contents
     Addr argv_array_base = stack_min + intSize; // room for argc
diff -r b0d7c64ada19 -r af28085882dc src/arch/arm/linux/process.cc
--- a/src/arch/arm/linux/process.cc     Sat Oct 22 22:30:07 2011 -0700
+++ b/src/arch/arm/linux/process.cc     Sat Oct 22 22:30:08 2011 -0700
@@ -503,7 +503,7 @@
 ArmLinuxProcess::initState()
 {
     ArmLiveProcess::initState();
-    pTable->allocate(commPage, PageBytes);
+    allocateMem(commPage, PageBytes);
     ThreadContext *tc = system->getThreadContext(contextIds[0]);
 
     uint8_t swiNeg1[] = {
diff -r b0d7c64ada19 -r af28085882dc src/arch/arm/process.cc
--- a/src/arch/arm/process.cc   Sat Oct 22 22:30:07 2011 -0700
+++ b/src/arch/arm/process.cc   Sat Oct 22 22:30:08 2011 -0700
@@ -251,8 +251,7 @@
     stack_size = stack_base - stack_min;
 
     // map memory
-    pTable->allocate(roundDown(stack_min, pageSize),
-                     roundUp(stack_size, pageSize));
+    allocateMem(roundDown(stack_min, pageSize), roundUp(stack_size, pageSize));
 
     // map out initial stack contents
     uint32_t sentry_base = stack_base - sentry_size;
diff -r b0d7c64ada19 -r af28085882dc src/arch/mips/process.cc
--- a/src/arch/mips/process.cc  Sat Oct 22 22:30:07 2011 -0700
+++ b/src/arch/mips/process.cc  Sat Oct 22 22:30:08 2011 -0700
@@ -136,7 +136,7 @@
     stack_min = roundDown(stack_min, pageSize);
     stack_size = stack_base - stack_min;
     // map memory
-    pTable->allocate(stack_min, roundUp(stack_size, pageSize));
+    allocateMem(stack_min, roundUp(stack_size, pageSize));
 
     // map out initial stack contents
     IntType argv_array_base = stack_min + intSize; // room for argc
diff -r b0d7c64ada19 -r af28085882dc src/arch/power/process.cc
--- a/src/arch/power/process.cc Sat Oct 22 22:30:07 2011 -0700
+++ b/src/arch/power/process.cc Sat Oct 22 22:30:08 2011 -0700
@@ -187,8 +187,7 @@
     stack_size = stack_base - stack_min;
 
     // map memory
-    pTable->allocate(roundDown(stack_min, pageSize),
-                     roundUp(stack_size, pageSize));
+    allocateMem(roundDown(stack_min, pageSize), roundUp(stack_size, pageSize));
 
     // map out initial stack contents
     uint32_t sentry_base = stack_base - sentry_size;
diff -r b0d7c64ada19 -r af28085882dc src/arch/sparc/process.cc
--- a/src/arch/sparc/process.cc Sat Oct 22 22:30:07 2011 -0700
+++ b/src/arch/sparc/process.cc Sat Oct 22 22:30:08 2011 -0700
@@ -316,8 +316,7 @@
     stack_size = stack_base - stack_min;
 
     // Allocate space for the stack
-    pTable->allocate(roundDown(stack_min, pageSize),
-                     roundUp(stack_size, pageSize));
+    allocateMem(roundDown(stack_min, pageSize), roundUp(stack_size, pageSize));
 
     // map out initial stack contents
     IntType sentry_base = stack_base - sentry_size;
diff -r b0d7c64ada19 -r af28085882dc src/arch/x86/process.cc
--- a/src/arch/x86/process.cc   Sat Oct 22 22:30:07 2011 -0700
+++ b/src/arch/x86/process.cc   Sat Oct 22 22:30:08 2011 -0700
@@ -167,7 +167,7 @@
     argsInit(sizeof(uint64_t), VMPageSize);
 
        // Set up the vsyscall page for this process.
-    pTable->allocate(vsyscallPage.base, vsyscallPage.size);
+    allocateMem(vsyscallPage.base, vsyscallPage.size);
     uint8_t vtimeBlob[] = {
         0x48,0xc7,0xc0,0xc9,0x00,0x00,0x00,    // mov    $0xc9,%rax
         0x0f,0x05,                             // syscall
@@ -265,7 +265,7 @@
      * Set up a GDT for this process. The whole GDT wouldn't really be for
      * this process, but the only parts we care about are.
      */
-    pTable->allocate(_gdtStart, _gdtSize);
+    allocateMem(_gdtStart, _gdtSize);
     uint64_t zero = 0;
     assert(_gdtSize % sizeof(zero) == 0);
     for (Addr gdtCurrent = _gdtStart;
@@ -274,7 +274,7 @@
     }
 
     // Set up the vsyscall page for this process.
-    pTable->allocate(vsyscallPage.base, vsyscallPage.size);
+    allocateMem(vsyscallPage.base, vsyscallPage.size);
     uint8_t vsyscallBlob[] = {
         0x51,       // push %ecx
         0x52,       // push %edp
@@ -577,8 +577,7 @@
     stack_size = stack_base - stack_min;
 
     // map memory
-    pTable->allocate(roundDown(stack_min, pageSize),
-                     roundUp(stack_size, pageSize));
+    allocateMem(roundDown(stack_min, pageSize), roundUp(stack_size, pageSize));
 
     // map out initial stack contents
     IntType sentry_base = stack_base - sentry_size;
diff -r b0d7c64ada19 -r af28085882dc src/kern/tru64/tru64.hh
--- a/src/kern/tru64/tru64.hh   Sat Oct 22 22:30:07 2011 -0700
+++ b/src/kern/tru64/tru64.hh   Sat Oct 22 22:30:08 2011 -0700
@@ -564,7 +564,7 @@
                 stack_base, stack_size);
 
         // map memory
-        process->pTable->allocate(rounded_stack_base, rounded_stack_size);
+        process->allocateMem(rounded_stack_base, rounded_stack_size);
 
         argp->address = gtoh(rounded_stack_base);
         argp.copyOut(tc->getMemPort());
@@ -683,7 +683,7 @@
         // Register this as a valid address range with the process
         base_addr = roundDown(base_addr, VMPageSize);
         int size = cur_addr - base_addr;
-        process->pTable->allocate(base_addr, roundUp(size, VMPageSize));
+        process->allocateMem(base_addr, roundUp(size, VMPageSize));
 
         config.copyOut(tc->getMemPort());
         slot_state.copyOut(tc->getMemPort());
diff -r b0d7c64ada19 -r af28085882dc src/mem/page_table.cc
--- a/src/mem/page_table.cc     Sat Oct 22 22:30:07 2011 -0700
+++ b/src/mem/page_table.cc     Sat Oct 22 22:30:08 2011 -0700
@@ -45,16 +45,14 @@
 #include "debug/MMU.hh"
 #include "mem/page_table.hh"
 #include "sim/faults.hh"
-#include "sim/process.hh"
 #include "sim/sim_object.hh"
-#include "sim/system.hh"
 
 using namespace std;
 using namespace TheISA;
 
-PageTable::PageTable(Process *_process, Addr _pageSize)
+PageTable::PageTable(const std::string &__name, uint64_t _pid, Addr _pageSize)
     : pageSize(_pageSize), offsetMask(mask(floorLog2(_pageSize))),
-      process(_process)
+      pid(_pid), _name(__name)
 {
     assert(isPowerOf2(pageSize));
     pTableCache[0].vaddr = 0;
@@ -67,21 +65,20 @@
 }
 
 void
-PageTable::allocate(Addr vaddr, int64_t size, bool clobber)
+PageTable::map(Addr vaddr, Addr paddr, int64_t size, bool clobber)
 {
     // starting address must be page aligned
     assert(pageOffset(vaddr) == 0);
 
     DPRINTF(MMU, "Allocating Page: %#x-%#x\n", vaddr, vaddr+ size);
 
-    for (; size > 0; size -= pageSize, vaddr += pageSize) {
+    for (; size > 0; size -= pageSize, vaddr += pageSize, paddr += pageSize) {
         if (!clobber && (pTable.find(vaddr) != pTable.end())) {
             // already mapped
             fatal("PageTable::allocate: address 0x%x already mapped", vaddr);
         }
 
-        pTable[vaddr] = TheISA::TlbEntry(process->M5_pid, vaddr,
-                                         process->system->new_page());
+        pTable[vaddr] = TheISA::TlbEntry(pid, vaddr, paddr);
         updateCache(vaddr, pTable[vaddr]);
     }
 }
@@ -108,11 +105,11 @@
 }
 
 void
-PageTable::deallocate(Addr vaddr, int64_t size)
+PageTable::unmap(Addr vaddr, int64_t size)
 {
     assert(pageOffset(vaddr) == 0);
 
-    DPRINTF(MMU, "Deallocating page: %#x-%#x\n", vaddr, vaddr+ size);
+    DPRINTF(MMU, "Unmapping page: %#x-%#x\n", vaddr, vaddr+ size);
 
     for (; size > 0; size -= pageSize, vaddr += pageSize) {
         PTableItr iter = pTable.find(vaddr);
@@ -208,7 +205,7 @@
     PTableItr iter = pTable.begin();
     PTableItr end = pTable.end();
     while (iter != end) {
-        os << "\n[" << csprintf("%s.Entry%d", process->name(), count) << "]\n";
+        os << "\n[" << csprintf("%s.Entry%d", name(), count) << "]\n";
 
         paramOut(os, "vaddr", iter->first);
         iter->second.serialize(os);
@@ -230,9 +227,9 @@
     pTable.clear();
 
     while(i < count) {
-        paramIn(cp, csprintf("%s.Entry%d", process->name(), i), "vaddr", 
vaddr);
+        paramIn(cp, csprintf("%s.Entry%d", name(), i), "vaddr", vaddr);
         entry = new TheISA::TlbEntry();
-        entry->unserialize(cp, csprintf("%s.Entry%d", process->name(), i));
+        entry->unserialize(cp, csprintf("%s.Entry%d", name(), i));
         pTable[vaddr] = *entry;
         ++i;
     }
diff -r b0d7c64ada19 -r af28085882dc src/mem/page_table.hh
--- a/src/mem/page_table.hh     Sat Oct 22 22:30:07 2011 -0700
+++ b/src/mem/page_table.hh     Sat Oct 22 22:30:08 2011 -0700
@@ -46,8 +46,6 @@
 #include "mem/request.hh"
 #include "sim/serialize.hh"
 
-class Process;
-
 /**
  * Page Table Declaration.
  */
@@ -68,20 +66,25 @@
     const Addr pageSize;
     const Addr offsetMask;
 
-    Process *process;
+    const uint64_t pid;
+    const std::string _name;
 
   public:
 
-    PageTable(Process *_process, Addr _pageSize = TheISA::VMPageSize);
+    PageTable(const std::string &__name, uint64_t _pid,
+              Addr _pageSize = TheISA::VMPageSize);
 
     ~PageTable();
 
+    // for DPRINTF compatibility
+    const std::string name() const { return _name; }
+
     Addr pageAlign(Addr a)  { return (a & ~offsetMask); }
     Addr pageOffset(Addr a) { return (a &  offsetMask); }
 
-    void allocate(Addr vaddr, int64_t size, bool clobber = false);
+    void map(Addr vaddr, Addr paddr, int64_t size, bool clobber = false);
     void remap(Addr vaddr, int64_t size, Addr new_vaddr);
-    void deallocate(Addr vaddr, int64_t size);
+    void unmap(Addr vaddr, int64_t size);
 
     /**
      * Check if any pages in a region are already allocated
diff -r b0d7c64ada19 -r af28085882dc src/mem/translating_port.cc
--- a/src/mem/translating_port.cc       Sat Oct 22 22:30:07 2011 -0700
+++ b/src/mem/translating_port.cc       Sat Oct 22 22:30:08 2011 -0700
@@ -86,8 +86,8 @@
 
         if (!pTable->translate(gen.addr(), paddr)) {
             if (allocating == Always) {
-                pTable->allocate(roundDown(gen.addr(), VMPageSize),
-                                 VMPageSize);
+                process->allocateMem(roundDown(gen.addr(), VMPageSize),
+                                     VMPageSize);
             } else if (allocating == NextPage) {
                 // check if we've accessed the next page on the stack
                 if (!process->fixupStackFault(gen.addr()))
@@ -123,8 +123,8 @@
 
         if (!pTable->translate(gen.addr(), paddr)) {
             if (allocating == Always) {
-                pTable->allocate(roundDown(gen.addr(), VMPageSize),
-                                 VMPageSize);
+                process->allocateMem(roundDown(gen.addr(), VMPageSize),
+                                     VMPageSize);
                 pTable->translate(gen.addr(), paddr);
             } else {
                 return false;
diff -r b0d7c64ada19 -r af28085882dc src/sim/process.cc
--- a/src/sim/process.cc        Sat Oct 22 22:30:07 2011 -0700
+++ b/src/sim/process.cc        Sat Oct 22 22:30:08 2011 -0700
@@ -169,7 +169,7 @@
 
     mmap_start = mmap_end = 0;
     nxm_start = nxm_end = 0;
-    pTable = new PageTable(this);
+    pTable = new PageTable(name(), M5_pid);
     // other parameters will be initialized when the program is loaded
 }
 
@@ -328,13 +328,21 @@
     return &fd_map[tgt_fd];
 }
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to