* Pass through physical RAM area to kernel.

* More code cleanup....

Currently working on getting the MMU code on the kernel side to function correctly, some progress already there, will follow in later commits...



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@38988 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ithamar R. Adema
2010-10-17 15:27:36 +00:00
parent 9494bb5b15
commit 2d3913afba
+24 -17
View File
@@ -285,9 +285,8 @@ init_page_directory()
TRACE(("init_page_directory2\n"));
// clear out the pgdir
for (uint32 i = 0; i < 4096; i++) {
for (uint32 i = 0; i < 4096; i++)
sPageDirectory[i] = 0;
}
uint32 *pageTable = NULL;
for (uint32 i=0; i < ARRAY_SIZE(LOADER_MEMORYMAP);i++){
@@ -543,7 +542,7 @@ mmu_free(void *virtualAddress, size_t size)
extern "C" void
mmu_init_for_kernel(void)
{
/* TRACE(("mmu_init_for_kernel\n"));
TRACE(("mmu_init_for_kernel\n"));
// save the memory we've physically allocated
gKernelArgs.physical_allocated_range[0].size
@@ -555,7 +554,7 @@ mmu_init_for_kernel(void)
gKernelArgs.virtual_allocated_range[0].size
= sNextVirtualAddress - KERNEL_BASE;
gKernelArgs.num_virtual_allocated_ranges = 1;
/*
// sort the address ranges
sort_addr_range(gKernelArgs.physical_memory_range,
gKernelArgs.num_physical_memory_ranges);
@@ -571,29 +570,37 @@ extern "C" void
mmu_init(void)
{
TRACE(("mmu_init\n"));
mmu_write_C1(mmu_read_C1() & ~((1<<29)|(1<<28)|(1<<0)));// access flag disabled, TEX remap disabled, mmu disabled
//calculate lowest RAM adress from MEMORYMAP
for(int i=0;i<ARRAY_SIZE(LOADER_MEMORYMAP);i++){
if(strcmp("RAM_free",LOADER_MEMORYMAP[i].name)==0){
sNextPhysicalAddress=LOADER_MEMORYMAP[i].start;
}
if(strcmp("RAM_pt",LOADER_MEMORYMAP[i].name)==0){
sNextPageTableAddress=LOADER_MEMORYMAP[i].start + MMU_L1_TABLE_SIZE;
kPageTableRegionEnd = LOADER_MEMORYMAP[i].end;
sPageDirectory = (uint32 *) LOADER_MEMORYMAP[i].start ;
mmu_write_C1(mmu_read_C1() & ~((1<<29)|(1<<28)|(1<<0)));// access flag disabled, TEX remap disabled, mmu disabled
uint32 highestRAMAddress = SDRAM_BASE;
//calculate lowest RAM adress from MEMORYMAP
for(int i = 0; i < ARRAY_SIZE(LOADER_MEMORYMAP); i++) {
if (strcmp("RAM_free", LOADER_MEMORYMAP[i].name) == 0)
sNextPhysicalAddress = LOADER_MEMORYMAP[i].start;
if (strcmp("RAM_pt", LOADER_MEMORYMAP[i].name) == 0) {
sNextPageTableAddress = LOADER_MEMORYMAP[i].start + MMU_L1_TABLE_SIZE;
kPageTableRegionEnd = LOADER_MEMORYMAP[i].end;
sPageDirectory = (uint32 *) LOADER_MEMORYMAP[i].start;
}
if (strncmp("RAM_", LOADER_MEMORYMAP[i].name, 4) == 0) {
if (LOADER_MEMORYMAP[i].end > highestRAMAddress)
highestRAMAddress = LOADER_MEMORYMAP[i].end;
}
}
gKernelArgs.physical_memory_range[0].start = SDRAM_BASE;
gKernelArgs.physical_memory_range[0].size = highestRAMAddress - SDRAM_BASE;
gKernelArgs.num_physical_memory_ranges = 1;
gKernelArgs.physical_allocated_range[0].start = sNextPhysicalAddress;
gKernelArgs.physical_allocated_range[0].size = 0;
gKernelArgs.num_physical_allocated_ranges = 1;
// remember the start of the allocated physical pages
init_page_directory();
// Map the page directory into kernel space at 0xffc00000-0xffffffff