84 lines
2.5 KiB
C
84 lines
2.5 KiB
C
#include <kernel/memory.h>
|
|
#include <kernel/devices/earlyterm.h>
|
|
#include <kernel/util/kmem.h>
|
|
|
|
// Internal data.
|
|
struct memory_info pmemory;
|
|
|
|
__attribute__((constructor(101)))
|
|
void memory_init(void)
|
|
{
|
|
extern uint32_t ram_start;
|
|
extern uint32_t srom;
|
|
|
|
// Initialize RAM informations
|
|
// TODO determine RAM's size
|
|
pmemory.ram.end = (void *)0x88080000;
|
|
pmemory.ram.start = (void *)(((uintptr_t)&ram_start + 3) >> 2 << 2);
|
|
pmemory.ram.size = pmemory.ram.end - pmemory.ram.start;
|
|
|
|
// Generate cache part
|
|
pmemory.cache.delta = NULL;
|
|
pmemory.cache.pages.number = 0;
|
|
pmemory.cache.pages.size = PM_PAGE_SIZE;
|
|
pmemory.cache.pages.list = pmemory.ram.start;
|
|
pmemory.cache.pages.base_addr = pmemory.ram.end;
|
|
while ((void *)&pmemory.cache.pages.list[pmemory.cache.pages.number] <
|
|
pmemory.cache.pages.base_addr - PM_PAGE_SIZE)
|
|
{
|
|
pmemory.cache.pages.base_addr -= PM_PAGE_SIZE;
|
|
pmemory.cache.pages.number += 1;
|
|
}
|
|
|
|
// Initialize kernel heap
|
|
pmemory.kheap = NULL;
|
|
|
|
// Debug
|
|
/* earlyterm_write("kernel = %do -> %dko\n", &srom, (uint32_t)&srom / 1024);
|
|
earlyterm_write("ram start = %p\n", pmemory.ram.start);
|
|
earlyterm_write("ram end = %p\n", pmemory.ram.end);
|
|
earlyterm_write("ram size = %do -> %dko\n", pmemory.ram.size, pmemory.ram.size / 1024);
|
|
earlyterm_write("page size = %do -> %#xo\n", pmemory.cache.pages.size, pmemory.cache.pages.size);
|
|
earlyterm_write("page num = %d\n", pmemory.cache.pages.number);
|
|
earlyterm_write("real RAM = %d -> %dko\n", pmemory.cache.pages.number * PM_PAGE_SIZE, (pmemory.cache.pages.number * PM_PAGE_SIZE) / 1024);
|
|
*/
|
|
// Initialize cache page list
|
|
for (int i = 0 ; i < pmemory.cache.pages.number ; i = i + 1)
|
|
{
|
|
pmemory.cache.pages.list[i].status = PAGE_UNUSED;
|
|
pmemory.cache.pages.list[i].next = NULL;
|
|
}
|
|
|
|
// TEST part
|
|
/* void *test0 = kmem_alloc(16);
|
|
void *test1 = kmem_alloc(128);
|
|
void *test2 = kmem_alloc(80);
|
|
earlyterm_write("test0 = %p\n", test0);
|
|
earlyterm_write("test1 = %p\n", test1);
|
|
earlyterm_write("test2 = %p\n", test2);
|
|
kmem_free(test1);
|
|
//kmem_debug();
|
|
//DBG_WAIT;
|
|
test1 = kmem_realloc(NULL, 16);
|
|
//earlyterm_write("test1 = %p\n", test1);
|
|
//kmem_debug();
|
|
//DBG_WAIT;
|
|
test1 = kmem_realloc(test1, 32);
|
|
earlyterm_write("test1 = %p\n", test1);
|
|
kmem_debug();
|
|
DBG_WAIT;
|
|
//test1 = kmem_realloc(test1, 10);
|
|
//earlyterm_write("test1 = %p\n", test1);
|
|
//kmem_debug();
|
|
//DBG_WAIT;
|
|
test1 = kmem_realloc(test1, 128);
|
|
earlyterm_write("test1 = %p\n", test1);
|
|
kmem_debug();
|
|
DBG_WAIT;
|
|
test1 = kmem_realloc(test1, 200);
|
|
earlyterm_write("test1 = %p\n", test1);
|
|
kmem_debug();
|
|
DBG_WAIT;
|
|
while (1);*/
|
|
}
|