#include #include #include #include #include #include #include #include #include #include #include #include "umka.h" #include "shell.h" #include "trace.h" #define THREAD_STACK_SIZE 0x100000 static void monitor(void) { umka_sti(); fprintf(stderr, "Start monitor thread\n"); FILE *fin = fopen("/tmp/umka.fifo.2u", "r"); FILE *fout = fopen("/tmp/umka.fifo.4u", "w"); if (!fin || !fout) { fprintf(stderr, "Can't open monitor files!\n"); return; } run_test(fin, fout, 0); } void umka_thread_ping(void); void umka_thread_net_drv(void); struct itimerval timeout = {.it_value = {.tv_sec = 0, .tv_usec = 10000}, .it_interval = {.tv_sec = 0, .tv_usec = 10000}}; static void thread_start(int is_kernel, void (*entry)(void), size_t stack_size) { uint8_t *stack = malloc(stack_size); umka_new_sys_threads(is_kernel, entry, stack + stack_size); } /* can't get pty working may be because of my custom threads and blocking, don't know void new_monitor(void) { umka_sti(); fprintf(stderr, "Start monitor thread\n"); int mpty = posix_openpt(O_RDWR | O_NOCTTY); if (mpty == -1) { perror("open master pty"); return; } if (grantpt(mpty) == -1) { perror("grantpt"); return; } if (unlockpt(mpty) == -1) { perror("unlockpt"); return; } char *spty_name = ptsname(mpty); if (spty_name == NULL) { perror("open slave pty"); return; } fprintf(stderr, "[os] pty=%s\n", spty_name); FILE *fmpty = fdopen(mpty, "r+"); if (fmpty == NULL) { perror("fdopen mpty"); return; } run_test(fmpty, fmpty, 0); } */ int main() { if (coverage) trace_begin(); umka_tool = UMKA_OS; umka_sti(); struct sigaction sa; sa.sa_sigaction = irq0; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_SIGINFO; if (sigaction(SIGPROF, &sa, NULL) == -1) { printf("Can't install signal handler!\n"); return 1; } /* void *app_base = mmap((void*)0x000000, 16*0x100000, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (app_base == MAP_FAILED) { perror("mmap failed"); exit(1); } */ printf("pid=%d, kos_lfb_base=%p\n", getpid(), (void*)kos_lfb_base); umka_init(); umka_stack_init(); thread_start(0, monitor, THREAD_STACK_SIZE); thread_start(0, umka_thread_net_drv, THREAD_STACK_SIZE); // thread_start(0, umka_thread_ping, THREAD_STACK_SIZE); setitimer(ITIMER_PROF, &timeout, NULL); kos_osloop(); // doesn't return if (coverage) trace_end(); return 0; }