diff options
author | Doug Gilbert <dgilbert@us.ibm.com> | 2011-08-22 17:14:23 -0500 |
---|---|---|
committer | Douglas R. Gilbert <dgilbert@us.ibm.com> | 2011-08-25 13:52:09 -0500 |
commit | bf46e7954689c41cccc897b8b00bcc5db5245374 (patch) | |
tree | c7807ff84dd5f8519fb0b065e03ba4939255d485 /src/kernel/basesegment.C | |
parent | 968add63523933786a85ab271b277d79dc5851e6 (diff) | |
download | talos-hostboot-bf46e7954689c41cccc897b8b00bcc5db5245374.tar.gz talos-hostboot-bf46e7954689c41cccc897b8b00bcc5db5245374.zip |
map virtual address to physical address in kernel
Change-Id: Id18e604facd517598a18968af3dff927026ad894
Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/272
Tested-by: Jenkins Server
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/kernel/basesegment.C')
-rw-r--r-- | src/kernel/basesegment.C | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/kernel/basesegment.C b/src/kernel/basesegment.C index 85b3d384a..2dc99d458 100644 --- a/src/kernel/basesegment.C +++ b/src/kernel/basesegment.C @@ -21,6 +21,7 @@ // // IBM_PROLOG_END #include <limits.h> +#include <errno.h> #include <util/singleton.H> #include <kernel/basesegment.H> @@ -48,23 +49,25 @@ void BaseSegment::_init() SegmentManager::addSegment(this, SegmentManager::BASE_SEGMENT_ID); // Create initial static 3 or 8MB block. - uint64_t iv_baseBlockSize = 0; switch (CpuID::getCpuType()) { case CORE_POWER7: case CORE_POWER7_PLUS: case CORE_POWER8_VENICE: - iv_baseBlockSize = VmmManager::EIGHT_MEG; + iv_physMemSize = VmmManager::EIGHT_MEG; break; case CORE_POWER8_SALERNO: default: - iv_baseBlockSize = VmmManager::FOUR_MEG; + iv_physMemSize = VmmManager::FOUR_MEG; break; } - iv_block = new Block(0x0, iv_baseBlockSize); + // Base block is L3 cache physical memory size + iv_block = new Block(0x0, iv_physMemSize); iv_block->setParent(this); + // TODO iv_physMemSize needs to be recalculated when DIMM memory is avail. + // Set default page permissions on block. for (uint64_t i = 0; i < 0x800000; i += PAGESIZE) { @@ -126,3 +129,10 @@ int BaseSegment::_mmAllocBlock(MessageQueue* i_mq,void* i_va,uint64_t i_size) iv_block->appendBlock(l_block); return 0; } + +uint64_t BaseSegment::findPhysicalAddress(uint64_t i_vaddr) const +{ + if(i_vaddr < iv_physMemSize) return i_vaddr; + return (iv_block ? iv_block->findPhysicalAddress(i_vaddr) : -EFAULT); +} + |