Files
Espresso/lib/mm/paging.c

61 lines
1.3 KiB
C
Raw Normal View History

2025-10-20 21:57:30 -05:00
#include <mm/pmm.h>
2025-05-28 14:41:02 -05:00
#include <string.h>
2025-10-20 21:57:30 -05:00
#include <mm_macros.h>
2025-05-28 14:41:02 -05:00
#include <stdio.h>
#include <mm/paging.h>
2025-10-20 21:57:30 -05:00
#define PAGE_PRESENT 0x1
#define PAGE_WRITE 0x2
#define PAGE_SIZE 4096
2025-05-28 14:41:02 -05:00
2025-10-20 21:57:30 -05:00
static uint32_t* page_directory;
2025-05-28 14:41:02 -05:00
2025-10-20 21:57:30 -05:00
void map_page(void* phys_addr, void* virt_addr)
2025-05-28 14:41:02 -05:00
{
2025-10-20 21:57:30 -05:00
uint32_t pd_idx = ((uint32_t)virt_addr >> 22) & 0x3FF;
uint32_t pt_idx = ((uint32_t)virt_addr >> 12) & 0x3FF;
2025-05-28 14:41:02 -05:00
2025-10-20 21:57:30 -05:00
uint32_t* page_table;
if (!(page_directory[pd_idx] & PAGE_PRESENT))
2025-05-28 14:41:02 -05:00
{
2025-10-20 21:57:30 -05:00
page_table = (uint32_t*) pmm_alloc_page();
MEMSET(page_table, 0, PAGE_SIZE);
page_directory[pd_idx] = ((uint32_t)page_table) | PAGE_PRESENT | PAGE_WRITE;
2025-05-28 14:41:02 -05:00
}
2025-10-20 21:57:30 -05:00
else
2025-05-28 14:41:02 -05:00
{
2025-10-20 21:57:30 -05:00
page_table = (uint32_t*)(page_directory[pd_idx] & ~0xFFF);
2025-05-28 14:41:02 -05:00
}
2025-10-20 21:57:30 -05:00
page_table[pt_idx] = ((uint32_t)phys_addr) | PAGE_PRESENT | PAGE_WRITE;
2025-05-28 14:41:02 -05:00
}
2025-10-20 21:57:30 -05:00
void paging_init(void)
2025-05-28 14:41:02 -05:00
{
2025-10-20 21:57:30 -05:00
#ifdef _DEBUG
printf("[ PAGING ] Initializing paging...\n");
#endif
page_directory = (uint32_t*)pmm_alloc_page();
MEMSET(page_directory, 0, PAGE_SIZE);
2025-05-28 14:41:02 -05:00
2025-10-20 21:57:30 -05:00
for (uint32_t addr = 0; addr < 0x800000; addr += PAGE_SIZE)
2025-05-28 14:41:02 -05:00
{
2025-10-20 21:57:30 -05:00
map_page((void*) addr, (void*) addr); /* identity map first 8MB */
2025-05-28 14:41:02 -05:00
}
2025-10-20 21:57:30 -05:00
asm volatile("mov %0, %%cr3" :: "r"(page_directory));
uint32_t cr0;
asm volatile("mov %%cr0, %0" : "=r"(cr0));
cr0 |= 0x80000000;
asm volatile("mov %0, %%cr0" :: "r"(cr0));
#ifdef _DEBUG
printf("[ PAGING ] Paging initialized\n");
#endif
2025-05-28 14:41:02 -05:00
}
2025-06-13 18:03:39 -05:00