Remap lapic and ioapic to the kernel space + some cosmetic changes

This commit is contained in:
Stefan Lankes 2011-02-21 08:36:06 +01:00
parent 09a2ea194a
commit 31ad08b7ae
3 changed files with 25 additions and 30 deletions

View file

@ -249,9 +249,12 @@ int apic_calibration(void)
if (!has_apic())
return -ENXIO;
map_region(per_core(current_task), lapic, lapic, 1, MAP_KERNEL_SPACE|MAP_NO_CACHE);
lapic = map_region(per_core(current_task), 0 /*lapic*/, lapic, 1, MAP_KERNEL_SPACE|MAP_NO_CACHE);
if (BUILTIN_EXPECT(!lapic, 0))
return -ENXIO;
if (ioapic)
map_region(per_core(current_task), (size_t)ioapic, (size_t)ioapic, 1, MAP_KERNEL_SPACE|MAP_NO_CACHE);
ioapic = map_region(per_core(current_task), 0 /*(size_t)ioapic*/, (size_t)ioapic, 1, MAP_KERNEL_SPACE|MAP_NO_CACHE);
old = get_clock_tick();
@ -288,10 +291,13 @@ int apic_calibration(void)
if (!has_apic())
return -ENXIO;
map_region(per_core(current_task), lapic, lapic, 1, MAP_KERNEL_SPACE|MAP_NO_CACHE);
if (ioapic)
map_region(per_core(current_task), (size_t)ioapic, (size_t)ioapic, 1, MAP_KERNEL_SPACE|MAP_NO_CACHE);
lapic = map_region(per_core(current_task), 0 /*lapic*/, lapic, 1, MAP_KERNEL_SPACE|MAP_NO_CACHE);
if (BUILTIN_EXPECT(!lapic, 0))
return -ENXIO;
if (ioapic)
ioapic = map_region(per_core(current_task), 0 /*(size_t)ioapic*/, (size_t)ioapic, 1, MAP_KERNEL_SPACE|MAP_NO_CACHE);
lapic_write(APIC_DCR, 0xB); // set it to 1 clock increments
lapic_write(APIC_LVT_T, 0x2007B); // connects the timer to 123 and enables it
lapic_write(APIC_ICR, 0xFFFFFFFF);

View file

@ -23,6 +23,7 @@
#include <metalsvm/errno.h>
#include <asm/gdt.h>
#include <asm/tss.h>
#include <asm/page.h>
gdt_ptr_t gp;
static tss_t task_state_segments[MAX_TASKS] __attribute__ ((aligned (4096)));

View file

@ -84,7 +84,7 @@ int get_user_pgd(task_t* task)
pgd = kmalloc(sizeof(page_dir_t));
if (!pgd)
return -ENOMEM;
//memcpy(pgd, &boot_pgd, sizeof(page_dir_t));
memset(pgd, 0, sizeof(page_dir_t));
// create a new "page table container" for the new task
pgt = kmalloc(sizeof(page_table_t));
@ -94,21 +94,12 @@ int get_user_pgd(task_t* task)
}
memset(pgt, 0, sizeof(page_table_t));
for(i=0; i<1024 /*KERNEL_SPACE/(1024*4096)*/; i++) {
for(i=0; i<KERNEL_SPACE/(1024*PAGE_SIZE); i++) {
pgd->entries[i] = boot_pgd.entries[i];
if (pgd->entries[i]) {
kprintf("pgd->entries[%d] = %p\n", i, pgd->entries[i]);
if (pgd->entries[i])
pgt->entries[i] = pgt_container->entries[i];
kprintf("pgt->entries[%d] = %p\n", i, pgt->entries[i]);
}
}
//for(i=0/*1024-KERNEL_SPACE/(1024*4096)*/; i<1024; i++) {
// pgt->entries[i] = pgt_container->entries[i];
// if (pgt->entries[i])
// kprintf("pgt->entries[%d] = %p\n", i, pgt->entries[i]);
//}
// map page table container at the end of the kernel space
viraddr = (KERNEL_SPACE - PAGE_SIZE) & 0xFFFFF000;
index1 = viraddr >> 22;
@ -118,9 +109,6 @@ int get_user_pgd(task_t* task)
pgd->entries[index1] = ((size_t) virt_to_phys(per_core(current_task), (size_t) pgt) & 0xFFFFF000)|KERN_TABLE;
pgt->entries[index2] = ((size_t) virt_to_phys(per_core(current_task), (size_t) pgt) & 0xFFFFF000)|KERN_PAGE;
kprintf("AAA pgd->entries[%d] = %p\n", index1, pgd->entries[index1]);
kprintf("AAA pgt->entries[%d] = %p\n", index2, pgt->entries[index2]);
task->pgd = pgd;
task->pgd_lock = &boot_pgd_lock;
@ -149,11 +137,11 @@ size_t virt_to_phys(task_t* task, size_t viraddr)
if (!pgt || !(pgt->entries[index2]))
goto out;
ret = pgt->entries[index2] & 0xFFFFF000; // determine page frame
ret = pgt->entries[index2] & 0xFFFFF000; // determine page frame
ret = ret | (viraddr & 0xFFF); // add page offset
out:
//kprintf("vir %p to phy %p\n", viraddr, ret);
return ret;
}
@ -208,8 +196,8 @@ size_t map_region(task_t* task, size_t viraddr, size_t phyaddr, uint32_t npages,
if (BUILTIN_EXPECT(!pgt_container, 0)) {
spinlock_unlock(task->pgd_lock);
kputs("map_address: internal error\n");
return 0;
kputs("map_address: internal error\n");
return 0;
}
// map the new table into the address space of the kernel space
@ -255,7 +243,7 @@ size_t map_region(task_t* task, size_t viraddr, size_t phyaddr, uint32_t npages,
size_t vm_alloc(task_t* task, uint32_t npages, uint32_t flags)
{
uint32_t index1, index2, j;
size_t viraddr, i;
size_t viraddr, i;
size_t start, end;
page_table_t* pgt;
@ -277,7 +265,7 @@ size_t vm_alloc(task_t* task, uint32_t npages, uint32_t flags)
j = 0;
do {
index1 = i >> 22;
index2 = (i >> 12) & 0x3FF;
index2 = (i >> 12) & 0x3FF;
pgt = (page_table_t*) ((KERNEL_SPACE - 1024*PAGE_SIZE + index1*PAGE_SIZE) & 0xFFFFF000);
if (!pgt || !(pgt->entries[index2])) {
@ -309,7 +297,7 @@ int vm_free(task_t* task, size_t viraddr, uint32_t npages)
for(i=0; i<npages; i++, viraddr+=PAGE_SIZE)
{
index1 = viraddr >> 22;
index2 = (viraddr >> 12) & 0x3FF;
index2 = (viraddr >> 12) & 0x3FF;
pgt = (page_table_t*) ((KERNEL_SPACE - 1024*PAGE_SIZE + index1*PAGE_SIZE) & 0xFFFFF000);
if (!pgt)
@ -338,7 +326,7 @@ int print_paging_tree(size_t viraddr)
if (pgd) {
kprintf("0x%0x\n", pgd->entries[index1]);
pgt = (page_table_t*) (pgd->entries[index1] & 0xFFFFF000);
} else
} else
kputs("invalid page directory\n");
/* convert physical address to virtual */
@ -380,7 +368,7 @@ int arch_paging_init(void)
return -ENOMEM;
}
memset(pgt, 0, PAGE_SIZE);
// map this table at the end of the kernel space
viraddr = KERNEL_SPACE - PAGE_SIZE;
index1 = viraddr >> 22;