Viewing: vmm.c
📄 vmm.c (Read Only) ⬅ To go back
#include "vmm.h"
#include "hal/cpu.h"

/*
 * Architecture-independent VMM wrappers.
 *
 * These functions implement generic logic on top of the arch-specific
 * primitives (vmm_map_page, vmm_set_page_flags, etc.) which are
 * provided by src/arch/<ARCH>/vmm.c.
 */

void vmm_protect_range(uint64_t vaddr, uint64_t len, uint32_t flags) {
    if (len == 0) return;
    uint64_t start = vaddr & ~0xFFFULL;
    uint64_t end = (vaddr + len - 1) & ~0xFFFULL;
    for (uint64_t va = start;; va += 0x1000ULL) {
        vmm_set_page_flags(va, flags | VMM_FLAG_PRESENT);
        if (va == end) break;
    }
}

void vmm_as_activate(uintptr_t as) {
    if (!as) return;
    hal_cpu_set_address_space(as);
}

void vmm_as_map_page(uintptr_t as, uint64_t phys, uint64_t virt, uint32_t flags) {
    if (!as) return;
    uintptr_t old_as = hal_cpu_get_address_space();
    if (old_as != as) {
        vmm_as_activate(as);
        vmm_map_page(phys, virt, flags);
        vmm_as_activate(old_as);
    } else {
        vmm_map_page(phys, virt, flags);
    }
}