diff options
author | Patrick Williams <iawillia@us.ibm.com> | 2011-08-22 11:42:20 -0500 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2011-08-24 10:55:54 -0500 |
commit | 0977c6da14b8fc1623043daa429041863498aeae (patch) | |
tree | 23b6676a21fe407340db23cd2dfd75346a88a9a6 | |
parent | fa7d388f1a121d42769ea0289e3c043fe229b4d2 (diff) | |
download | talos-hostboot-0977c6da14b8fc1623043daa429041863498aeae.tar.gz talos-hostboot-0977c6da14b8fc1623043daa429041863498aeae.zip |
Allocate zero'd page in block.
Change-Id: Ieb56aa89190d7efd56c357245b24a979ee7ad79a
Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/270
Tested-by: Jenkins Server
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
-rw-r--r-- | src/include/kernel/spte.H | 4 | ||||
-rw-r--r-- | src/kernel/block.C | 9 |
2 files changed, 12 insertions, 1 deletions
diff --git a/src/include/kernel/spte.H b/src/include/kernel/spte.H index 92a50c351..6e4832bb6 100644 --- a/src/include/kernel/spte.H +++ b/src/include/kernel/spte.H @@ -63,9 +63,11 @@ class ShadowPTE uint32_t track_write:1; /** Has page been written to. */ uint32_t dirty:1; + /** Allocate from a zero'd page. */ + uint32_t allocate_from_zero:1; /** Reserved for future use. */ - uint32_t reserved:7; + uint32_t reserved:6; } PACKED; }; diff --git a/src/kernel/block.C b/src/kernel/block.C index 9426e54ae..19d2962f8 100644 --- a/src/kernel/block.C +++ b/src/kernel/block.C @@ -22,6 +22,7 @@ // IBM_PROLOG_END #include <limits.h> #include <assert.h> +#include <string.h> #include <sys/msg.h> @@ -93,6 +94,14 @@ bool Block::handlePageFault(task_t* i_task, uint64_t i_addr) //Done(waiting for response) return true; } + else if (pte->allocate_from_zero) + { + void* l_page = PageManager::allocatePage(); + memset(l_page, '\0', PAGESIZE); + + pte->setPageAddr(reinterpret_cast<uint64_t>(l_page)); + pte->setPresent(true); + } else { return false; //TODO - Swap kernel base block pages for user pages |