diff options
author | Stephen Cprek <smcprek@us.ibm.com> | 2017-06-19 16:29:24 -0500 |
---|---|---|
committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2017-07-20 15:54:36 -0400 |
commit | 6744879ceba92b2b2a060cff929bfaaf5d26d762 (patch) | |
tree | 6d123a4311459fc0aecf3ecd6133d2c1652eec25 /src/kernel/pagemgr.C | |
parent | 0b680113fbc55b91bc7785ef235df32df6103eda (diff) | |
download | talos-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.C | 76 |
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); } |