Import backup from 2004-08-02
This commit is contained in:
1 parent
07e8a0f4cf
commit
a50c2a1233
21 files changed
+766
-37
No files matched your search
+10
-14
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user