Mark kernel page table entries as global
This commit is contained in:
parent
7d9a744cf2
commit
0272605d36
@ -10,20 +10,20 @@ BootP4:
|
|||||||
.rept ENTRIES_PER_PT - 2
|
.rept ENTRIES_PER_PT - 2
|
||||||
.quad 0
|
.quad 0
|
||||||
.endr
|
.endr
|
||||||
.quad offset V2P(BootP3) + (PAGE_PRESENT | PAGE_WRITE)
|
.quad offset V2P(BootP3) + (PAGE_GLOBAL | PAGE_PRESENT | PAGE_WRITE)
|
||||||
BootP3:
|
BootP3:
|
||||||
.quad offset V2P(BootP2) + (PAGE_PRESENT | PAGE_WRITE)
|
.quad offset V2P(BootP2) + (PAGE_GLOBAL | PAGE_PRESENT | PAGE_WRITE)
|
||||||
.rept ENTRIES_PER_PT - 1
|
.rept ENTRIES_PER_PT - 1
|
||||||
.quad 0
|
.quad 0
|
||||||
.endr
|
.endr
|
||||||
BootP2:
|
BootP2:
|
||||||
.quad offset V2P(BootP1) + (PAGE_PRESENT | PAGE_WRITE)
|
.quad offset V2P(BootP1) + (PAGE_GLOBAL | PAGE_PRESENT | PAGE_WRITE)
|
||||||
.rept ENTRIES_PER_PT - 1
|
.rept ENTRIES_PER_PT - 1
|
||||||
.quad 0
|
.quad 0
|
||||||
.endr
|
.endr
|
||||||
BootP1:
|
BootP1:
|
||||||
.set i, 0
|
.set i, 0
|
||||||
.rept ENTRIES_PER_PT
|
.rept ENTRIES_PER_PT
|
||||||
.quad (i << 12) + (PAGE_PRESENT | PAGE_WRITE)
|
.quad (i << 12) + (PAGE_GLOBAL | PAGE_PRESENT | PAGE_WRITE)
|
||||||
.set i, (i+1)
|
.set i, (i+1)
|
||||||
.endr
|
.endr
|
@ -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)
|
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));
|
draw_rect(&kernel_fb, 20, 20, 8*VGA_COLS+8, 16*VGA_ROWS+8, RGB(255, 0, 0));
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
#define PAGE_PRESENT 0x001
|
#define PAGE_PRESENT 0x001
|
||||||
#define PAGE_WRITE 0x002
|
#define PAGE_WRITE 0x002
|
||||||
|
#define PAGE_GLOBAL 0x100
|
||||||
|
|
||||||
#define PAGE_SIZE 0x1000
|
#define PAGE_SIZE 0x1000
|
||||||
#define ENTRIES_PER_PT 512
|
#define ENTRIES_PER_PT 512
|
||||||
|
@ -9,7 +9,7 @@ long k_brk(long brk, long, long, long, long, long)
|
|||||||
if(brk)
|
if(brk)
|
||||||
{
|
{
|
||||||
while(_brk < 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;
|
_brk += PAGE_SIZE;
|
||||||
}
|
}
|
||||||
return _brk;
|
return _brk;
|
||||||
@ -29,7 +29,7 @@ long k_mmap(long addr, long length, long prot, long flags, long fd, long offset)
|
|||||||
long retval = _mmap;
|
long retval = _mmap;
|
||||||
while(length > 0)
|
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;
|
_mmap += PAGE_SIZE;
|
||||||
length -= PAGE_SIZE;
|
length -= PAGE_SIZE;
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,7 @@ void memory_init()
|
|||||||
uint64_t page = vmm_get_page(kernel_P4, vaddr);
|
uint64_t page = vmm_get_page(kernel_P4, vaddr);
|
||||||
if(page == (uint64_t)-1 || !(page & PAGE_PRESENT))
|
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);
|
vmm_set_page(kernel_P4, vaddr, p, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user