Minor adjustments to the allocator
This commit is contained in:
parent
28a29ecdff
commit
da81dfc597
|
@ -46,7 +46,7 @@ static void liballoc_unlock() {
|
||||||
* \return A pointer to the allocated memory.
|
* \return A pointer to the allocated memory.
|
||||||
*/
|
*/
|
||||||
static void* liballoc_alloc(size_t count) {
|
static void* liballoc_alloc(size_t count) {
|
||||||
return (void*) PhysAllocateMem(count * PAGE_SIZE);
|
return (void*) PhysAllocateZeroMem(count * PAGE_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** This frees previously allocated memory. The void* parameter passed
|
/** This frees previously allocated memory. The void* parameter passed
|
||||||
|
|
|
@ -26,7 +26,6 @@
|
||||||
#define MIN_ORDER 3
|
#define MIN_ORDER 3
|
||||||
#define PEEK(type, address) (*((volatile type*)(address)))
|
#define PEEK(type, address) (*((volatile type*)(address)))
|
||||||
|
|
||||||
uint8_t* Memory = ((uint8_t*)(&memstart));
|
|
||||||
uint8_t* MemoryStart;
|
uint8_t* MemoryStart;
|
||||||
size_t MemoryBuckets;
|
size_t MemoryBuckets;
|
||||||
|
|
||||||
|
@ -58,18 +57,10 @@ static void AddToBuddyList(buddy_t* Buddy, directptr_t Address, size_t Order, bo
|
||||||
|
|
||||||
//SerialPrintf("Adding new entry to buddy: Address 0x%p with order %d, New Entry is %s\r\n", Address, Order, NewEntry ? "true" : "false");
|
//SerialPrintf("Adding new entry to buddy: Address 0x%p with order %d, New Entry is %s\r\n", Address, Order, NewEntry ? "true" : "false");
|
||||||
|
|
||||||
/*
|
|
||||||
SerialPrintf("About to poke memory..\r\n");
|
|
||||||
PEEK(directptr_t, Address) = 0;
|
|
||||||
SerialPrintf("Did it work?\r\n");
|
|
||||||
*/
|
|
||||||
|
|
||||||
size_t Size = 1ull << Order;
|
size_t Size = 1ull << Order;
|
||||||
|
|
||||||
TicketAttemptLock(&Buddy->Lock);
|
TicketAttemptLock(&Buddy->Lock);
|
||||||
|
|
||||||
//SerialPrintf("Ticketlock engaged\r\n");
|
|
||||||
|
|
||||||
if(!NewEntry && ListHead != 0) {
|
if(!NewEntry && ListHead != 0) {
|
||||||
directptr_t ListPrevious = 0;
|
directptr_t ListPrevious = 0;
|
||||||
|
|
||||||
|
@ -93,18 +84,14 @@ static void AddToBuddyList(buddy_t* Buddy, directptr_t Address, size_t Order, bo
|
||||||
ListHead = PEEK(directptr_t, ListHead);
|
ListHead = PEEK(directptr_t, ListHead);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//SerialPrintf("\tAbout to poke memory 0x%p - current value is 0x%x\r\n", Address, *((size_t*)(Address)));
|
|
||||||
*((size_t*)(Address)) = (size_t) ListHead;
|
*((size_t*)(Address)) = (size_t) ListHead;
|
||||||
Buddy->List[Order - MIN_ORDER] = Address;
|
Buddy->List[Order - MIN_ORDER] = Address;
|
||||||
}
|
}
|
||||||
|
|
||||||
TicketUnlock(&Buddy->Lock);
|
TicketUnlock(&Buddy->Lock);
|
||||||
|
|
||||||
//SerialPrintf("Ticketlock Released.\r\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void AddRangeToBuddy(buddy_t* Buddy, directptr_t Base, size_t Size) {
|
static void AddRangeToBuddy(buddy_t* Buddy, directptr_t Base, size_t Size) {
|
||||||
//SerialPrintf("Starting a new range addition.\r\n\t");
|
|
||||||
while(Size > (1ull << MIN_ORDER)) {
|
while(Size > (1ull << MIN_ORDER)) {
|
||||||
//SerialPrintf("New iteration. Current Size: 0x%x\r\n\t", Size);
|
//SerialPrintf("New iteration. Current Size: 0x%x\r\n\t", Size);
|
||||||
for(int Order = Buddy->MaxOrder - 1; Order >= MIN_ORDER; Order--) {
|
for(int Order = Buddy->MaxOrder - 1; Order >= MIN_ORDER; Order--) {
|
||||||
|
@ -234,14 +221,23 @@ void ListMemoryMap() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddRangeToPhysMem(directptr_t Base, size_t Size) {
|
void AddRangeToPhysMem(directptr_t Base, size_t Size) {
|
||||||
if(Base < (void*)(LOWER_REGION + DIRECT_REGION)) {
|
if(Base + Size < (void*)(LOWER_REGION)) {
|
||||||
SerialPrintf("[ Mem] New range in lower memory: 0x%p, size 0x%x\r\n", Base, Size);
|
SerialPrintf("[ Mem] New range in lower memory: 0x%p, size 0x%x\r\n", Base, Size);
|
||||||
AddRangeToBuddy(&LowBuddy, Base, Size);
|
AddRangeToBuddy(&LowBuddy, Base, Size);
|
||||||
} else {
|
} else {
|
||||||
|
if(Base < (void*)(LOWER_REGION)) {
|
||||||
|
size_t difference = (size_t) LOWER_REGION - (size_t) Base;
|
||||||
|
SerialPrintf("[ Mem] Base is 0x%p bytes away from the threshold, allocating 0x%p-0x%p to lower memory..\r\n", difference, Base, Base + difference);
|
||||||
|
AddRangeToBuddy(&LowBuddy, Base, difference);
|
||||||
|
Base = (void*) LOWER_REGION;
|
||||||
|
Size = Size - difference;
|
||||||
|
}
|
||||||
|
|
||||||
if(HighBuddy.Base == NULL) {
|
if(HighBuddy.Base == NULL) {
|
||||||
HighBuddy.Base = Base;
|
HighBuddy.Base = Base;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SerialPrintf("[ Mem] New range in higher memory: 0x%p, size 0x%x\r\n", Base, Size);
|
||||||
AddRangeToBuddy(&HighBuddy, Base, Size);
|
AddRangeToBuddy(&HighBuddy, Base, Size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user