summaryrefslogtreecommitdiffstats
path: root/src/kernel/basesegment.C
diff options
context:
space:
mode:
authorDoug Gilbert <dgilbert@us.ibm.com>2011-08-22 17:14:23 -0500
committerDouglas R. Gilbert <dgilbert@us.ibm.com>2011-08-25 13:52:09 -0500
commitbf46e7954689c41cccc897b8b00bcc5db5245374 (patch)
treec7807ff84dd5f8519fb0b065e03ba4939255d485 /src/kernel/basesegment.C
parent968add63523933786a85ab271b277d79dc5851e6 (diff)
downloadtalos-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.C18
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);
+}
+
OpenPOWER on IntegriCloud