summaryrefslogtreecommitdiffstats
path: root/src/kernel
diff options
context:
space:
mode:
authorCorey Swenson <cswenson@us.ibm.com>2015-07-08 12:57:22 -0500
committerPatrick Williams <iawillia@us.ibm.com>2015-12-11 15:30:29 -0600
commiteb551fdd12e4ec25b302ec0f69be51720908e156 (patch)
tree1573eb484fdb22dc790d810b1ab965eb97f0dd5b /src/kernel
parent56e0928053eecfd25832306b6283521462b4e412 (diff)
downloadtalos-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.C2
-rw-r--r--src/kernel/vmmmgr.C28
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)
OpenPOWER on IntegriCloud