diff mem.c @ 1:42ba76f77035 default tip

the kernel with output and mem alloc
author meillo@marmaro.de
date Sun, 01 Nov 2009 23:50:51 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mem.c	Sun Nov 01 23:50:51 2009 +0100
@@ -0,0 +1,74 @@
+#include "mem.h"
+#include "io.h"
+
+
+void
+initmem(unsigned int memstart)
+{
+	unsigned int* p;
+	int step = 2*1024*1024;
+	unsigned int* zero = 0x0;
+
+
+	minmem = (unsigned char*)memstart;
+
+	/* disable cache */
+	__asm__ __volatile__ (
+		"movl %cr0, %eax\n\t"
+		"movl $0x60000000, %ebx\n\t"
+		"orl %ebx, %eax\n\t"
+		"movl %eax, %cr0"
+	);
+
+	/* test mem size */
+	p = (unsigned int*) ((unsigned int)minmem/sizeof(char));
+	do {
+		p += step;
+		*p = 0xf0f0f0f0;
+	} while (*p == 0xf0f0f0f0);
+	maxmem = (unsigned char*)p;
+
+	/* test mem mirroring */
+	p = 0;
+	*p = 0;
+	p++;
+	while (p < (unsigned int*)minmem) {
+		p = (unsigned int*) ((unsigned int)p * 2);
+	}
+	while (p < (unsigned int*)maxmem) {
+		*p = 0xf0f0f0f0;
+		if (*zero == 0xf0f0f0f0) {
+			maxmem = (unsigned char*)p;
+			break;
+		}
+		p = (unsigned int*) ((unsigned int)p * 2);
+	}
+
+	/* enable cache again */
+	__asm__ __volatile__ (
+		"movl %cr0, %eax\n\t"
+		"movl $0x60000000, %ebx \n\t"
+		"negl %ebx\n\t"
+		"andl %ebx, %eax\n\t"
+		"movl %eax, %cr0"
+	);
+
+	/* min, max */
+	printf("mem: start=%p end=%p size=%p\n", minmem, maxmem, (void*)(maxmem-minmem));
+
+	/* init heap */
+	newp = minmem;
+}
+
+
+void*
+malloc(unsigned int size)
+{
+	if (newp + size > maxmem) {
+		printf("Fatal error: memory exhausted!\n");
+		while (1) {
+		}
+	}
+	newp += size;
+	return newp - size;
+}