random number generator, malloc stats
authorJohn Tsiombikas <nuclear@member.fsf.org>
Thu, 22 Aug 2024 00:13:17 +0000 (03:13 +0300)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Thu, 22 Aug 2024 00:13:17 +0000 (03:13 +0300)
kern/src/libc/malloc.c
kern/src/libc/malloc.h
kern/src/libc/rand.c [new file with mode: 0644]
kern/src/libc/stdlib.h
kern/src/main.c

index d96f7ec..223ba13 100644 (file)
@@ -17,7 +17,8 @@ struct memrange {
 #define RNGEND(rng)    ((struct memrange __far*)((char __far*)(rng) + (rng)->len))
 
 static struct memrange __far *pool;
-static unsigned int freemem, num_alloc;
+static unsigned long freemem;
+static unsigned int num_alloc;
 
 
 int kmalloc_init(int numblk)
@@ -161,3 +162,20 @@ void kfree(void __far *p)
                }
        }
 }
+
+void dbg_print_kmalloc_pool(void)
+{
+       struct memrange __far *m;
+
+       m = pool;
+       while(m) {
+               printf("[%x:%x/%x] ", FP_SEG(m), FP_OFFS(m), m->len);
+               m = m->next;
+       }
+       putchar('\n');
+}
+
+void dbg_print_kmalloc_stats(void)
+{
+       printf("free memory: %lx, num alloc: %x\n", freemem, num_alloc);
+}
index d17a209..facc7a9 100644 (file)
@@ -5,4 +5,7 @@ int kmalloc_init(int numblk);
 void __far *kmalloc(unsigned long sz);
 void kfree(void __far *ptr);
 
+void dbg_print_kmalloc_pool(void);
+void dbg_print_kmalloc_stats(void);
+
 #endif /* MALLOC_H_ */
diff --git a/kern/src/libc/rand.c b/kern/src/libc/rand.c
new file mode 100644 (file)
index 0000000..5eb8103
--- /dev/null
@@ -0,0 +1,16 @@
+#include <stdlib.h>
+#include <inttypes.h>
+
+unsigned long st = 1;
+
+int rand(void)
+{
+       st = st * 1103515245 + 12345;
+    return (unsigned int)(st >> 16) & 0xffff;
+}
+
+void srand(unsigned int seed)
+{
+       st = seed;
+}
+
index f8ff71b..ec17319 100644 (file)
@@ -1,10 +1,15 @@
 #ifndef STDLIB_H_
 #define STDLIB_H_
 
+#define RAND_MAX       32767
+
 #define abs(x) __builtin_abs(x)
 
 int atoi(const char *str);
 long atol(const char *str);
 long strtol(const char *str, char **endp, int base);
 
+int rand(void);
+void srand(unsigned int seed);
+
 #endif /* STDLIB_H_ */
index 178e328..6a412d4 100644 (file)
@@ -1,6 +1,7 @@
 #include "config.h"
 
 #include <stdio.h>
+#include <stdlib.h>
 #include <malloc.h>
 #include "intr.h"
 #include "vid.h"
@@ -11,6 +12,8 @@
 
 void kmain(void)
 {
+       int i;
+
        vid_init();
        ser_init();
        con_init();
@@ -18,14 +21,29 @@ void kmain(void)
 
        printf("eightysix kernel %s\n", VERSTR);
 
-       void __far *ptr = kmalloc(2000);
-       printf("allocated 2k at: %x:%x\n", FP_SEG(ptr), FP_OFFS(ptr));
-       kfree(ptr);
-       printf("freed\n");
-       ptr = kmalloc(256);
-       printf("allocated 256b, got: %x:%x\n", FP_SEG(ptr), FP_OFFS(ptr));
-       ptr = kmalloc(512);
-       printf("allocated 512 more at: %x:%x\n", FP_SEG(ptr), FP_OFFS(ptr));
+       printf("kmalloc free pool\n");
+       dbg_print_kmalloc_pool();
+       printf("kmalloc stats\n");
+       dbg_print_kmalloc_stats();
+
+       void __far *ptr[32];
+
+       for(i=0; i<32; i++) {
+               ptr[i] = kmalloc(256);
+       }
+
+       for(i=0; i<20; i++) {
+               int idx = rand() & 0x1f;
+               if(ptr[idx]) {
+                       kfree(ptr[idx]);
+                       ptr[idx] = 0;
+               }
+       }
+
+       printf("kmalloc free pool\n");
+       dbg_print_kmalloc_pool();
+       printf("kmalloc stats\n");
+       dbg_print_kmalloc_stats();
 
        init_intr();
 }