summaryrefslogtreecommitdiffstats
path: root/src/kernel/vmmmgr.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/vmmmgr.C')
-rw-r--r--src/kernel/vmmmgr.C28
1 files changed, 27 insertions, 1 deletions
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