summaryrefslogtreecommitdiffstats
path: root/src/kernel
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2010-07-02 13:25:57 -0500
committerPatrick Williams <iawillia@us.ibm.com>2010-07-02 13:25:57 -0500
commit0a157437c294f2f3a244e0125e673b3791529052 (patch)
tree8bc431bc78fd38258c0047feeb7503e47423e802 /src/kernel
parent419ee15eddec34322a9d44a7b9099494fb2ff0c7 (diff)
downloadtalos-hostboot-0a157437c294f2f3a244e0125e673b3791529052.tar.gz
talos-hostboot-0a157437c294f2f3a244e0125e673b3791529052.zip
Start virtual memory management.
Diffstat (limited to 'src/kernel')
-rw-r--r--src/kernel/kernel.C2
-rw-r--r--src/kernel/makefile2
-rw-r--r--src/kernel/vmmmgr.C65
3 files changed, 68 insertions, 1 deletions
diff --git a/src/kernel/kernel.C b/src/kernel/kernel.C
index b071d9999..00f3002e5 100644
--- a/src/kernel/kernel.C
+++ b/src/kernel/kernel.C
@@ -8,6 +8,7 @@
#include <kernel/task.H>
#include <kernel/scheduler.H>
#include <kernel/taskmgr.H>
+#include <kernel/vmmmgr.H>
#include <stdlib.h>
@@ -59,6 +60,7 @@ void Kernel::memBootstrap()
{
PageManager::init();
HeapManager::init();
+ VmmManager::init();
}
void Kernel::cpuBootstrap()
diff --git a/src/kernel/makefile b/src/kernel/makefile
index 4bdc0d02d..7d33a056e 100644
--- a/src/kernel/makefile
+++ b/src/kernel/makefile
@@ -2,7 +2,7 @@ OBJDIR = ../../obj
include ../../config.mk
OBJS = start.o kernel.o console.o pagemgr.o heapmgr.o taskmgr.o cpumgr.o
-OBJS += syscall.o scheduler.o spinlock.o exception.o
+OBJS += syscall.o scheduler.o spinlock.o exception.o vmmmgr.o
OBJECTS = $(addprefix ${OBJDIR}/, ${OBJS})
all: ${OBJECTS}
diff --git a/src/kernel/vmmmgr.C b/src/kernel/vmmmgr.C
new file mode 100644
index 000000000..db19d36a3
--- /dev/null
+++ b/src/kernel/vmmmgr.C
@@ -0,0 +1,65 @@
+#include <util/singleton.H>
+#include <kernel/vmmmgr.H>
+#include <kernel/console.H>
+
+VmmManager::VmmManager()
+{
+}
+
+void VmmManager::init()
+{
+ printk("Starting VMM...");
+
+ VmmManager& v = Singleton<VmmManager>::instance();
+
+ //v.initSLB();
+ v.initPTEs();
+ v.initSDR1();
+
+ printk("done.\n");
+};
+
+void VmmManager::initSLB()
+{
+ register uint64_t slbRS, slbRB;
+
+ // ESID = 0, V = 1, Index = 0.
+ slbRB = 0x0000000008000000;
+
+ // B = 01 (1TB), VSID = 0, Ks = 0, Kp = 1, NLCLP = 0
+ slbRS = 0x4000000000000400;
+
+ asm volatile("slbmte %0, %1" :: "r"(slbRS), "r"(slbRB) : "memory");
+}
+
+void VmmManager::initPTEs()
+{
+ // Invalidate all.
+ for(int i = 0; i < PTEG_COUNT; i++)
+ for (int j = 0; j < PTEG_SIZE; j++)
+ setValid(false, getPte(i,j));
+
+ // Set up linear map.
+ for(int i = 0; i < (FULL_MEM_SIZE / PAGESIZE); i++)
+ {
+ pte_t& pte = getPte(i, 0);
+ defaultPte(pte);
+ setTid(LinearSpace, pte);
+ setAccess( (0 == i) ? NO_USER_ACCESS : NORMAL_ACCESS, pte);
+ setPage(i, pte);
+ setValid(true, pte);
+ }
+
+ // PTE sync.
+ pteSync();
+}
+
+void VmmManager::initSDR1()
+{
+ // HTABORG << 17, HTABSIZE = 0 (11 bits, 256k table)
+ register uint64_t sdr1 = (((uint64_t)HTABORG) << 17);
+ asm volatile("mtsdr1 %0" :: "r"(sdr1) : "memory");
+}
+
+
+VmmManager::pte_t* VmmManager::page_table = (VmmManager::pte_t*) HTABORG;
OpenPOWER on IntegriCloud