implemented create_page_map()
This commit is contained in:
parent
14938ef7e1
commit
cdcd9e7d20
1 changed files with 29 additions and 0 deletions
|
@ -101,6 +101,35 @@ static inline size_t map_to_virt(size_t addr)
|
||||||
{
|
{
|
||||||
return canonicalize(addr << (map_to_level(addr) * PAGE_MAP_SHIFT));
|
return canonicalize(addr << (map_to_level(addr) * PAGE_MAP_SHIFT));
|
||||||
}
|
}
|
||||||
|
int create_page_map(task_t* task, int copy)
|
||||||
|
{
|
||||||
|
size_t phys;
|
||||||
|
uint32_t ret;
|
||||||
|
|
||||||
|
// fixed mapping for paging structures
|
||||||
|
page_map_t *current = (page_map_t*) PAGE_PML4;
|
||||||
|
page_map_t *new = (page_map_t*) (PAGE_PML4 - 0x1000);
|
||||||
|
|
||||||
|
// get new pml4 table
|
||||||
|
phys = get_page();
|
||||||
|
if (!phys) return -ENOMEM;
|
||||||
|
|
||||||
|
current->entries[PAGE_MAP_ENTRIES-2] = phys|KERN_TABLE;
|
||||||
|
new->entries[PAGE_MAP_ENTRIES-1] = phys|KERN_TABLE;
|
||||||
|
|
||||||
|
tlb_flush(); // ouch :(
|
||||||
|
|
||||||
|
spinlock_lock(&kslock);
|
||||||
|
ret = copy_page_map(current, new, copy);
|
||||||
|
spinlock_unlock(&kslock);
|
||||||
|
|
||||||
|
new->entries[PAGE_MAP_ENTRIES-1] = phys|KERN_TABLE;
|
||||||
|
current->entries[PAGE_MAP_ENTRIES-2] = 0;
|
||||||
|
|
||||||
|
task->page_map = (page_map_t*) phys;
|
||||||
|
|
||||||
|
kprintf("create_page_map: allocated %u page tables\n", ret);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int drop_page_map(void)
|
int drop_page_map(void)
|
||||||
|
|
Loading…
Add table
Reference in a new issue