summaryrefslogtreecommitdiff
path: root/kernel/mem.c
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-11-26 17:42:33 +0100
committerMichal Idziorek <m.i@gmx.at>2014-11-26 17:42:33 +0100
commit9c8cfc2e52b0446f7cab14325028075760869b45 (patch)
treeb85a0f9403bd38ac7947cdf709de787241509533 /kernel/mem.c
parent786bd02b01d80e335d4445698d721213a1884ff5 (diff)
further cleanup
Diffstat (limited to 'kernel/mem.c')
-rw-r--r--kernel/mem.c41
1 files changed, 27 insertions, 14 deletions
diff --git a/kernel/mem.c b/kernel/mem.c
index b2ab6ad..cf0c673 100644
--- a/kernel/mem.c
+++ b/kernel/mem.c
@@ -1,7 +1,8 @@
#define FOOLOS_MODULE_NAME "mem"
+#include <stdint.h>
+
#include "config.h"
-#include "lib/int/stdint.h"
#include "lib/logger/log.h" // logger facilities
//! 8 blocks per byte
@@ -13,12 +14,20 @@
//! block alignment ??? TODO: what is this!?
#define PMMNGR_BLOCK_ALIGN PMMNGR_BLOCK_SIZE
+
//memory map bit array. Each bit represents a 4KB memory block
static uint32_t *_mmngr_memory_map;
-
static uint32_t mem_free_blocks;
static uint32_t mem_array_size;
+char *memmap_type_to_string[]=
+ {
+ "Usable",
+ "Reserved",
+ "ACPI reclaimable",
+ "ACPI NVS",
+ "Bad Memory"
+ };
// bit funcs!
void mmap_set(int bit)
{
@@ -34,10 +43,13 @@ int mmap_test(int bit)
{
return _mmngr_memory_map[bit / 32] & (1 << (bit % 32));
}
+//
+// By default, Set all of memory is in use
void pmmngr_init ()
{
- // By default, all of memory is in use
+ mem_free_blocks=0;
+
for(int i=0;i<mem_array_size;i++)
{
_mmngr_memory_map[i]=0xffffffff;
@@ -57,6 +69,7 @@ int mmap_first_free ()
return -1;
}
+/*
//find the first free consecutive x bits
int mmap_first_free_s (uint32_t x)
{
@@ -73,6 +86,7 @@ int mmap_first_free_s (uint32_t x)
return -1;
}
+*/
void pmmngr_init_region (uint32_t base, uint32_t size)
{
@@ -96,7 +110,6 @@ void pmmngr_deinit_region (uint32_t base, uint32_t size)
mmap_set (align++);
mem_free_blocks--;
}
-
}
void* pmmngr_alloc_block ()
@@ -116,6 +129,7 @@ void* pmmngr_alloc_block ()
return (void*)addr;
}
+/*
void* pmmngr_alloc_blocks (uint32_t size)
{
@@ -138,6 +152,7 @@ void* pmmngr_alloc_blocks (uint32_t size)
return (void*)addr;
}
+*/
void pmmngr_free_block (void* p)
{
@@ -151,17 +166,14 @@ void pmmngr_free_block (void* p)
}
}
+
void mem_init(uint16_t *memmap,uint16_t entries)
{
-
- // init free blocks counter
- mem_free_blocks=0;
+ // 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;
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"the memory map contains %d entries.",entries);
-
// preserve pointer
uint16_t save=memmap;
@@ -173,10 +185,11 @@ void mem_init(uint16_t *memmap,uint16_t entries)
+(((uint32_t)memmap[5])<<16)+memmap[4];
#ifdef MEM_PRINT_MEMORYMAP
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"type: %02d / range: 0x%08x - 0x%08x",
- memmap[8],low_end,high_end);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"range: 0x%08x - 0x%08x (%s)",
+ low_end,high_end,memmap_type_to_string[memmap[8]-1]);
#endif
+ //reclaimable OR usable
if(memmap[8]==1||memmap[8]==3)
{
total_mem+=memmap[4]+(memmap[5]<<16);
@@ -201,7 +214,6 @@ void mem_init(uint16_t *memmap,uint16_t entries)
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)
{
@@ -223,8 +235,9 @@ void mem_init(uint16_t *memmap,uint16_t entries)
memmap+=12;
}
- // here is somewhere our kernel stuff ;) // TODO!! better.
- pmmngr_deinit_region(0x0,0x600000);
+ // here is somewhere our kernel stuff.
+ // reserve 4Mb (0x100000-0x500000) for kernel and ext2 img
+ 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);