summaryrefslogtreecommitdiffstats
path: root/src/kernel/basesegment.C
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2011-07-08 19:33:40 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2011-07-20 14:58:43 -0500
commit471f09f1a9bcc46fc385fa8aca776cb682075c0b (patch)
treee0a4969825799dcc4c28a71975cb68439f507390 /src/kernel/basesegment.C
parent3ecf7085ccc55eb4f815a62f47ea09f55bb6688e (diff)
downloadtalos-hostboot-471f09f1a9bcc46fc385fa8aca776cb682075c0b.tar.gz
talos-hostboot-471f09f1a9bcc46fc385fa8aca776cb682075c0b.zip
VMM Improvements.
- Segment Manager - Base / Device Segments - Block for Base image. Change-Id: Ic0c058e5c5b210ec1c48d30f6ed9f9837d74a3c8 Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/193 Tested-by: Jenkins Server Reviewed-by: MATTHEW S. BARTH <msbarth@us.ibm.com>
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