summaryrefslogtreecommitdiffstats
path: root/src/kernel/basesegment.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/basesegment.C')
-rw-r--r--src/kernel/basesegment.C57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/kernel/basesegment.C b/src/kernel/basesegment.C
new file mode 100644
index 000000000..70d91ac72
--- /dev/null
+++ b/src/kernel/basesegment.C
@@ -0,0 +1,57 @@
+#include <limits.h>
+#include <util/singleton.H>
+
+#include <kernel/basesegment.H>
+#include <kernel/segmentmgr.H>
+#include <kernel/block.H>
+#include <kernel/vmmmgr.H>
+
+BaseSegment::~BaseSegment()
+{
+ delete iv_block;
+}
+
+void BaseSegment::init()
+{
+ Singleton<BaseSegment>::instance()._init();
+}
+
+void BaseSegment::_init()
+{
+ // Assign segment to segment manager.
+ SegmentManager::addSegment(this, SegmentManager::BASE_SEGMENT_ID);
+
+ // Create initial static 8MB block.
+ iv_block = new Block(0x0, 0x800000);
+ iv_block->setParent(this);
+
+ // Set default page permissions on block.
+ for (uint64_t i = 0; i < 0x800000; i += PAGESIZE)
+ {
+ // External address filled in by linker as start of kernel's
+ // data pages.
+ extern void* data_load_address;
+
+ // Don't map in the 0 (NULL) page.
+ if (i == 0) continue;
+
+ // Set pages in kernel text section to be read-only / executable.
+ if (((uint64_t)&data_load_address) > i)
+ {
+ iv_block->setPhysicalPage(i, i, VmmManager::RO_EXE_ACCESS);
+ }
+ // Set all other pages to initially be read/write. VFS will set
+ // permissions on pages outside kernel.
+ // (@TODO: Future Sprint, for now keep NORMAL_ACCESS as RWX, not RW.)
+ else
+ {
+ iv_block->setPhysicalPage(i, i, VmmManager::NORMAL_ACCESS);
+ }
+ }
+}
+
+bool BaseSegment::handlePageFault(task_t* i_task, uint64_t i_addr)
+{
+ // Tail recursion to block chain.
+ return iv_block->handlePageFault(i_task, i_addr);
+}
OpenPOWER on IntegriCloud