aboutsummaryrefslogtreecommitdiff
path: root/tests/malloc/init.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/malloc/init.c')
-rw-r--r--tests/malloc/init.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/tests/malloc/init.c b/tests/malloc/init.c
new file mode 100644
index 0000000..5048e82
--- /dev/null
+++ b/tests/malloc/init.c
@@ -0,0 +1,42 @@
+#include <common/test.h>
+
+START(pid, tid, d0, d1, d2, d3)
+{
+ UNUSED(pid);
+ UNUSED(tid);
+ UNUSED(d0);
+ UNUSED(d1);
+ UNUSED(d2);
+ UNUSED(d3);
+
+ printf("allocating space for pointers...\n");
+ /* 12 MiB / 4K */
+ void **allocs = sys_req_mem(200 * sizeof(void *), VM_W | VM_R);
+ check(allocs, "initial allocation failed\n");
+
+ printf("allocating memory until we run out...\n");
+
+ long i = 0;
+ while (1) {
+ char *p = sys_req_mem(1, VM_W | VM_R);
+ if (!p)
+ break;
+
+ /* check that we actually got a page */
+ *p = 'a';
+ allocs[i++] = p;
+ }
+
+ printf("ran out of memory, freeing...\n");
+ for (; i >= 0; --i)
+ sys_free_mem((uintptr_t)allocs[i]);
+
+ printf("freed all memory, doing one last allocation to check we're good...\n");
+ /* not super exhaustive but would hopefully go haywire if the page
+ * allocator got corrupted or something */
+ char *p = sys_req_mem(1, VM_W | VM_R);
+ *p = 'b';
+ sys_free_mem((uintptr_t)p);
+ sys_free_mem((uintptr_t)allocs);
+ ok();
+}