Mark kernel page table entries as global

This commit is contained in:
Thomas Lovén 2022-01-14 21:38:22 +01:00
parent 7d9a744cf2
commit 0272605d36
5 changed files with 9 additions and 8 deletions

View File

@ -10,20 +10,20 @@ BootP4:
.rept ENTRIES_PER_PT - 2
.quad 0
.endr
.quad offset V2P(BootP3) + (PAGE_PRESENT | PAGE_WRITE)
.quad offset V2P(BootP3) + (PAGE_GLOBAL | PAGE_PRESENT | PAGE_WRITE)
BootP3:
.quad offset V2P(BootP2) + (PAGE_PRESENT | PAGE_WRITE)
.quad offset V2P(BootP2) + (PAGE_GLOBAL | PAGE_PRESENT | PAGE_WRITE)
.rept ENTRIES_PER_PT - 1
.quad 0
.endr
BootP2:
.quad offset V2P(BootP1) + (PAGE_PRESENT | PAGE_WRITE)
.quad offset V2P(BootP1) + (PAGE_GLOBAL | PAGE_PRESENT | PAGE_WRITE)
.rept ENTRIES_PER_PT - 1
.quad 0
.endr
BootP1:
.set i, 0
.rept ENTRIES_PER_PT
.quad (i << 12) + (PAGE_PRESENT | PAGE_WRITE)
.quad (i << 12) + (PAGE_GLOBAL | PAGE_PRESENT | PAGE_WRITE)
.set i, (i+1)
.endr

View File

@ -38,7 +38,7 @@ void fbterm_init(struct fbinfo *fbinfo)
for(uintptr_t p = (uintptr_t)kernel_fb.addr; p < ((uintptr_t)kernel_fb.addr + kernel_fb.size); p += PAGE_SIZE)
{
vmm_set_page(kernel_P4, p, V2P(p), PAGE_WRITE | PAGE_PRESENT);
vmm_set_page(kernel_P4, p, V2P(p), PAGE_GLOBAL | PAGE_WRITE | PAGE_PRESENT);
}
draw_rect(&kernel_fb, 20, 20, 8*VGA_COLS+8, 16*VGA_ROWS+8, RGB(255, 0, 0));

View File

@ -6,6 +6,7 @@
#define PAGE_PRESENT 0x001
#define PAGE_WRITE 0x002
#define PAGE_GLOBAL 0x100
#define PAGE_SIZE 0x1000
#define ENTRIES_PER_PT 512

View File

@ -9,7 +9,7 @@ long k_brk(long brk, long, long, long, long, long)
if(brk)
{
while(_brk < brk) {
vmm_set_page(kernel_P4, _brk, pmm_alloc(), PAGE_WRITE | PAGE_PRESENT);
vmm_set_page(kernel_P4, _brk, pmm_alloc(), PAGE_GLOBAL | PAGE_WRITE | PAGE_PRESENT);
_brk += PAGE_SIZE;
}
return _brk;
@ -29,7 +29,7 @@ long k_mmap(long addr, long length, long prot, long flags, long fd, long offset)
long retval = _mmap;
while(length > 0)
{
vmm_set_page(kernel_P4, _mmap, pmm_alloc(), PAGE_WRITE | PAGE_PRESENT);
vmm_set_page(kernel_P4, _mmap, pmm_alloc(), PAGE_GLOBAL | PAGE_WRITE | PAGE_PRESENT);
_mmap += PAGE_SIZE;
length -= PAGE_SIZE;
}

View File

@ -20,7 +20,7 @@ void memory_init()
uint64_t page = vmm_get_page(kernel_P4, vaddr);
if(page == (uint64_t)-1 || !(page & PAGE_PRESENT))
{
uint16_t flags = PAGE_WRITE | PAGE_PRESENT;
uint16_t flags = PAGE_GLOBAL | PAGE_WRITE | PAGE_PRESENT;
vmm_set_page(kernel_P4, vaddr, p, flags);
}