summaryrefslogtreecommitdiffstats
path: root/src/kernel/segmentmgr.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/segmentmgr.C
parent968add63523933786a85ab271b277d79dc5851e6 (diff)
downloadblackbird-hostboot-bf46e7954689c41cccc897b8b00bcc5db5245374.tar.gz
blackbird-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/segmentmgr.C')
-rw-r--r--src/kernel/segmentmgr.C26
1 files changed, 21 insertions, 5 deletions
diff --git a/src/kernel/segmentmgr.C b/src/kernel/segmentmgr.C
index 10a97f911..3f43db965 100644
--- a/src/kernel/segmentmgr.C
+++ b/src/kernel/segmentmgr.C
@@ -21,6 +21,7 @@
//
// IBM_PROLOG_END
#include <assert.h>
+#include <errno.h>
#include <arch/ppc.H>
#include <util/singleton.H>
@@ -43,13 +44,14 @@ void SegmentManager::initSLB()
Singleton<SegmentManager>::instance()._initSLB();
}
-bool SegmentManager::_handlePageFault(task_t* i_task, uint64_t i_addr)
+uint64_t SegmentManager::findPhysicalAddress(uint64_t i_vaddr)
{
- // This constant should come from page manager. Segment size.
- const size_t SLBE_s = 40;
+ return Singleton<SegmentManager>::instance()._findPhysicalAddress(i_vaddr);
+}
- // Get segment ID from effective address.
- size_t segId = i_addr >> SLBE_s;
+bool SegmentManager::_handlePageFault(task_t* i_task, uint64_t i_addr)
+{
+ size_t segId = getSegmentIdFromAddress(i_addr);
// Call contained segment object to handle page fault.
if ((segId < MAX_SEGMENTS) && (NULL != iv_segments[segId]))
@@ -96,3 +98,17 @@ void SegmentManager::_initSLB()
isync(); // Ensure slbmtes complete prior to continuing on.
}
+
+uint64_t SegmentManager::_findPhysicalAddress(uint64_t i_vaddr) const
+{
+ uint64_t paddr = -EFAULT;
+ size_t segId = getSegmentIdFromAddress(i_vaddr);
+
+ if ((segId < MAX_SEGMENTS) && (NULL != iv_segments[segId]))
+ {
+ paddr = iv_segments[segId]->findPhysicalAddress(i_vaddr);
+ }
+
+ return paddr;
+}
+
OpenPOWER on IntegriCloud