summaryrefslogtreecommitdiffstats
path: root/src/kernel/basesegment.C
diff options
context:
space:
mode:
authorMatthew Barth <msbarth@us.ibm.com>2011-08-12 10:54:52 -0500
committerMATTHEW S. BARTH <msbarth@us.ibm.com>2011-08-15 16:14:21 -0500
commit5b4ea4d127be9898ae1aada5df6b06e67ec47086 (patch)
tree2df7dd4825b8208492a536174f6f6bb4dc86d997 /src/kernel/basesegment.C
parentfa0113e4599fcca0c2d4c938c88d445d288a952a (diff)
downloadtalos-hostboot-5b4ea4d127be9898ae1aada5df6b06e67ec47086.tar.gz
talos-hostboot-5b4ea4d127be9898ae1aada5df6b06e67ec47086.zip
Support msgq and paging data for blocks in base segment
Change-Id: I4f1775b6a843140be97f3c328155aa1654086723 Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/254 Tested-by: Jenkins Server Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/kernel/basesegment.C')
-rw-r--r--src/kernel/basesegment.C25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/kernel/basesegment.C b/src/kernel/basesegment.C
index d9f5a12e8..35e6375a2 100644
--- a/src/kernel/basesegment.C
+++ b/src/kernel/basesegment.C
@@ -6,6 +6,8 @@
#include <kernel/block.H>
#include <kernel/vmmmgr.H>
#include <kernel/cpuid.H>
+//#include <kernel/console.H>
+#define SLBE_s 40
BaseSegment::~BaseSegment()
{
@@ -72,9 +74,32 @@ bool BaseSegment::handlePageFault(task_t* i_task, uint64_t i_addr)
}
/**
+ * STATIC
* Allocates a block of virtual memory of the given size
*/
int BaseSegment::mmAllocBlock(MessageQueue* i_mq,void* i_va,uint64_t i_size)
{
+ return Singleton<BaseSegment>::instance()._mmAllocBlock(i_mq,i_va,i_size);
+}
+
+/**
+ * Allocates a block of virtual memory of the given size
+ */
+int BaseSegment::_mmAllocBlock(MessageQueue* i_mq,void* i_va,uint64_t i_size)
+{
+ uint64_t l_vaddr = reinterpret_cast<uint64_t>(i_va);
+ uint64_t l_blockSizeTotal = 0;//iv_block->iv_size;
+ iv_block->totalBlocksAlloc(l_blockSizeTotal);
+ //Verify input address and size falls within this segment's address range
+ if ((l_vaddr < this->getBaseAddress() ||
+ l_vaddr >= (this->getBaseAddress() + (1ull << SLBE_s))) &&
+ (l_blockSizeTotal+i_size <= (1ull << SLBE_s)))
+ {
+ return -1;
+ }
+ //TODO - Align i_size to page size
+ Block* l_block = new Block(l_vaddr, i_size, i_mq);
+ l_block->setParent(this);
+ iv_block->appendBlock(l_block);
return 0;
}
OpenPOWER on IntegriCloud