diff options
author | Patrick Williams <iawillia@us.ibm.com> | 2010-07-02 13:25:57 -0500 |
---|---|---|
committer | Patrick Williams <iawillia@us.ibm.com> | 2010-07-02 13:25:57 -0500 |
commit | 0a157437c294f2f3a244e0125e673b3791529052 (patch) | |
tree | 8bc431bc78fd38258c0047feeb7503e47423e802 /src/kernel | |
parent | 419ee15eddec34322a9d44a7b9099494fb2ff0c7 (diff) | |
download | talos-hostboot-0a157437c294f2f3a244e0125e673b3791529052.tar.gz talos-hostboot-0a157437c294f2f3a244e0125e673b3791529052.zip |
Start virtual memory management.
Diffstat (limited to 'src/kernel')
-rw-r--r-- | src/kernel/kernel.C | 2 | ||||
-rw-r--r-- | src/kernel/makefile | 2 | ||||
-rw-r--r-- | src/kernel/vmmmgr.C | 65 |
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; |