diff options
author | Corey Swenson <cswenson@us.ibm.com> | 2015-07-08 12:57:22 -0500 |
---|---|---|
committer | Patrick Williams <iawillia@us.ibm.com> | 2015-12-11 15:30:29 -0600 |
commit | eb551fdd12e4ec25b302ec0f69be51720908e156 (patch) | |
tree | 1573eb484fdb22dc790d810b1ab965eb97f0dd5b /src/kernel | |
parent | 56e0928053eecfd25832306b6283521462b4e412 (diff) | |
download | talos-hostboot-eb551fdd12e4ec25b302ec0f69be51720908e156.tar.gz talos-hostboot-eb551fdd12e4ec25b302ec0f69be51720908e156.zip |
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 <dcrowell@us.ibm.com>
Reviewed-by: WILLIAM G. HOFFA <wghoffa@us.ibm.com>
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/kernel')
-rw-r--r-- | src/kernel/ptmgr.C | 2 | ||||
-rw-r--r-- | src/kernel/vmmmgr.C | 28 |
2 files changed, 28 insertions, 2 deletions
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 <kernel/basesegment.H> #include <kernel/stacksegment.H> #include <kernel/devicesegment.H> +#include <config.h> 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<VmmManager>::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<uint64_t>(g_patb) ); +} + void VmmManager::initSDR1() { // HTABORG, HTABSIZE = 0 (11 bits, 256k table) |