[mem] Enable direct mappings for memory, video now works with paging
This commit is contained in:
parent
a9365528b3
commit
1ce1ab9aaf
@ -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));
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user