error_t vmmngr_free_page(pt_entry* entry) { if (!entry) { set_last_error(EINVAL, VMEM_BAD_ARGUMENT, EO_VMMNGR); return ERROR_OCCUR; } void* addr = (void*)pt_entry_get_frame(*entry); if (addr) pmmngr_free_block(addr); pt_entry_del_attrib(entry, I86_PTE_PRESENT); pt_entry_del_attrib(entry, I86_PTE_WRITABLE); return ERROR_OK; }
void vmmngr_free_page(virtual_addr addr) { pt_entry * pte; pte = (pt_entry *) ((uint32_t) vmmngr_get_ptable_address(addr) + PAGE_TABLE_INDEX(addr)); pmmngr_free_block((void *) pt_entry_pfn(*pte)); pt_entry_del_attrib(pte, I86_PTE_PRESENT); }
void vmmngr_set_user(virtual_addr addr, int user) { ptable * ptable = vmmngr_get_ptable_address(addr); pt_entry * pte = vmmngr_ptable_lookup_entry(ptable, addr); if (user) { pt_entry_add_attrib(pte, I86_PTE_USER); } else { pt_entry_del_attrib(pte, I86_PTE_USER); } }
void vmmngr_set_writeable(virtual_addr addr, int writeable) { ptable * ptable = vmmngr_get_ptable_address(addr); pt_entry * pte = vmmngr_ptable_lookup_entry(ptable, addr); if (writeable) { pt_entry_add_attrib(pte, I86_PTE_WRITABLE); } else { pt_entry_del_attrib(pte, I86_PTE_WRITABLE); } }