Import backup from 2004-08-02

This commit is contained in:
josh committed 2017-07-25 22:23:48 -04:00
1 parent 07e8a0f4cf
commit a50c2a1233
21 files changed
+766 -37

No files matched your search

+10 -14
View File
@@ -7,7 +7,7 @@
#include "hos_defines.h"
#include "kernel.h"
#include "mm/vmm.h"
#include "asmfuncs.h"
#include "lang/asmfuncs.h"
#include "mm/mm.h"
int vmm_map(void *virt);
@@ -31,7 +31,7 @@ extern mb_info_t mb_info_block;
extern mb_module_t mb_modules[MAX_MODULES];
extern u32_t mm_freepages;
HeapEntryQueue_t heapEntryQueues[VMM_HE_TYPES]; // linked queue of HeapEntry objects
HeapEntryQueue_t heapEntryQueues[VMM_HE_TYPES]; // linked queues of HeapEntry objects
HeapEntry_t heapEntryHeadNodes[VMM_HE_TYPES]; // head nodes for linked queues
HeapEntry_t heapEntryTailNodes[VMM_HE_TYPES]; // tail nodes for linked queues
HeapEntryBlock_t initialHEB; // block for initial 256 HeapEntry objects
@@ -62,10 +62,9 @@ void vmm_init()
/* Allocate a physical page and map the virtual address to it, return physical address allocated or NULL */
int vmm_map(void *virt)
{
if (mm_freepages < 10);
if (mm_freepages < 10)
return -1;
vmm_map1((u32_t)virt, mm_palloc());
return 0;
return vmm_map1((u32_t)virt, mm_palloc());
}
@@ -79,7 +78,7 @@ int vmm_map1(u32_t virt, u32_t physical)
{
u32_t newpagetable;
if (!(newpagetable = mm_palloc()))
return 1; //out of physical memory
return -1; //out of physical memory
pageTables[pde] = newpagetable | 0x03;
invlpg_(virt); //in case it was cached, so we can fill page table safely
memsetd((void*)(0xFFC00000 | (pde << 12)), 0, 1024); //zero out new page table
@@ -194,7 +193,7 @@ void *vmm_palloc()
k_enter_critical();
HeapEntry_t *he = heapEntryQueues[VMM_HE_HOLE].head->next;
HeapEntry_t *wilderness = he;
while (he)
while (he->next)
{
if (he->length == 4096)
{
@@ -229,15 +228,11 @@ int vmm_pfree(void *addr)
{
k_enter_critical();
HeapEntry_t *he = heapEntryQueues[VMM_HE_USED].head->next;
while (he)
while (he->next)
{
if (he->base == addr) //found the page to free
{
((HeapEntry_t *)he->prev)->next = he->next;
((HeapEntry_t *)he->next)->prev = he->prev;
heapEntryQueues[VMM_HE_USED].count--;
he->next = NULL;
he->prev = NULL;
vmm_removeHeapEntry(VMM_HE_USED, he);
vmm_unmap1((u32_t)he->base);
vmm_addToQueue(VMM_HE_HOLE, &heapEntryHeadNodes[VMM_HE_HOLE], he);
k_leave_critical();
@@ -377,7 +372,8 @@ int vmm_coalesceEntry(u32_t queue, HeapEntry_t *newHE)
}
else if ((newHE->base + newHE->length) == existing->base)
{
existing->base -= newHE->length;
existing->base = newHE->base;
existing->length += newHE->length;
return 0;
}
existing = (HeapEntry_t *)existing->next;