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/segmentmgr.C | |
| parent | 968add63523933786a85ab271b277d79dc5851e6 (diff) | |
| download | blackbird-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.C | 26 |
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; +} + |

