main.c

来自「xen虚拟机源代码安装包」· C语言 代码 · 共 1,930 行 · 第 1/5 页

C
1,930
字号
	MIPS_SYS(sys_faccessat, 3)	/* 4300 */	MIPS_SYS(sys_pselect6, 6)	MIPS_SYS(sys_ppoll, 5)	MIPS_SYS(sys_unshare, 1)	MIPS_SYS(sys_splice, 4)	MIPS_SYS(sys_sync_file_range, 7) /* 4305 */	MIPS_SYS(sys_tee, 4)	MIPS_SYS(sys_vmsplice, 4)	MIPS_SYS(sys_move_pages, 6)	MIPS_SYS(sys_set_robust_list, 2)	MIPS_SYS(sys_get_robust_list, 3) /* 4310 */	MIPS_SYS(sys_kexec_load, 4)	MIPS_SYS(sys_getcpu, 3)	MIPS_SYS(sys_epoll_pwait, 6)	MIPS_SYS(sys_ioprio_set, 3)	MIPS_SYS(sys_ioprio_get, 2)};#undef MIPS_SYSvoid cpu_loop(CPUMIPSState *env){    target_siginfo_t info;    int trapnr, ret;    unsigned int syscall_num;    for(;;) {        trapnr = cpu_mips_exec(env);        switch(trapnr) {        case EXCP_SYSCALL:            syscall_num = env->gpr[env->current_tc][2] - 4000;            env->PC[env->current_tc] += 4;            if (syscall_num >= sizeof(mips_syscall_args)) {                ret = -ENOSYS;            } else {                int nb_args;                abi_ulong sp_reg;                abi_ulong arg5 = 0, arg6 = 0, arg7 = 0, arg8 = 0;                nb_args = mips_syscall_args[syscall_num];                sp_reg = env->gpr[env->current_tc][29];                switch (nb_args) {                /* these arguments are taken from the stack */                /* FIXME - what to do if get_user() fails? */                case 8: get_user_ual(arg8, sp_reg + 28);                case 7: get_user_ual(arg7, sp_reg + 24);                case 6: get_user_ual(arg6, sp_reg + 20);                case 5: get_user_ual(arg5, sp_reg + 16);                default:                    break;                }                ret = do_syscall(env, env->gpr[env->current_tc][2],                                 env->gpr[env->current_tc][4],                                 env->gpr[env->current_tc][5],                                 env->gpr[env->current_tc][6],                                 env->gpr[env->current_tc][7],                                 arg5, arg6/*, arg7, arg8*/);            }            if ((unsigned int)ret >= (unsigned int)(-1133)) {                env->gpr[env->current_tc][7] = 1; /* error flag */                ret = -ret;            } else {                env->gpr[env->current_tc][7] = 0; /* error flag */            }            env->gpr[env->current_tc][2] = ret;            break;        case EXCP_TLBL:        case EXCP_TLBS:        case EXCP_CpU:        case EXCP_RI:            info.si_signo = TARGET_SIGILL;            info.si_errno = 0;            info.si_code = 0;            queue_signal(info.si_signo, &info);            break;        case EXCP_INTERRUPT:            /* just indicate that signals should be handled asap */            break;        case EXCP_DEBUG:            {                int sig;                sig = gdb_handlesig (env, TARGET_SIGTRAP);                if (sig)                  {                    info.si_signo = sig;                    info.si_errno = 0;                    info.si_code = TARGET_TRAP_BRKPT;                    queue_signal(info.si_signo, &info);                  }            }            break;        default:            //        error:            fprintf(stderr, "qemu: unhandled CPU exception 0x%x - aborting\n",                    trapnr);            cpu_dump_state(env, stderr, fprintf, 0);            abort();        }        process_pending_signals(env);    }}#endif#ifdef TARGET_SH4void cpu_loop (CPUState *env){    int trapnr, ret;    target_siginfo_t info;    while (1) {        trapnr = cpu_sh4_exec (env);        switch (trapnr) {        case 0x160:            ret = do_syscall(env,                             env->gregs[3],                             env->gregs[4],                             env->gregs[5],                             env->gregs[6],                             env->gregs[7],                             env->gregs[0],                             env->gregs[1]);            env->gregs[0] = ret;            env->pc += 2;            break;        case EXCP_INTERRUPT:            /* just indicate that signals should be handled asap */            break;        case EXCP_DEBUG:            {                int sig;                sig = gdb_handlesig (env, TARGET_SIGTRAP);                if (sig)                  {                    info.si_signo = sig;                    info.si_errno = 0;                    info.si_code = TARGET_TRAP_BRKPT;                    queue_signal(info.si_signo, &info);                  }            }            break;	case 0xa0:	case 0xc0:            info.si_signo = SIGSEGV;            info.si_errno = 0;            info.si_code = TARGET_SEGV_MAPERR;            info._sifields._sigfault._addr = env->tea;            queue_signal(info.si_signo, &info);	    break;        default:            printf ("Unhandled trap: 0x%x\n", trapnr);            cpu_dump_state(env, stderr, fprintf, 0);            exit (1);        }        process_pending_signals (env);    }}#endif#ifdef TARGET_CRISvoid cpu_loop (CPUState *env){    int trapnr, ret;    target_siginfo_t info;        while (1) {        trapnr = cpu_cris_exec (env);        switch (trapnr) {        case 0xaa:            {                info.si_signo = SIGSEGV;                info.si_errno = 0;                /* XXX: check env->error_code */                info.si_code = TARGET_SEGV_MAPERR;                info._sifields._sigfault._addr = env->debug1;                queue_signal(info.si_signo, &info);            }            break;	case EXCP_INTERRUPT:	  /* just indicate that signals should be handled asap */	  break;        case EXCP_BREAK:            ret = do_syscall(env,                              env->regs[9],                              env->regs[10],                              env->regs[11],                              env->regs[12],                              env->regs[13],                              env->pregs[7],                              env->pregs[11]);            env->regs[10] = ret;            env->pc += 2;            break;        case EXCP_DEBUG:            {                int sig;                sig = gdb_handlesig (env, TARGET_SIGTRAP);                if (sig)                  {                    info.si_signo = sig;                    info.si_errno = 0;                    info.si_code = TARGET_TRAP_BRKPT;                    queue_signal(info.si_signo, &info);                  }            }            break;        default:            printf ("Unhandled trap: 0x%x\n", trapnr);            cpu_dump_state(env, stderr, fprintf, 0);            exit (1);        }        process_pending_signals (env);    }}#endif#ifdef TARGET_M68Kvoid cpu_loop(CPUM68KState *env){    int trapnr;    unsigned int n;    target_siginfo_t info;    TaskState *ts = env->opaque;    for(;;) {        trapnr = cpu_m68k_exec(env);        switch(trapnr) {        case EXCP_ILLEGAL:            {                if (ts->sim_syscalls) {                    uint16_t nr;                    nr = lduw(env->pc + 2);                    env->pc += 4;                    do_m68k_simcall(env, nr);                } else {                    goto do_sigill;                }            }            break;        case EXCP_HALT_INSN:            /* Semihosing syscall.  */            env->pc += 4;            do_m68k_semihosting(env, env->dregs[0]);            break;        case EXCP_LINEA:        case EXCP_LINEF:        case EXCP_UNSUPPORTED:        do_sigill:            info.si_signo = SIGILL;            info.si_errno = 0;            info.si_code = TARGET_ILL_ILLOPN;            info._sifields._sigfault._addr = env->pc;            queue_signal(info.si_signo, &info);            break;        case EXCP_TRAP0:            {                ts->sim_syscalls = 0;                n = env->dregs[0];                env->pc += 2;                env->dregs[0] = do_syscall(env,                                          n,                                          env->dregs[1],                                          env->dregs[2],                                          env->dregs[3],                                          env->dregs[4],                                          env->dregs[5],                                          env->aregs[0]);            }            break;        case EXCP_INTERRUPT:            /* just indicate that signals should be handled asap */            break;        case EXCP_ACCESS:            {                info.si_signo = SIGSEGV;                info.si_errno = 0;                /* XXX: check env->error_code */                info.si_code = TARGET_SEGV_MAPERR;                info._sifields._sigfault._addr = env->mmu.ar;                queue_signal(info.si_signo, &info);            }            break;        case EXCP_DEBUG:            {                int sig;                sig = gdb_handlesig (env, TARGET_SIGTRAP);                if (sig)                  {                    info.si_signo = sig;                    info.si_errno = 0;                    info.si_code = TARGET_TRAP_BRKPT;                    queue_signal(info.si_signo, &info);                  }            }            break;        default:            fprintf(stderr, "qemu: unhandled CPU exception 0x%x - aborting\n",                    trapnr);            cpu_dump_state(env, stderr, fprintf, 0);            abort();        }        process_pending_signals(env);    }}#endif /* TARGET_M68K */#ifdef TARGET_ALPHAvoid cpu_loop (CPUState *env){    int trapnr;    target_siginfo_t info;    while (1) {        trapnr = cpu_alpha_exec (env);        switch (trapnr) {        case EXCP_RESET:            fprintf(stderr, "Reset requested. Exit\n");            exit(1);            break;        case EXCP_MCHK:            fprintf(stderr, "Machine check exception. Exit\n");            exit(1);            break;        case EXCP_ARITH:            fprintf(stderr, "Arithmetic trap.\n");            exit(1);            break;        case EXCP_HW_INTERRUPT:            fprintf(stderr, "External interrupt. Exit\n");            exit(1);            break;        case EXCP_DFAULT:            fprintf(stderr, "MMU data fault\n");            exit(1);            break;        case EXCP_DTB_MISS_PAL:            fprintf(stderr, "MMU data TLB miss in PALcode\n");            exit(1);            break;        case EXCP_ITB_MISS:            fprintf(stderr, "MMU instruction TLB miss\n");            exit(1);            break;        case EXCP_ITB_ACV:            fprintf(stderr, "MMU instruction access violation\n");            exit(1);            break;        case EXCP_DTB_MISS_NATIVE:            fprintf(stderr, "MMU data TLB miss\n");            exit(1);            break;        case EXCP_UNALIGN:            fprintf(stderr, "Unaligned access\n");            exit(1);            break;        case EXCP_OPCDEC:            fprintf(stderr, "Invalid instruction\n");            exit(1);            break;        case EXCP_FEN:            fprintf(stderr, "Floating-point not allowed\n");            exit(1);            break;        case EXCP_CALL_PAL ... (EXCP_CALL_PALP - 1):            fprintf(stderr, "Call to PALcode\n");            call_pal(env, (trapnr >> 6) | 0x80);            break;        case EXCP_CALL_PALP ... (EXCP_CALL_PALE - 1):            fprintf(stderr, "Privileged call to PALcode\n");            exit(1);            break;        case EXCP_DEBUG:            {                int sig;                sig = gdb_handlesig (env, TARGET_SIGTRAP);                if (sig)                  {        

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?