summaryrefslogtreecommitdiff
path: root/kernel/mem.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/mem.c')
-rw-r--r--kernel/mem.c53
1 files changed, 22 insertions, 31 deletions
diff --git a/kernel/mem.c b/kernel/mem.c
index cf0c673..ec99732 100644
--- a/kernel/mem.c
+++ b/kernel/mem.c
@@ -28,6 +28,7 @@ char *memmap_type_to_string[]=
"ACPI NVS",
"Bad Memory"
};
+
// bit funcs!
void mmap_set(int bit)
{
@@ -126,6 +127,7 @@ void* pmmngr_alloc_block ()
mem_free_blocks--;
uint32_t addr = frame * PMMNGR_BLOCK_SIZE;
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"alloc block (%d) 0x%08X)",frame,addr);
return (void*)addr;
}
@@ -164,6 +166,8 @@ void pmmngr_free_block (void* p)
mmap_unset (frame);
mem_free_blocks++;
}
+
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"free block (%d) 0x%08X)",frame,addr);
}
@@ -172,59 +176,46 @@ void mem_init(uint16_t *memmap,uint16_t entries)
// log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"the memory map contains %d entries.",entries);
// count available mem
- uint32_t total_mem=0, highest_end=0, high_end_low=0,last_end=0;
+ uint32_t total_mem=0, highest_end;
- // preserve pointer
- uint16_t save=memmap;
+ //save pointer to memmap
+ uint16_t *save=memmap;
//print memory map and calc blocks.
for(int i=0;i<entries;i++)
{
+ int mem=(memmap[4]+(memmap[5]<<16));
uint32_t low_end=(((uint32_t)memmap[1])<<16)+memmap[0];
- uint32_t high_end=(((uint32_t)memmap[1])<<16)+memmap[0]-1
- +(((uint32_t)memmap[5])<<16)+memmap[4];
+ uint32_t high_end=low_end+mem-1;
+
#ifdef MEM_PRINT_MEMORYMAP
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"range: 0x%08x - 0x%08x (%s)",
- low_end,high_end,memmap_type_to_string[memmap[8]-1]);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"range: 0x%08x - 0x%08x (%s %d KB)",
+ low_end,high_end,memmap_type_to_string[memmap[8]-1],mem/1024);
#endif
//reclaimable OR usable
if(memmap[8]==1||memmap[8]==3)
{
- total_mem+=memmap[4]+(memmap[5]<<16);
+ total_mem+=mem;
+ highest_end=high_end;
- if(high_end>highest_end)
- {
- highest_end=high_end;
- high_end_low=last_end;
- }
- }
- else
- {
- last_end=high_end+1;
}
- memmap+=12;
-
+ memmap+=12; // next entry;
}
- // restore pointer
- memmap=save;
int blocks=highest_end/4096+1;
mem_array_size=blocks/32+1;
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Highest end area: 0x%08X - 0x%08X",high_end_low,highest_end);
- if(highest_end-high_end_low<mem_array_size*4)
- {
- panic(FOOLOS_MODULE_NAME,"not enough space at high end :( sorry.");
- }
-
- _mmngr_memory_map=highest_end-mem_array_size*4;
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Initializing bitmap for 0x%X blocks at 0x%08X",blocks,_mmngr_memory_map);
+ _mmngr_memory_map=0x500000;
+
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Init bitmap for 0x%X blocks (size: %d bytes)",blocks,mem_array_size*4);
- pmmngr_init ();
+ pmmngr_init (); //clear memmap
+ //restore pointer to memmap
+ memmap=save;
for(int i=0;i<entries;i++)
{
@@ -240,7 +231,7 @@ void mem_init(uint16_t *memmap,uint16_t entries)
pmmngr_deinit_region(0x0,0x500000);
// and here is the memory map that we JUST created!
- pmmngr_deinit_region(_mmngr_memory_map,mem_array_size*4);
+ pmmngr_deinit_region(0x500000,mem_array_size*4+PMMNGR_BLOCK_SIZE);
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Usable Mem: %d (0x%X) bytes. (~%d MB)",total_mem,total_mem,total_mem/1024/1024);