From eb551fdd12e4ec25b302ec0f69be51720908e156 Mon Sep 17 00:00:00 2001 From: Corey Swenson Date: Wed, 8 Jul 2015 12:57:22 -0500 Subject: P9 page table changes Change-Id: Ic5f234e0ce0747f887a706054f82372c9a96258c RTC:126640 Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/19041 Tested-by: Jenkins Server Reviewed-by: Daniel M. Crowell Reviewed-by: WILLIAM G. HOFFA Reviewed-by: A. Patrick Williams III --- src/kernel/ptmgr.C | 2 +- src/kernel/vmmmgr.C | 28 +++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) (limited to 'src/kernel') diff --git a/src/kernel/ptmgr.C b/src/kernel/ptmgr.C index 959e0c7dd..85dc0e13f 100644 --- a/src/kernel/ptmgr.C +++ b/src/kernel/ptmgr.C @@ -345,7 +345,7 @@ void PageTableManager::invalidatePT( void ) uint64_t num_ptes = getSize() / sizeof(PageTableEntry); for( uint64_t x = 0; x < num_ptes; x++ ) { - pte->AVA = 0xFFFFFFFFFFFF; + pte->AVA = (uint64_t)PTE_AVA_MASK; pte->V = 0; pte++; } diff --git a/src/kernel/vmmmgr.C b/src/kernel/vmmmgr.C index 48675c398..8a55f56c7 100644 --- a/src/kernel/vmmmgr.C +++ b/src/kernel/vmmmgr.C @@ -32,9 +32,11 @@ #include #include #include +#include extern void* data_load_address; +uint64_t VmmManager::g_patb[2]; VmmManager::VmmManager() : lock() { @@ -56,8 +58,12 @@ void VmmManager::init() SegmentManager::initSLB(); v.initPTEs(); - v.initSDR1(); +#ifdef CONFIG_P9_PAGE_TABLE + v.initPartitionTable(); +#else + v.initSDR1(); +#endif }; void VmmManager::init_slb() @@ -65,7 +71,11 @@ void VmmManager::init_slb() VmmManager& v = Singleton::instance(); SegmentManager::initSLB(); +#ifdef CONFIG_P9_PAGE_TABLE + v.initPartitionTable(); +#else v.initSDR1(); +#endif } bool VmmManager::pteMiss(task_t* t, uint64_t effAddr, bool store) @@ -109,6 +119,22 @@ void VmmManager::initPTEs() // handler will add as-needed. } +void VmmManager::initPartitionTable() +{ + // Use SLB, not In-Memory Segment Tables (Process Table) + // Set LPCR[41] (UPRT) = 0 + setLPCR(getLPCR() & (~0x0000000000400000)); + + // Set the first partition table entry (PATE) + // HTABORG, HTABSIZE = 0 (11 bits, 256k table) + g_patb[0] = HTABORG(); + g_patb[1] = 0x0; + + // Init the PTCR reg + // PATB, PATS = 0 (4k table) + setPTCR( reinterpret_cast(g_patb) ); +} + void VmmManager::initSDR1() { // HTABORG, HTABSIZE = 0 (11 bits, 256k table) -- cgit v1.2.1