コード例 #1
0
ファイル: getexecdata.c プロジェクト: fritz0705/xelix
// 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;
}
コード例 #2
0
ファイル: debugconsole.c プロジェクト: else/xelix
// 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);
	}
}
コード例 #3
0
ファイル: syscall.c プロジェクト: else/xelix
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);
}