#include #include #include #include #include #include #include #include #include #include #include #include void init(void *dtb, file_node_t **initrd_root) { init_exception(); // UART uart_init(); // Device tree DEBUG_DTB(dtb); dtb_start = dtb; vector_t *dtb_struct_cbs = make_vector(0); VEC_PUSH(dtb_struct_cbs, &initrd_dtb_cb); VEC_PUSH(dtb_struct_cbs, &mman_dtb_memory_cb); fdt_traverse(dtb_struct_cbs); DEBUG_DTB("device tree parse done"); // Initramfs DEBUG_INITRD(initrd_start); *initrd_root = initrd_init(); // Memory (Buddy system) mman_init(); init_interrupt(); } static inline void _print_time(uint64_t) { uint64_t cntpct_el0, cntfrq_el0; R_SYSREG(cntpct_el0, cntpct_el0); R_SYSREG(cntfrq_el0, cntfrq_el0); DEBUG_EXCEP(cntpct_el0 / cntfrq_el0); task_t task = { .firing_tick = cntpct_el0 + 2 * cntfrq_el0, .interval = 2 * cntfrq_el0, .repeat = 1, .func = _print_time, .param = 0x0, }; add_timer_task(task); } static inline void _test() { INFOR("start test"); void *p1, *p2, *p3, *p4, *p5, *p6, *p7; void *c1, *c2, *c3, *c4, *c5, *c6, *c7, *c8; p1 = kmalloc(4095); INFOR(p1); kfree(p1); // 4095 p1 = kmalloc(4095); c1 = kmalloc(1000); INFOR(c1); c2 = kmalloc(1023); INFOR(c2); c3 = kmalloc(999); INFOR(c3); c4 = kmalloc(1010); INFOR(c4); kfree(c3); // 999 c5 = kmalloc(989); INFOR(c5); c3 = kmalloc(88); INFOR(c3); c6 = kmalloc(1001); INFOR(c6); kfree(c3); // 88 c7 = kmalloc(2045); c8 = kmalloc(1); p2 = kmalloc(4096); kfree(c8); // 1 p3 = kmalloc(16000); kfree(p1); // 4095 kfree(c3); // 88 kfree(c7); // 2045 p4 = kmalloc(4097); p5 = kmalloc(4096 + 1); p6 = kmalloc(4096); kfree(p2); // 4096 kfree(p5); // MAX_BLOCK_SIZE + 1 kfree(p4); // 4097 p7 = kmalloc(7197); kfree(p6); // MAX_BLOCK_SIZE kfree(p3); // 16000 kfree(p7); // 7197 kfree(c1); // 1000 kfree(c6); // 1001 kfree(c2); // 1023 kfree(c5); // 989 kfree(c4); // 1010 } void main(void *dtb) { file_node_t *initrd_root = 0x0; init(dtb, &initrd_root); // LOG("system booting in"); // _print_time(0x0); uint64_t el; R_SYSREG(el, CurrentEL); INFOR(el); void *page1 = allocate_page(1); INFOR(page1); void *page2 = allocate_page(2); INFOR(page2); void *page4 = allocate_page(4); INFOR(page4); void *page16 = allocate_page(16); INFOR(page16); free_page(page1); free_page(page2); free_page(page4); free_page(page16); void *page32 = allocate_page(32); INFOR(page32); page1 = allocate_page(1); INFOR(page1); free_page(page1); void *kmalloc8 = kmalloc(8); INFOR(kmalloc8); kfree(kmalloc8); kmalloc8 = kmalloc(8); INFOR(kmalloc8); kfree(kmalloc8); void *kmalloc7k = kmalloc(7 * (1 << 10)); INFOR(kmalloc7k); void *kmalloc8k = kmalloc(1 << 13); INFOR(kmalloc8k); kfree(kmalloc7k); kfree(kmalloc8k); page1 = allocate_page(1); INFOR(page1); int shell_cont = 1; while (shell_cont) { shell_cont = shell(initrd_root); } }