diff options
author | Ian Moffett <ian@osmora.org> | 2025-06-01 21:31:31 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-06-01 21:31:31 -0400 |
commit | a3a1cf9889bda1467f0326984af3560aa5c3ec01 (patch) | |
tree | 6acb2424073b5ccfe7af3c32d1f8bc8731af6ed3 /sys/arch/amd64 | |
parent | 068224956eff541e1c9b54cd2042cc67fac1761f (diff) |
kernel/amd64: pmap: Add PTE dirty bit handling
Add support for managing the page table entry dirty bit. This will allow
vm(9) to know when to page-out data to backing store, among other
things.
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'sys/arch/amd64')
-rw-r--r-- | sys/arch/amd64/amd64/pmap.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/sys/arch/amd64/amd64/pmap.c b/sys/arch/amd64/amd64/pmap.c index 2e62a4b..0bdf3b7 100644 --- a/sys/arch/amd64/amd64/pmap.c +++ b/sys/arch/amd64/amd64/pmap.c @@ -33,6 +33,8 @@ #include <sys/errno.h> #include <machine/tlb.h> #include <machine/vas.h> +#include <machine/cpu.h> +#include <machine/cdefs.h> #include <vm/pmap.h> #include <vm/physmem.h> #include <vm/vm.h> @@ -303,3 +305,37 @@ pmap_set_cache(struct vas vas, vaddr_t va, int type) return 0; } + +bool +pmap_is_clean(struct vas vas, vaddr_t va) +{ + uintptr_t *tbl; + int status; + size_t idx; + + if ((status = pmap_get_tbl(vas, va, false, &tbl)) != 0) + return status; + + idx = pmap_get_level_index(1, va); + return ISSET(tbl[idx], PTE_DIRTY) == 0; +} + +void +pmap_mark_clean(struct vas vas, vaddr_t va) +{ + uintptr_t *tbl; + int status; + size_t idx; + + if ((status = pmap_get_tbl(vas, va, false, &tbl)) != 0) + return; + + idx = pmap_get_level_index(1, va); + tbl[idx] &= ~PTE_DIRTY; + + if (cpu_count() > 1) { + cpu_shootdown_tlb(va); + } else { + __invlpg(va); + } +} |