[mem] Enable direct mappings for memory, video now works with paging

This commit is contained in:
Kevin Lange 2011-03-29 14:43:39 -05:00
parent a9365528b3
commit 1ce1ab9aaf
3 changed files with 36 additions and 6 deletions

View File

@ -168,6 +168,20 @@ alloc_frame(
}
}
void
dma_frame(
page_t *page,
int is_kernel,
int is_writeable,
uintptr_t address
) {
/* Page this address directly */
page->present = 1;
page->rw = (is_writeable) ? 1 : 0;
page->rw = (is_kernel) ? 0 : 1;
page->frame = address / 0x1000;
}
void
free_frame(
page_t *page
@ -196,9 +210,6 @@ paging_install(uint32_t memsize) {
alloc_frame(get_page(i, 1, kernel_directory), 0, 0);
i += 0x1000;
}
for (i = 0; i < 0xFFFFFF; i += 0x1000) {
alloc_frame(get_page(0xE0000000 + i, 1, kernel_directory), 0, 0);
}
isrs_install_handler(14, page_fault);
kernel_directory->physical_address = (uintptr_t)kernel_directory->physical_tables;
@ -212,7 +223,7 @@ switch_page_directory(
page_directory_t * dir
) {
current_directory = dir;
return;
//return;
__asm__ __volatile__ ("mov %0, %%cr3":: "r"(dir->physical_address));
uint32_t cr0;
__asm__ __volatile__ ("mov %%cr0, %0": "=r"(cr0));

View File

@ -60,20 +60,38 @@ graphics_install_bochs() {
uint32_t * herp = (uint32_t *)0xA0000;
herp[0] = 0xA5ADFACE;
/* Enable the higher memory */
for (uintptr_t i = 0xE0000000; i <= 0xE0FF0000; i += 0x1000) {
dma_frame(get_page(i, 1, kernel_directory), 1, 1, i);
}
for (uintptr_t i = 0xF0000000; i <= 0xF0FF0000; i += 0x1000) {
dma_frame(get_page(i, 1, kernel_directory), 1, 1, i);
}
uint16_t lfb_addr = pci_get_lfb_addr(0x1234);
if (lfb_addr) {
BOCHS_VID_MEMORY = (uint32_t *)((uint32_t)lfb_addr << 16);
} else {
/* Go find it */
for (uintptr_t x = 0xE0000000; x < 0xFFFFF000; x += 0x1000) {
for (uintptr_t x = 0xE0000000; x < 0xE0FF0000; x += 0x1000) {
if (((uintptr_t *)x)[0] == 0xA5ADFACE) {
BOCHS_VID_MEMORY = (uint32_t *)x;
break;
goto mem_found;
}
}
for (uintptr_t x = 0xF0000000; x < 0xF0FF0000; x += 0x1000) {
if (((uintptr_t *)x)[0] == 0xA5ADFACE) {
BOCHS_VID_MEMORY = (uint32_t *)x;
goto mem_found;
}
}
}
mem_found:
kprintf("[bochs] Video memory paged and located.\n");
bochs_resolution_x = PREFERRED_X;
bochs_resolution_y = PREFERRED_Y;
bochs_resolution_b = PREFERRED_B;

View File

@ -140,6 +140,7 @@ extern void paging_install(uint32_t memsize);
extern void switch_page_directory(page_directory_t * new);
extern page_t *get_page(uintptr_t address, int make, page_directory_t * dir);
extern void page_fault(struct regs *r);
extern void dma_frame(page_t * page, int, int, uintptr_t);
void heap_install();