diff options
author | Alexis211 <alexis211@gmail.com> | 2010-02-05 19:37:47 +0100 |
---|---|---|
committer | Alexis211 <alexis211@gmail.com> | 2010-02-05 19:37:47 +0100 |
commit | c0018a3607947922a51597df12fd2a6528af2fa2 (patch) | |
tree | 031225d03933dfe4e1f2ace1d91f5e98bcfd94d4 /src/stem/mem/paging.c | |
parent | 674014901a1e90ce1587a7709fe9bf5893b0e36e (diff) | |
download | TCE-c0018a3607947922a51597df12fd2a6528af2fa2.tar.gz TCE-c0018a3607947922a51597df12fd2a6528af2fa2.zip |
More work on tasking, paging, syscalls, stuff.
Diffstat (limited to 'src/stem/mem/paging.c')
-rw-r--r-- | src/stem/mem/paging.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/stem/mem/paging.c b/src/stem/mem/paging.c index 4cc861c..4d98e75 100644 --- a/src/stem/mem/paging.c +++ b/src/stem/mem/paging.c @@ -30,6 +30,7 @@ void paging_init(size_t totalRam) { frames.bits = kmalloc(INDEX_FROM_BIT(frames.size)); kernel_pagedir = kmalloc(sizeof(struct page_directory)); + kernel_pagedir->mappedSegs = 0; kernel_pagedir->tablesPhysical = kmalloc_page(&kernel_pagedir->physicalAddr); for (i = 0; i < 1024; i++) { kernel_pagedir->tables[i] = 0; @@ -73,6 +74,7 @@ struct page_directory *pagedir_new() { struct page_directory *pd = kmalloc(sizeof(struct page_directory)); pd->tablesPhysical = kmalloc_page(&pd->physicalAddr); + pd->mappedSegs = 0; for (i = 768; i < 1024; i++) { pd->tables[i] = kernel_pagedir->tables[i]; @@ -82,6 +84,18 @@ struct page_directory *pagedir_new() { return pd; } +void pagedir_delete(struct page_directory *pd) { + uint32_t i; + //Unmap segments + while (pd->mappedSegs != 0) seg_unmap(pd->mappedSegs); + //Cleanup page tables + for (i = 0; i < 768; i++) { + kfree_page(pd->tables[i]); + } + kfree_page(pd->tablesPhysical); + kfree(pd); +} + uint32_t paging_fault(struct registers *regs) { size_t addr; struct segment_map *seg = 0; |