summaryrefslogtreecommitdiff
path: root/src/mem
diff options
context:
space:
mode:
authorSteve Reinhardt <steve.reinhardt@amd.com>2011-10-22 22:30:07 -0700
committerSteve Reinhardt <steve.reinhardt@amd.com>2011-10-22 22:30:07 -0700
commit4d5f2c28a88f83d390e80407f55a8a02ead33878 (patch)
tree59f8aca2bd6995a396aade765156272998fc8bbf /src/mem
parentc6dd122feef8cfb4785b8d45f40907bd6c73e04a (diff)
downloadgem5-4d5f2c28a88f83d390e80407f55a8a02ead33878.tar.xz
syscall_emul: implement MAP_FIXED option to mmap()
Diffstat (limited to 'src/mem')
-rw-r--r--src/mem/page_table.cc26
-rw-r--r--src/mem/page_table.hh10
2 files changed, 28 insertions, 8 deletions
diff --git a/src/mem/page_table.cc b/src/mem/page_table.cc
index a94d92480..745872319 100644
--- a/src/mem/page_table.cc
+++ b/src/mem/page_table.cc
@@ -67,7 +67,7 @@ PageTable::~PageTable()
}
void
-PageTable::allocate(Addr vaddr, int64_t size)
+PageTable::allocate(Addr vaddr, int64_t size, bool clobber)
{
// starting address must be page aligned
assert(pageOffset(vaddr) == 0);
@@ -75,16 +75,13 @@ PageTable::allocate(Addr vaddr, int64_t size)
DPRINTF(MMU, "Allocating Page: %#x-%#x\n", vaddr, vaddr+ size);
for (; size > 0; size -= pageSize, vaddr += pageSize) {
- PTableItr iter = pTable.find(vaddr);
-
- if (iter != pTable.end()) {
+ if (!clobber && (pTable.find(vaddr) != pTable.end())) {
// already mapped
- fatal("PageTable::allocate: address 0x%x already mapped",
- vaddr);
+ fatal("PageTable::allocate: address 0x%x already mapped", vaddr);
}
pTable[vaddr] = TheISA::TlbEntry(process->M5_pid, vaddr,
- process->system->new_page());
+ process->system->new_page());
updateCache(vaddr, pTable[vaddr]);
}
}
@@ -128,6 +125,21 @@ PageTable::deallocate(Addr vaddr, int64_t size)
}
bool
+PageTable::isUnmapped(Addr vaddr, int64_t size)
+{
+ // starting address must be page aligned
+ assert(pageOffset(vaddr) == 0);
+
+ for (; size > 0; size -= pageSize, vaddr += pageSize) {
+ if (pTable.find(vaddr) != pTable.end()) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool
PageTable::lookup(Addr vaddr, TheISA::TlbEntry &entry)
{
Addr page_addr = pageAlign(vaddr);
diff --git a/src/mem/page_table.hh b/src/mem/page_table.hh
index 61da5f322..d60f4a433 100644
--- a/src/mem/page_table.hh
+++ b/src/mem/page_table.hh
@@ -79,11 +79,19 @@ class PageTable
Addr pageAlign(Addr a) { return (a & ~offsetMask); }
Addr pageOffset(Addr a) { return (a & offsetMask); }
- void allocate(Addr vaddr, int64_t size);
+ void allocate(Addr vaddr, int64_t size, bool clobber = false);
void remap(Addr vaddr, int64_t size, Addr new_vaddr);
void deallocate(Addr vaddr, int64_t size);
/**
+ * Check if any pages in a region are already allocated
+ * @param vaddr The starting virtual address of the region.
+ * @param size The length of the region.
+ * @return True if no pages in the region are mapped.
+ */
+ bool isUnmapped(Addr vaddr, int64_t size);
+
+ /**
* Lookup function
* @param vaddr The virtual address.
* @return entry The page table entry corresponding to vaddr.