x86_64: pmap: implement pmap_flush and pmap_remove_range
This commit is contained in:
@@ -321,6 +321,10 @@ static kern_status_t do_pmap_remove(
|
|||||||
virt_addr_t pv,
|
virt_addr_t pv,
|
||||||
enum page_size size)
|
enum page_size size)
|
||||||
{
|
{
|
||||||
|
if (pmap == PMAP_INVALID) {
|
||||||
|
return KERN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int pml4t_index = BAD_INDEX, pdpt_index = BAD_INDEX,
|
unsigned int pml4t_index = BAD_INDEX, pdpt_index = BAD_INDEX,
|
||||||
pd_index = BAD_INDEX, pt_index = BAD_INDEX;
|
pd_index = BAD_INDEX, pt_index = BAD_INDEX;
|
||||||
|
|
||||||
@@ -622,5 +626,13 @@ kern_status_t pmap_remove(pmap_t pmap, virt_addr_t p)
|
|||||||
|
|
||||||
kern_status_t pmap_remove_range(pmap_t pmap, virt_addr_t p, size_t len)
|
kern_status_t pmap_remove_range(pmap_t pmap, virt_addr_t p, size_t len)
|
||||||
{
|
{
|
||||||
|
if (pmap == PMAP_INVALID) {
|
||||||
|
return KERN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i = p; i < p + len; i += VM_PAGE_SIZE) {
|
||||||
|
pmap_remove(pmap, i);
|
||||||
|
}
|
||||||
|
|
||||||
return KERN_OK;
|
return KERN_OK;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,11 @@
|
|||||||
|
.global pmap_flush
|
||||||
|
.type pmap_flush, @function
|
||||||
|
|
||||||
|
pmap_flush:
|
||||||
|
mov %cr3, %rax
|
||||||
|
mov %rax, %cr3
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
.global pmap_switch
|
.global pmap_switch
|
||||||
.type pmap_switch, @function
|
.type pmap_switch, @function
|
||||||
@@ -6,6 +14,7 @@ pmap_switch:
|
|||||||
mov %rdi, %cr3
|
mov %rdi, %cr3
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
.global gigabyte_pages
|
.global gigabyte_pages
|
||||||
.type gigabyte_pages, @function
|
.type gigabyte_pages, @function
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user