VMM -- refactoring, break out test for page presence
This commit is contained in:
parent
d54a206f82
commit
69022cadd5
@ -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;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user