PMM -- simplification of code
This commit is contained in:
parent
9bc1abceff
commit
e86857dca4
@ -1,25 +1,28 @@
|
||||
#include <memory.h>
|
||||
|
||||
uint64_t first = 0;
|
||||
// Virtual addres of next free page
|
||||
uint64_t next = 0;
|
||||
|
||||
void pmm_free(uint64_t page)
|
||||
{
|
||||
page = (uint64_t)P2V(page);
|
||||
*(uint64_t *)page = first;
|
||||
first = page;
|
||||
// Write previous free pointer to freed page
|
||||
*(uint64_t *)P2V(page) = next;
|
||||
// And update free pointer
|
||||
next = (uint64_t)P2V(page);
|
||||
}
|
||||
|
||||
uint64_t pmm_alloc()
|
||||
{
|
||||
uint64_t page = first;
|
||||
first = page?*(uint64_t *)page:0;
|
||||
page = (uint64_t)(page?V2P(page):0);
|
||||
return page;
|
||||
if(!next) return 0;
|
||||
uint64_t page = next;
|
||||
// Read new free pointer from allocated page
|
||||
next = *(uint64_t *)page;
|
||||
return (uint64_t)V2P(page);
|
||||
}
|
||||
|
||||
uint64_t pmm_calloc()
|
||||
{
|
||||
uint64_t page = pmm_alloc();
|
||||
memset(P2V(page), 0, 0x1000);
|
||||
memset(P2V(page), 0, PAGE_SIZE);
|
||||
return page;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user