PMM -- calloc function for getting cleared pages
This commit is contained in:
parent
5dc4e27392
commit
3a4136c225
@ -33,6 +33,7 @@ size_t strlen(const char *s);
|
|||||||
|
|
||||||
void pmm_free(uintptr_t page);
|
void pmm_free(uintptr_t page);
|
||||||
uintptr_t pmm_alloc();
|
uintptr_t pmm_alloc();
|
||||||
|
uintptr_t pmm_calloc();
|
||||||
|
|
||||||
uintptr_t vmm_get_page(void *P4, uintptr_t addr);
|
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);
|
||||||
|
@ -16,3 +16,10 @@ uintptr_t pmm_alloc()
|
|||||||
page = (uintptr_t)(page?V2P(page):0);
|
page = (uintptr_t)(page?V2P(page):0);
|
||||||
return page;
|
return page;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uintptr_t pmm_calloc()
|
||||||
|
{
|
||||||
|
uintptr_t page = pmm_alloc();
|
||||||
|
memset(P2V(page), 0, 0x1000);
|
||||||
|
return page;
|
||||||
|
}
|
||||||
|
@ -77,19 +77,19 @@ int touch_page(void *P4, uintptr_t addr, uint16_t flags)
|
|||||||
flags ^= PAGE_HUGE*huge;
|
flags ^= PAGE_HUGE*huge;
|
||||||
|
|
||||||
if((!P4e(P4, addr).present)
|
if((!P4e(P4, addr).present)
|
||||||
&& (!(P4e(P4, addr).value = pmm_alloc())))
|
&& (!(P4e(P4, addr).value = pmm_calloc())))
|
||||||
return -1;
|
return -1;
|
||||||
P4e(P4, addr).value |= flags | PAGE_PRESENT;
|
P4e(P4, addr).value |= flags | PAGE_PRESENT;
|
||||||
|
|
||||||
if((!P3e(P4, addr).present)
|
if((!P3e(P4, addr).present)
|
||||||
&& (!(P3e(P4, addr).value = pmm_alloc())))
|
&& (!(P3e(P4, addr).value = pmm_calloc())))
|
||||||
return -1;
|
return -1;
|
||||||
P3e(P4, addr).value |= flags | PAGE_PRESENT;
|
P3e(P4, addr).value |= flags | PAGE_PRESENT;
|
||||||
|
|
||||||
if(huge) return 0;
|
if(huge) return 0;
|
||||||
|
|
||||||
if((!P2e(P4, addr).present)
|
if((!P2e(P4, addr).present)
|
||||||
&& (!(P2e(P4, addr).value = pmm_alloc())))
|
&& (!(P2e(P4, addr).value = pmm_calloc())))
|
||||||
return -1;
|
return -1;
|
||||||
P2e(P4, addr).value |= flags | PAGE_PRESENT;
|
P2e(P4, addr).value |= flags | PAGE_PRESENT;
|
||||||
|
|
||||||
|
@ -119,7 +119,7 @@ TEST(set_page_does_not_overwrite_4kb_pages_with_2mb)
|
|||||||
ASSERT_NEQ_INT(retval, 0);
|
ASSERT_NEQ_INT(retval, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
uintptr_t pmm_alloc()
|
uintptr_t pmm_calloc()
|
||||||
{
|
{
|
||||||
uintptr_t *pages[] = {p3, p2, p1};
|
uintptr_t *pages[] = {p3, p2, p1};
|
||||||
static int counter=0;
|
static int counter=0;
|
||||||
@ -153,7 +153,7 @@ TEST(touch_page_sets_flags)
|
|||||||
}
|
}
|
||||||
TEST(touch_page_fails_if_out_of_pages)
|
TEST(touch_page_fails_if_out_of_pages)
|
||||||
{
|
{
|
||||||
pmm_alloc();
|
pmm_calloc();
|
||||||
int retval = touch_page(p4, 0, 0);
|
int retval = touch_page(p4, 0, 0);
|
||||||
ASSERT_NEQ_INT(retval, 0);
|
ASSERT_NEQ_INT(retval, 0);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user