Import backup from 2005-09-11

This commit is contained in:
josh committed 2017-07-25 22:23:51 -04:00
1 parent 396c5f3452
commit 0521733e20
10 files changed
+1391 -79

No files matched your search

+29 -15
View File
@@ -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;