VMM -- refactoring, break out test for page presence

This commit is contained in:
Thomas Lovén 2017-12-31 09:51:25 +01:00
parent d54a206f82
commit 69022cadd5

View File

@ -25,13 +25,20 @@ union PTE {
#define P2e(pt, addr) PT(P3e(pt, addr).value)[P2_OFFSET(addr)] #define P2e(pt, addr) PT(P3e(pt, addr).value)[P2_OFFSET(addr)]
#define P1e(pt, addr) PT(P2e(pt, addr).value)[P1_OFFSET(addr)] #define P1e(pt, addr) PT(P2e(pt, addr).value)[P1_OFFSET(addr)]
uintptr_t vmm_get_page(void *P4, uintptr_t addr) int page_exists(void *P4, uintptr_t addr)
{ {
if(P4 if(P4
&& P4e(P4, addr).present && P4e(P4, addr).present
&& P3e(P4, addr).present && P3e(P4, addr).present
&& P2e(P4, addr).present && P2e(P4, addr).present
) )
return 1;
return 0;
}
uintptr_t vmm_get_page(void *P4, uintptr_t addr)
{
if(page_exists(P4, addr))
return P1e(P4, addr).value; return P1e(P4, addr).value;
else else
return -1; return -1;
@ -39,11 +46,7 @@ uintptr_t vmm_get_page(void *P4, uintptr_t addr)
int vmm_set_page(void *P4, uintptr_t addr, uintptr_t page, uint16_t flags) int vmm_set_page(void *P4, uintptr_t addr, uintptr_t page, uint16_t flags)
{ {
if(!(P4 if(!page_exists(P4, addr))
&& P4e(P4, addr).present
&& P3e(P4, addr).present
&& P2e(P4, addr).present
))
return -1; return -1;
P1e(P4, addr).value = page | flags; P1e(P4, addr).value = page | flags;
@ -75,11 +78,7 @@ int touch_page(void *P4, uintptr_t addr, uint16_t flags)
void free_page(void *P4, uintptr_t addr, int free) void free_page(void *P4, uintptr_t addr, int free)
{ {
(void)free; (void)free;
if(!(P4 if(!page_exists(P4, addr))
&& P4e(P4, addr).present
&& P3e(P4, addr).present
&& P2e(P4, addr).present
))
return; return;
P1e(P4, addr).value = 0; P1e(P4, addr).value = 0;