#include "libc.h" #include "stdarg.h" #include "tiny.h" int func_help() { printf("\nAvailable Commands:\n"); printf(" help: this help\n"); printf(" suicide: userspace self kill\n"); printf(" syscall5: a syscall with parameters over the stack \n"); printf(" alloc: test allocation\n"); printf(" tiny: a tiny C-like interpreter\n"); return 0; } int func_suicide() { printf("User is about to suicide\n"); int *yolo = 0; *yolo = 1; return 0; } char *initialHeap = 0; int func_alloc() { if (initialHeap == 0) { initialHeap = sbrk(0); } printf("Testing allocation\n"); int allocSize = 4096 * 2; char *currentHeap = sbrk(0); if (currentHeap - initialHeap < allocSize) { brk(initialHeap + allocSize); } int *allocatedData = (int *)initialHeap; for (unsigned int i = 0; i < allocSize / sizeof(int); i++) { allocatedData[i] = i; } printf("Success\nTesting malloc\n"); uintptr_t heap = (uintptr_t)sbrk(0); for (int i = 0; i < 12; i++) { void *ptr = malloc(1 << i); printf("malloc size %d: 0x%p\n", (1 << i), ptr); if (ptr == NULL) { printf("Malloc failed\n"); } memset(ptr, 0, 1 << i); free(ptr); } uintptr_t newHeap = (uintptr_t)sbrk(0); printf("Malloc used %dB\n", newHeap - heap); return 0; } int func_mmap() { char *path ="/dev/zero"; mmap(0, 4096, 0, 0, path); return 0; } int main(int argc, char *argv[]) { (void)argc; (void)argv; char buf[64]; printf("Shell starting... type \"help\" for help\n"); while (1) { printf(">"); if (readline(buf, sizeof(buf))) continue; if (strcmp(buf, "help") == 0) { func_help(); continue; } if (strcmp(buf, "suicide") == 0) { func_suicide(); continue; } if (strcmp(buf, "syscall5") == 0) { testSycall5(1, 2, 3, 4, 5); continue; } if (strcmp(buf, "alloc") == 0) { func_alloc(); continue; } if (strcmp(buf, "tiny") == 0) { func_tiny(); continue; } if (strcmp(buf, "mmap") == 0) { func_mmap(); continue; } } return 0; }