// Return execution data. int sys_getexecdata(struct syscall syscall) { task_t* proc = scheduler_getCurrentTask(); switch(syscall.params[0]) { case 0: return proc->argc;; case 1: return (int)proc->argv;; case 2: return (int)proc->environ;; } return NULL; }
// Execute a command // Yes, this is only a bunch of hardcoded crap static void executeCommand(char *command, int argc, char **argv) { if(strcmp(command, "reboot") == 0) reboot(); else if(strcmp(command, "clear") == 0) printf("\e[H\e[2J"); else if(strcmp(command, "pid") == 0) { task_t* proc = scheduler_getCurrentTask(); if(proc != NULL) printf("procnum: %d\n", proc->pid); } else if(strcmp(command, "halt") == 0) halt(); else if(strcmp(command, "freeze") == 0) freeze(); else if(strcmp(command, "panic") == 0) panic("Test panic for debugging"); else if(strcmp(command, "kill") == 0) asm("mov %eax, 1; int 0x80;"); else if(strcmp(command, "triplefault") == 0) { struct vm_context *ctx = vm_new(); paging_apply(ctx); } else if(strcmp(command, "pagefault") == 0) *((char *)vm_faultAddress) = 0; else if(strcmp(command, "reload") == 0) paging_apply(vm_kernelContext); else if(strcmp(command, "rebuild") == 0) { vm_set_cache(vm_kernelContext, NULL); paging_apply(vm_kernelContext); } else if(strcmp(command, "dump") == 0) vm_dump(vm_currentContext); else if (strcmp(command, "kb") == 0) { if (argc != 1) { printf("usage: kb <layoutname>\n"); return; } if (keyboard_setlayout(argv[0]) == -1) { printf("unknown layout\n"); return; } } else { if(strlen(command) > 0 && command[0] != '#') printf("error: command '%s' not found.\n", command); } }
static void intHandler(cpu_state_t* regs) { struct syscall syscall; if (scheduler_getCurrentTask()->sys_call_conv == TASK_SYSCONV_LINUX) { // Linux syscall calling convention syscall.num = regs->eax; syscall.params[0] = regs->ebx; syscall.params[1] = regs->ecx; syscall.params[2] = regs->edx; syscall.params[3] = regs->esi; syscall.params[4] = regs->edi; syscall.params[5] = (int)regs->ebp; } else { // Unix syscall calling convention syscall.num = regs->eax; syscall.params[0] = *((int *)regs->esp + sizeof(int)); syscall.params[1] = *((int *)regs->esp + sizeof(int) * 2); syscall.params[2] = *((int *)regs->esp + sizeof(int) * 3); syscall.params[3] = *((int *)regs->esp + sizeof(int) * 4); syscall.params[4] = *((int *)regs->esp + sizeof(int) * 5); syscall.params[5] = *((int *)regs->esp + sizeof(int) * 6); } syscall_t call = syscall_table[syscall.num]; if (syscall.num >= sizeof(syscall_table) / sizeof(syscall_t) || call == NULL) { log(LOG_INFO, "syscall: Invalid syscall %d\n", syscall.num); syscall.num = -1; return; } regs->eax = call(syscall); }