summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/include/kernel/spte.H4
-rw-r--r--src/kernel/block.C9
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
OpenPOWER on IntegriCloud