diff options
Diffstat (limited to 'kernel/mem.c')
| -rw-r--r-- | kernel/mem.c | 53 |
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); |
