summaryrefslogtreecommitdiffstats
path: root/src/kernel
diff options
context:
space:
mode:
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