meillo@1: #include "mem.h" meillo@1: #include "io.h" meillo@1: meillo@1: meillo@1: void meillo@1: initmem(unsigned int memstart) meillo@1: { meillo@1: unsigned int* p; meillo@1: int step = 2*1024*1024; meillo@1: unsigned int* zero = 0x0; meillo@1: meillo@1: meillo@1: minmem = (unsigned char*)memstart; meillo@1: meillo@1: /* disable cache */ meillo@1: __asm__ __volatile__ ( meillo@1: "movl %cr0, %eax\n\t" meillo@1: "movl $0x60000000, %ebx\n\t" meillo@1: "orl %ebx, %eax\n\t" meillo@1: "movl %eax, %cr0" meillo@1: ); meillo@1: meillo@1: /* test mem size */ meillo@1: p = (unsigned int*) ((unsigned int)minmem/sizeof(char)); meillo@1: do { meillo@1: p += step; meillo@1: *p = 0xf0f0f0f0; meillo@1: } while (*p == 0xf0f0f0f0); meillo@1: maxmem = (unsigned char*)p; meillo@1: meillo@1: /* test mem mirroring */ meillo@1: p = 0; meillo@1: *p = 0; meillo@1: p++; meillo@1: while (p < (unsigned int*)minmem) { meillo@1: p = (unsigned int*) ((unsigned int)p * 2); meillo@1: } meillo@1: while (p < (unsigned int*)maxmem) { meillo@1: *p = 0xf0f0f0f0; meillo@1: if (*zero == 0xf0f0f0f0) { meillo@1: maxmem = (unsigned char*)p; meillo@1: break; meillo@1: } meillo@1: p = (unsigned int*) ((unsigned int)p * 2); meillo@1: } meillo@1: meillo@1: /* enable cache again */ meillo@1: __asm__ __volatile__ ( meillo@1: "movl %cr0, %eax\n\t" meillo@1: "movl $0x60000000, %ebx \n\t" meillo@1: "negl %ebx\n\t" meillo@1: "andl %ebx, %eax\n\t" meillo@1: "movl %eax, %cr0" meillo@1: ); meillo@1: meillo@1: /* min, max */ meillo@1: printf("mem: start=%p end=%p size=%p\n", minmem, maxmem, (void*)(maxmem-minmem)); meillo@1: meillo@1: /* init heap */ meillo@1: newp = minmem; meillo@1: } meillo@1: meillo@1: meillo@1: void* meillo@1: malloc(unsigned int size) meillo@1: { meillo@1: if (newp + size > maxmem) { meillo@1: printf("Fatal error: memory exhausted!\n"); meillo@1: while (1) { meillo@1: } meillo@1: } meillo@1: newp += size; meillo@1: return newp - size; meillo@1: }