Implement uacpi_kernel_unmap
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
#include <zinnia/acpi.h>
|
#include <zinnia/acpi.h>
|
||||||
|
#include <zinnia/alloc.h>
|
||||||
#include <zinnia/console.h>
|
#include <zinnia/console.h>
|
||||||
#include <zinnia/init.h>
|
#include <zinnia/init.h>
|
||||||
#include <zinnia/mmio.h>
|
#include <zinnia/mmio.h>
|
||||||
@@ -28,14 +29,20 @@ void* uacpi_kernel_map(uacpi_phys_addr addr, uacpi_size len) {
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
for (size_t i = 0; i < aligned_len; i += arch_mem_page_size()) {
|
for (size_t i = 0; i < aligned_len; i += arch_mem_page_size()) {
|
||||||
pmap_map(&kernel_vma.pmap, vaddr + i, aligned_addr + i, PROT_READ | PROT_WRITE, CACHE_ANY);
|
pmap_map(&kernel_vma.pmap, vaddr + i, aligned_addr + i, PTE_READ | PTE_WRITE, CACHE_ANY);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (void*)(vaddr + difference);
|
return (void*)(vaddr + difference);
|
||||||
}
|
}
|
||||||
|
|
||||||
void uacpi_kernel_unmap(void* addr, uacpi_size len) {
|
void uacpi_kernel_unmap(void* addr, uacpi_size len) {
|
||||||
// TODO
|
uintptr_t aligned_addr = ALIGN_DOWN((uintptr_t)addr, arch_mem_page_size());
|
||||||
|
uintptr_t difference = (uintptr_t)addr - aligned_addr;
|
||||||
|
size_t aligned_len = ALIGN_UP(len + difference, arch_mem_page_size());
|
||||||
|
|
||||||
|
for (size_t i = 0; i < aligned_len; i += arch_mem_page_size())
|
||||||
|
pmap_unmap(&kernel_vma.pmap, aligned_addr + i);
|
||||||
|
vm_free(aligned_addr, aligned_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
static enum log_level acpi_log_level(uacpi_log_level lvl) {
|
static enum log_level acpi_log_level(uacpi_log_level lvl) {
|
||||||
|
|||||||
Reference in New Issue
Block a user