Code: Select all
asm("invlpg %0" : "=g" (virtual_addr));
This is why I'm asking:
Code: Select all
addr_t* lol2 = (addr_t*)0xa0000000;
puts("Allocating page\n");
addr_t* lol = (addr_t*)AllocPage();
puts("Mapping page\n");
MapPageIn((addr_t)lol, 0xa0000000, (addr_t)page_directory, 0);
puts("Clearing page\n");
ClearPage(lol);
*lol2 = 0xaabbccdd;
printf("lol = 0x%08x\n", *lol);
MapPageOut((addr_t)lol2, (addr_t)page_directory);
/* fault */
*lol2 = 0xaabbccdd;
Code: Select all
addr_t MapPageOut(addr_t virtual, addr_t cr3)
{
/* assign pointers */
addr_t* pg_dir = (addr_t*)cr3;
addr_t* pg_tab;
/* calculate pde en pte entries */
size_t pde = virtual / LOOKUP_VALUE_L3;
size_t pte = (virtual % LOOKUP_VALUE_L3) / PAGE_SIZE;
/* get pde */
pg_tab = (addr_t*) (pg_dir[pde] & 0xfffff000);
/* zero entry */
pg_tab[pte] = 0;
/* invlpg address */
asm("invlpg %0" : "=g" (virtual));
return pg_tab[pte] & 0xfffff000;
}