#include <stdint.h> #include "../kernel/bootlog.h" extern console_t _vc[]; unsigned *buffer; unsigned *bufferIterator; #define PAGESIZE 4096 char ts[4096*3]; char td[4096*3]; void _mm_physical_init(void); unsigned _mm_physical_alloc(void); void _mm_physical_free(unsigned page); void _mm_page_copy_byte(uint32_t dest, uint32_t src); void _mm_page_copy_word(uint32_t dest, uint32_t src); void _mm_page_copy_dword(uint32_t dest, uint32_t src); void _mm_virtual_init(void); void _mm_init(void) { klog("init", "Initializing memory management", K_KLOG_PENDING, &_vc[0]); _mm_physical_init(); _mm_virtual_init(); klog((void *)0, (void *)0, K_KLOG_SUCCESS, &_vc[0]); } void _mm_physical_init(void) { unsigned i; unsigned size = 16 * 1024 * 1024; size /= PAGESIZE; size++; size /= 32; buffer = (unsigned *)0x40000; bufferIterator = (unsigned *)0x40000; for(i = 0; i < 72; i++) buffer[i] = 0xFFFFFFFF; for(i = 72; i < size; i++) buffer[i] = 0x00000000; } unsigned _mm_physical_alloc(void) { unsigned mask = 0x00000001; unsigned bit = 0; /** * Search for a free space */ while(*bufferIterator == 0xFFFFFFFF) bufferIterator++; /** * Search for a bit that indicates a free page */ while(*bufferIterator & mask) { mask <<= 1; bit++; } *bufferIterator |= mask; return 32 * (bufferIterator - buffer) + bit; } void _mm_physical_free(unsigned page) { buffer[page >> 5] &= ~(1 << (page & 0x1F)); /* confused yet?!? */ } void _mm_virtual_init(void) { } void _mm_page_copy_byte(uint32_t dest, uint32_t src) { __asm__ __volatile__ ( "cld;" "rep; movsb;" : : "c" (1024*1024), "D" (dest), "S" (src) : "memory" ); } void _mm_page_copy_word(uint32_t dest, uint32_t src) { __asm__ __volatile__ ( "cld;" "rep; movsw;" : : "c" (512*1024), "D" (dest), "S" (src) : "memory" ); } void _mm_page_copy_dword(uint32_t dest, uint32_t src) { __asm__ __volatile__ ( "cld;" "rep; movsl;" : : "c" (256*1024), "D" (dest), "S" (src) : "memory" ); }