diff options
-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 |