diff options
author | Patrick Williams <iawillia@us.ibm.com> | 2011-07-08 19:33:40 -0500 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2011-07-20 14:58:43 -0500 |
commit | 471f09f1a9bcc46fc385fa8aca776cb682075c0b (patch) | |
tree | e0a4969825799dcc4c28a71975cb68439f507390 /src/kernel/basesegment.C | |
parent | 3ecf7085ccc55eb4f815a62f47ea09f55bb6688e (diff) | |
download | talos-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.C | 57 |
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); +} |