1
0
Fork 0
mirror of https://github.com/hermitcore/libhermit.git synced 2025-03-09 00:00:03 +01:00

mark new page table entries as accessed

=> good for the page structure cache
This commit is contained in:
Stefan Lankes 2016-02-21 17:07:00 +01:00
parent 0090f75659
commit a59cceb15b
2 changed files with 12 additions and 12 deletions

View file

@ -89,17 +89,17 @@ align 4
; Bootstrap page tables are used during the initialization.
align 4096
boot_pml4:
DQ boot_pdpt + 0x7 ; PG_PRESENT | PG_RW | PG_USER
DQ boot_pdpt + 0x27 ; PG_PRESENT | PG_RW | PG_USER | PG_ACCESSED
times 510 DQ 0 ; PAGE_MAP_ENTRIES - 2
DQ boot_pml4 + 0x203 ; PG_PRESENT | PG_RW | PG_SELF (self-reference)
DQ boot_pml4 + 0x223 ; PG_PRESENT | PG_RW | PG_ACCESSED | PG_SELF (self-reference)
boot_pdpt:
DQ boot_pgd + 0x3 ; PG_PRESENT | PG_RW
DQ boot_pgd + 0x23 ; PG_PRESENT | PG_RW | PG_ACCESSED
times 510 DQ 0 ; PAGE_MAP_ENTRIES - 2
DQ boot_pml4 + 0x203 ; PG_PRESENT | PG_RW | PG_SELF (self-reference)
DQ boot_pml4 + 0x223 ; PG_PRESENT | PG_RW | PG_ACCESSED | PG_SELF (self-reference)
boot_pgd:
DQ boot_pgt + 0x3 ; PG_PRESENT | PG_RW
DQ boot_pgt + 0x23 ; PG_PRESENT | PG_RW | PG_ACCESSED
times 510 DQ 0 ; PAGE_MAP_ENTRIES - 2
DQ boot_pml4 + 0x203 ; PG_PRESENT | PG_RW | PG_SELF (self-reference)
DQ boot_pml4 + 0x223 ; PG_PRESENT | PG_RW | PG_ACCESSED | PG_SELF (self-reference)
boot_pgt:
times 512 DQ 0

View file

@ -142,9 +142,9 @@ int page_map(size_t viraddr, size_t phyaddr, size_t npages, size_t bits)
/* Reference the new table within its parent */
#if 0
self[lvl][vpn] = phyaddr | bits | PG_PRESENT | PG_USER | PG_RW;
self[lvl][vpn] = phyaddr | bits | PG_PRESENT | PG_USER | PG_RW | PG_ACCESSED;
#else
self[lvl][vpn] = (phyaddr | bits | PG_PRESENT | PG_USER | PG_RW) & ~PG_XD;
self[lvl][vpn] = (phyaddr | bits | PG_PRESENT | PG_USER | PG_RW | PG_ACCESSED) & ~PG_XD;
#endif
/* Fill new table with zeros */
@ -158,7 +158,7 @@ int page_map(size_t viraddr, size_t phyaddr, size_t npages, size_t bits)
if (self[lvl][vpn] & PG_PRESENT)
flush = 1;
self[lvl][vpn] = phyaddr | bits | PG_PRESENT;
self[lvl][vpn] = phyaddr | bits | PG_PRESENT | PG_ACCESSED;
if (flush)
/* There's already a page mapped at this address.
@ -269,11 +269,11 @@ int page_map_copy(task_t *dest)
dest->page_map |= PG_PRESENT;
spinlock_irqsave_lock(curr_task->page_lock);
self[PAGE_LEVELS-1][PAGE_MAP_ENTRIES-2] = dest->page_map | PG_PRESENT | PG_SELF | PG_RW;
self[PAGE_LEVELS-1][PAGE_MAP_ENTRIES-2] = dest->page_map | PG_PRESENT | PG_SELF | PG_ACCESSED | PG_RW;
int ret = traverse(PAGE_LEVELS-1, 0);
other[PAGE_LEVELS-1][PAGE_MAP_ENTRIES-1] = dest->page_map | PG_PRESENT | PG_SELF | PG_RW;
other[PAGE_LEVELS-1][PAGE_MAP_ENTRIES-1] = dest->page_map | PG_PRESENT | PG_SELF | PG_ACCESSED | PG_RW;
self [PAGE_LEVELS-1][PAGE_MAP_ENTRIES-2] = 0;
spinlock_irqsave_unlock(curr_task->page_lock);
@ -316,7 +316,7 @@ void page_fault_handler(struct state *s)
* do we have a valid page table entry? => flush TLB and return
*/
if (check_pagetables(viraddr)) {
tlb_flush_one_page(viraddr);
//tlb_flush_one_page(viraddr);
spinlock_irqsave_unlock(task->page_lock);
return;
}