174 lines
3.5 KiB
C
174 lines
3.5 KiB
C
#include <logger.h>
|
|
#include <timer.h>
|
|
#include <kmalloc.h>
|
|
#include <uart.h>
|
|
#include <dtb.h>
|
|
#include <initrd.h>
|
|
#include <mman.h>
|
|
#include <shell.h>
|
|
#include <vector.h>
|
|
#include <utils.h>
|
|
#include <exception.h>
|
|
#include <interrupt.h>
|
|
|
|
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);
|
|
}
|
|
}
|