summaryrefslogtreecommitdiff
path: root/kernel/mem.c
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-09-04 16:19:52 +0200
committerMichal Idziorek <m.i@gmx.at>2014-09-04 16:19:52 +0200
commit44dcbdf16674bc727503ca748f95eec847755b2f (patch)
tree6dd5a8353ffa22170b46a2c28d5268d852224549 /kernel/mem.c
parent75c46037e742f07001fafc5a093b27556d2490c9 (diff)
cleanup and improvements in physical mem manager.
Diffstat (limited to 'kernel/mem.c')
-rw-r--r--kernel/mem.c57
1 files changed, 45 insertions, 12 deletions
diff --git a/kernel/mem.c b/kernel/mem.c
index 0b9dab7..ffa56c4 100644
--- a/kernel/mem.c
+++ b/kernel/mem.c
@@ -45,25 +45,36 @@ void pmmngr_init ()
}
}
+//find the first free bit
int mmap_first_free ()
{
- //! find the first free bit
- uint32_t i;
- int j;
-
- for (i=0; i< mem_array_size ; i++)
+ for (int i=0; i< mem_array_size ; i++)
if (_mmngr_memory_map[i] != 0xffffffff)
- for (j=0; j<32; j++)
+ for (int j=0; j<32; j++)
{
- //! test each bit in the dword
- int bit = 1 << j;
- if (! (_mmngr_memory_map[i] & bit) )
- return i*4*8+j;
+ if(!mmap_test(32*i+j))return 32*i+j;
}
return -1;
}
+//find the first free consecutive x bits
+int mmap_first_free_s (uint32_t x)
+{
+ int found=0;
+
+ for (int i=0; i< mem_array_size; i++)
+ if (_mmngr_memory_map[i] != 0xffffffff)
+ for (int j=0; j<32; j++)
+ {
+ if(!mmap_test(32*i+j))found++;
+ else found=0;
+ if(found==x)return 32*i+j;
+ }
+
+ return -1;
+}
+
void pmmngr_init_region (uint32_t base, uint32_t size)
{
uint32_t align = base / PMMNGR_BLOCK_SIZE;
@@ -95,14 +106,36 @@ void* pmmngr_alloc_block ()
if (frame == -1)
{
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"OUT OF MEMORY");
+ panic(FOOLOS_MODULE_NAME,"OUT OF MEMORY (alloc_block)");
return 0; //out of memory
}
mmap_set (frame);
+ mem_free_blocks--;
+
+ uint32_t addr = frame * PMMNGR_BLOCK_SIZE;
+
+ return (void*)addr;
+}
+
+void* pmmngr_alloc_blocks (uint32_t size)
+{
+
+ int frame = mmap_first_free_s (size);
+
+ if (frame == -1)
+ {
+ panic(FOOLOS_MODULE_NAME,"OUT OF MEMORY (alloc_blocks)");
+ return 0; //out of memory
+ }
+
+ for (int i=0; i<size; i++)
+ {
+ mmap_set (frame+i);
+ mem_free_blocks--;
+ }
uint32_t addr = frame * PMMNGR_BLOCK_SIZE;
- mem_free_blocks--;
return (void*)addr;
}