summaryrefslogtreecommitdiffstats
path: root/src/kernel/pagemgr.C
diff options
context:
space:
mode:
authorStephen Cprek <smcprek@us.ibm.com>2017-06-19 16:29:24 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2017-07-20 15:54:36 -0400
commit6744879ceba92b2b2a060cff929bfaaf5d26d762 (patch)
tree6d123a4311459fc0aecf3ecd6133d2c1652eec25 /src/kernel/pagemgr.C
parent0b680113fbc55b91bc7785ef235df32df6103eda (diff)
downloadtalos-hostboot-6744879ceba92b2b2a060cff929bfaaf5d26d762.tar.gz
talos-hostboot-6744879ceba92b2b2a060cff929bfaaf5d26d762.zip
Relocate bl to hb preserved data and page table in VMM
Relocate Page Manager Page Table to 256K alignment after preserved area Simplify page manager initialize Change-Id: Ic90584437fa68843a7ebe3818d48c3fe4f5157d8 RTC: 175114 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/42154 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: Martin Gloff <mgloff@us.ibm.com> Reviewed-by: Michael Baiocchi <mbaiocch@us.ibm.com> Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/kernel/pagemgr.C')
-rw-r--r--src/kernel/pagemgr.C76
1 files changed, 35 insertions, 41 deletions
diff --git a/src/kernel/pagemgr.C b/src/kernel/pagemgr.C
index 02e8ce710..bdc8244f2 100644
--- a/src/kernel/pagemgr.C
+++ b/src/kernel/pagemgr.C
@@ -202,61 +202,55 @@ PageManager::PageManager()
void PageManager::_initialize()
{
- typedef PageManagerCore::page_t page_t;
- uint64_t totalPages = 0;
-
- page_t* startAddr = reinterpret_cast<page_t*>(firstPageAddr());
- printk("PageManager starts at %p\n", startAddr);
+ printk("Hostboot base image ends at 0x%lX...\n", firstPageAddr());
- // Populate cache lines from end of HBB to PT offset and add to heap
- uint64_t startBlock = reinterpret_cast<uint64_t>(startAddr);
- uint64_t endBlock = VmmManager::INITIAL_PT_OFFSET;
+ uint64_t totalPages = 0;
+ // Extend memory footprint to half the cache
+ // There is a preserved area after the base image and boot loader to HB
+ // communication area. The page table must be 256KB aligned, so it is
+ // likely to not be flush against the preserved area end.
+ // Example:
+ // [HBB max size][BlToHBData][8 byte aligned]
+ // [128 byte aligned Preserved-area][256K aligned Page Table]
+ uint64_t l_endPreservedArea = VmmManager::endPreservedOffset();
+ uint64_t l_endInitCache = VmmManager::INITIAL_MEM_SIZE;
+ uint64_t l_pageTableOffset = VmmManager::pageTableOffset();
+ uint64_t l_endPageTable = l_pageTableOffset + VmmManager::PTSIZE;
+
+ printk("PageManager end of preserved area at 0X%lX\n", l_endPreservedArea);
+ printk("PageManager page table offset at 0X%lX\n", l_pageTableOffset);
+
+ // Populate half the cache after the preserved area
KernelMisc::populate_cache_lines(
- reinterpret_cast<uint64_t*>(startBlock),
- reinterpret_cast<uint64_t*>(endBlock));
-
- uint64_t pages = (endBlock - startBlock) / PAGESIZE;
- iv_heap.addMemory(startBlock, pages);
- totalPages += pages;
+ reinterpret_cast<uint64_t*>(l_endPreservedArea),
+ reinterpret_cast<uint64_t*>(l_endInitCache));
- // Populate cache lines of PT
- startBlock = VmmManager::INITIAL_PT_OFFSET;
- endBlock = VmmManager::INITIAL_PT_OFFSET + VmmManager::PTSIZE;
- KernelMisc::populate_cache_lines(reinterpret_cast<uint64_t*>(startBlock),
- reinterpret_cast<uint64_t*>(endBlock));
-
- // Populate cachelines from end of Preserved read (PT + securebood data) to
- // 4MB and add to heap
- // Add on secureboot data size to end of reserved space
- size_t securebootDataSize = 0;
- if (g_BlToHbDataManager.isValid())
+ // Allocate heap memory between end of preserved area and start of page
+ // table, if necessary
+ uint64_t pages = 0;
+ if ( (l_pageTableOffset - l_endPreservedArea) > 0 )
{
- securebootDataSize = g_BlToHbDataManager.getPreservedSize();
+ pages = (l_pageTableOffset - l_endPreservedArea) / PAGESIZE;
+ iv_heap.addMemory(l_endPreservedArea, pages);
+ totalPages += pages;
}
- size_t l_endReservedPage = VmmManager::BLTOHB_DATA_START
- + securebootDataSize;
- startBlock = l_endReservedPage;
- endBlock = VmmManager::INITIAL_MEM_SIZE;
- KernelMisc::populate_cache_lines(
- reinterpret_cast<uint64_t*>(startBlock),
- reinterpret_cast<uint64_t*>(endBlock));
-
- pages = (endBlock - startBlock) / PAGESIZE;
- iv_heap.addMemory(startBlock, pages);
+ // After the Page table
+ pages = (l_endInitCache - l_endPageTable) / PAGESIZE;
+ iv_heap.addMemory(l_endPageTable, pages);
totalPages += pages;
printk("%ld pages.\n", totalPages);
- // Reserve pages for the kernel.
- iv_heapKernel.addMemory(reinterpret_cast<uint64_t>(
- iv_heap.allocatePage(KERNEL_HEAP_RESERVED_PAGES)),
- KERNEL_HEAP_RESERVED_PAGES);
-
// Statistics
iv_pagesTotal = totalPages;
iv_pagesAvail = totalPages;
cv_low_page_count = totalPages;
+ // Reserve pages for the kernel.
+ iv_heapKernel.addMemory(reinterpret_cast<uint64_t>(
+ iv_heap.allocatePage(KERNEL_HEAP_RESERVED_PAGES)),
+ KERNEL_HEAP_RESERVED_PAGES);
+
KernelMemState::setMemScratchReg(KernelMemState::MEM_CONTAINED_L3,
KernelMemState::HALF_CACHE);
}
OpenPOWER on IntegriCloud