Import backup from 2005-09-11
This commit is contained in:
1 parent
396c5f3452
commit
0521733e20
10 files changed
+1391
-79
No files matched your search
+29
-15
@@ -41,6 +41,7 @@ void vmm_init()
|
||||
vmm_map_range((void*)mb_modules[i].mod_start, (void*)mb_modules[i].mod_end - 1, mb_modules[i].mod_start - VIRT_OFFSET);
|
||||
for (i = 0; i < VMM_HE_TYPES; i++)
|
||||
{
|
||||
heapEntryQueues[i].count = 0;
|
||||
heapEntryQueues[i].head = &heapEntryHeadNodes[i];
|
||||
heapEntryHeadNodes[i].next = &heapEntryTailNodes[i];
|
||||
heapEntryTailNodes[i].prev = &heapEntryHeadNodes[i];
|
||||
@@ -159,6 +160,8 @@ void *kmalloc(u32_t size)
|
||||
void *attempt = vmm_getFreeChunk(size);
|
||||
if (attempt)
|
||||
{
|
||||
if ((u32_t)attempt == 0xd000c5e4)
|
||||
kprintf("vmm.c: attempt = 0x%x\n", attempt);
|
||||
k_leave_critical();
|
||||
return attempt;
|
||||
}
|
||||
@@ -168,6 +171,8 @@ void *kmalloc(u32_t size)
|
||||
return NULL; //we could not get any more heap memory
|
||||
}
|
||||
attempt = vmm_getFreeChunk(size);
|
||||
if ((u32_t)attempt == 0xd000c5e4)
|
||||
kprintf("vmm.c: attempt = 0x%x\n", attempt);
|
||||
k_leave_critical();
|
||||
return attempt;
|
||||
}
|
||||
@@ -338,17 +343,17 @@ void *vmm_getFreeChunk(u32_t size)
|
||||
}
|
||||
he = (HeapEntry_t *)he->next;
|
||||
}
|
||||
if (good)
|
||||
{
|
||||
HeapEntry_t *newHE = vmm_getUnusedEntry();
|
||||
newHE->base = good->base;
|
||||
newHE->length = size;
|
||||
good->base += size;
|
||||
good->length -= size;
|
||||
vmm_addToQueue(VMM_HE_USED, heapEntryQueues[VMM_HE_USED].head, newHE);
|
||||
return newHE->base;
|
||||
}
|
||||
return NULL;
|
||||
if (!good)
|
||||
return NULL;
|
||||
HeapEntry_t *newHE = vmm_getUnusedEntry();
|
||||
newHE->base = good->base;
|
||||
newHE->length = size;
|
||||
newHE->next = NULL;
|
||||
newHE->prev = NULL;
|
||||
good->base += size;
|
||||
good->length -= size;
|
||||
vmm_addToQueue(VMM_HE_USED, heapEntryQueues[VMM_HE_USED].head, newHE);
|
||||
return newHE->base;
|
||||
}
|
||||
|
||||
|
||||
@@ -379,6 +384,8 @@ int vmm_moreCore(u32_t size)
|
||||
HeapEntry_t *newHE = vmm_getUnusedEntry();
|
||||
newHE->base = wilderness->base;
|
||||
newHE->length = size;
|
||||
newHE->next = 0;
|
||||
newHE->prev = 0;
|
||||
wilderness->base += size;
|
||||
wilderness->length -= size;
|
||||
if (vmm_coalesceEntry(VMM_HE_FREE, newHE)) // returns 0 on success (coalesced into previous entry)
|
||||
@@ -438,6 +445,7 @@ void vmm_heb_init(HeapEntryBlock_t *heb)
|
||||
|
||||
|
||||
// This function adds a HeapEntry structure to the queue following 'preceeding' the queue
|
||||
// fails if add to tail (add one element before tail node)
|
||||
void vmm_addToQueue(u32_t queue, HeapEntry_t *preceeding, HeapEntry_t *he)
|
||||
{
|
||||
heapEntryQueues[queue].count += vmm_countHeapEntries(he);
|
||||
@@ -472,10 +480,13 @@ HeapEntry_t *vmm_followChain(HeapEntry_t *he)
|
||||
|
||||
|
||||
// This function breaks an unused chunk from its queue and returns a pointer to it
|
||||
// 09/10/05 nasty bug fixed by josh, wasn't adding unused entries when we ran out of them
|
||||
HeapEntry_t *vmm_getUnusedEntry()
|
||||
{
|
||||
if (heapEntryQueues[VMM_HE_UNUSED].count < 5)
|
||||
{
|
||||
kprintf(" heapEntryQueues[VMM_HE_UNUSED].count = %d\n",
|
||||
heapEntryQueues[VMM_HE_UNUSED].count);
|
||||
HeapEntry_t *he = heapEntryQueues[VMM_HE_HOLE].head->next;
|
||||
HeapEntry_t *wilderness = he;
|
||||
while (he)
|
||||
@@ -484,14 +495,15 @@ HeapEntry_t *vmm_getUnusedEntry()
|
||||
wilderness = he;
|
||||
he = (HeapEntry_t *)he->next;
|
||||
}
|
||||
if (wilderness->length < 10000)
|
||||
{
|
||||
k_check(-1, "Kernel panic: out of virtual memory\n");
|
||||
}
|
||||
wilderness->length -= 4096; //strip 4k from the top
|
||||
HeapEntryBlock_t *newHEB = wilderness->base + wilderness->length;
|
||||
vmm_map(newHEB);
|
||||
vmm_heb_init(newHEB);
|
||||
HeapEntry_t *newDesc = vmm_stripUnusedEntry(); //descriptor for the new HEB
|
||||
newDesc->base = newHEB;
|
||||
newDesc->length = 4096;
|
||||
vmm_addToQueue(VMM_HE_USED, heapEntryTailNodes[VMM_HE_USED].prev, newDesc);
|
||||
vmm_addToQueue(VMM_HE_UNUSED, heapEntryTailNodes[VMM_HE_UNUSED].prev, &newHEB->entry[0]);
|
||||
}
|
||||
return vmm_stripUnusedEntry();
|
||||
}
|
||||
@@ -502,6 +514,8 @@ HeapEntry_t *vmm_stripUnusedEntry()
|
||||
{
|
||||
HeapEntry_t *he = heapEntryQueues[VMM_HE_UNUSED].head->next;
|
||||
heapEntryQueues[VMM_HE_UNUSED].head->next = he->next;
|
||||
if (! he->next)
|
||||
kprintf(" he->next is NULL\n");
|
||||
((HeapEntry_t *)he->next)->prev = he->prev;
|
||||
heapEntryQueues[VMM_HE_UNUSED].count--;
|
||||
he->next = 0;
|
||||
|
||||
Reference in new issue
Block a user