⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 qemu性能直逼VMware的仿真器QEMU 的模擬速度約為實機的 25%;約為 Bochs 的 60 倍。Plex86、User-Mode-Linux、VMware 和 Virtual PC 則比
💻 C
📖 第 1 页 / 共 4 页
字号:
                if (loglevel) {                    fprintf(logfile, "Unknwon program exception (%02x)\n",                            env->error_code);                }                abort();            }            info._sifields._sigfault._addr = env->nip - 4;            queue_signal(info.si_signo, &info);            break;        case EXCP_NO_FP:            fprintf(stderr, "No floating point allowed\n");            if (loglevel)                fprintf(logfile, "No floating point allowed\n");            info.si_signo = TARGET_SIGILL;            info.si_errno = 0;            info.si_code = TARGET_ILL_COPROC;            info._sifields._sigfault._addr = env->nip - 4;            queue_signal(info.si_signo, &info);            break;        case EXCP_DECR:            /* Should not happen ! */            fprintf(stderr, "Decrementer exception\n");            if (loglevel)                fprintf(logfile, "Decrementer exception\n");            abort();        case EXCP_TRACE:            /* Do nothing: we use this to trace execution */            break;        case EXCP_FP_ASSIST:            /* Should not happen ! */            fprintf(stderr, "Floating point assist exception\n");            if (loglevel)                fprintf(logfile, "Floating point assist exception\n");            abort();        case EXCP_MTMSR:            /* We reloaded the msr, just go on */            if (msr_pr == 0) {                fprintf(stderr, "Tried to go into supervisor mode !\n");                if (loglevel)                    fprintf(logfile, "Tried to go into supervisor mode !\n");                abort();        }            break;        case EXCP_BRANCH:            /* We stopped because of a jump... */            break;        case EXCP_INTERRUPT:            /* Don't know why this should ever happen... */            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);            if (loglevel) {                fprintf(logfile, "qemu: unhandled CPU exception 0x%02x - "                        "0x%02x - aborting\n", trapnr, env->error_code);            }            abort();        }        process_pending_signals(env);    }}#endif#ifdef TARGET_MIPS#define MIPS_SYS(name, args) args,static const uint8_t mips_syscall_args[] = {	MIPS_SYS(sys_syscall	, 0)	/* 4000 */	MIPS_SYS(sys_exit	, 1)	MIPS_SYS(sys_fork	, 0)	MIPS_SYS(sys_read	, 3)	MIPS_SYS(sys_write	, 3)	MIPS_SYS(sys_open	, 3)	/* 4005 */	MIPS_SYS(sys_close	, 1)	MIPS_SYS(sys_waitpid	, 3)	MIPS_SYS(sys_creat	, 2)	MIPS_SYS(sys_link	, 2)	MIPS_SYS(sys_unlink	, 1)	/* 4010 */	MIPS_SYS(sys_execve	, 0)	MIPS_SYS(sys_chdir	, 1)	MIPS_SYS(sys_time	, 1)	MIPS_SYS(sys_mknod	, 3)	MIPS_SYS(sys_chmod	, 2)	/* 4015 */	MIPS_SYS(sys_lchown	, 3)	MIPS_SYS(sys_ni_syscall	, 0)	MIPS_SYS(sys_ni_syscall	, 0)	/* was sys_stat */	MIPS_SYS(sys_lseek	, 3)	MIPS_SYS(sys_getpid	, 0)	/* 4020 */	MIPS_SYS(sys_mount	, 5)	MIPS_SYS(sys_oldumount	, 1)	MIPS_SYS(sys_setuid	, 1)	MIPS_SYS(sys_getuid	, 0)	MIPS_SYS(sys_stime	, 1)	/* 4025 */	MIPS_SYS(sys_ptrace	, 4)	MIPS_SYS(sys_alarm	, 1)	MIPS_SYS(sys_ni_syscall	, 0)	/* was sys_fstat */	MIPS_SYS(sys_pause	, 0)	MIPS_SYS(sys_utime	, 2)	/* 4030 */	MIPS_SYS(sys_ni_syscall	, 0)	MIPS_SYS(sys_ni_syscall	, 0)	MIPS_SYS(sys_access	, 2)	MIPS_SYS(sys_nice	, 1)	MIPS_SYS(sys_ni_syscall	, 0)	/* 4035 */	MIPS_SYS(sys_sync	, 0)	MIPS_SYS(sys_kill	, 2)	MIPS_SYS(sys_rename	, 2)	MIPS_SYS(sys_mkdir	, 2)	MIPS_SYS(sys_rmdir	, 1)	/* 4040 */	MIPS_SYS(sys_dup		, 1)	MIPS_SYS(sys_pipe	, 0)	MIPS_SYS(sys_times	, 1)	MIPS_SYS(sys_ni_syscall	, 0)	MIPS_SYS(sys_brk		, 1)	/* 4045 */	MIPS_SYS(sys_setgid	, 1)	MIPS_SYS(sys_getgid	, 0)	MIPS_SYS(sys_ni_syscall	, 0)	/* was signal(2) */	MIPS_SYS(sys_geteuid	, 0)	MIPS_SYS(sys_getegid	, 0)	/* 4050 */	MIPS_SYS(sys_acct	, 0)	MIPS_SYS(sys_umount	, 2)	MIPS_SYS(sys_ni_syscall	, 0)	MIPS_SYS(sys_ioctl	, 3)	MIPS_SYS(sys_fcntl	, 3)	/* 4055 */	MIPS_SYS(sys_ni_syscall	, 2)	MIPS_SYS(sys_setpgid	, 2)	MIPS_SYS(sys_ni_syscall	, 0)	MIPS_SYS(sys_olduname	, 1)	MIPS_SYS(sys_umask	, 1)	/* 4060 */	MIPS_SYS(sys_chroot	, 1)	MIPS_SYS(sys_ustat	, 2)	MIPS_SYS(sys_dup2	, 2)	MIPS_SYS(sys_getppid	, 0)	MIPS_SYS(sys_getpgrp	, 0)	/* 4065 */	MIPS_SYS(sys_setsid	, 0)	MIPS_SYS(sys_sigaction	, 3)	MIPS_SYS(sys_sgetmask	, 0)	MIPS_SYS(sys_ssetmask	, 1)	MIPS_SYS(sys_setreuid	, 2)	/* 4070 */	MIPS_SYS(sys_setregid	, 2)	MIPS_SYS(sys_sigsuspend	, 0)	MIPS_SYS(sys_sigpending	, 1)	MIPS_SYS(sys_sethostname	, 2)	MIPS_SYS(sys_setrlimit	, 2)	/* 4075 */	MIPS_SYS(sys_getrlimit	, 2)	MIPS_SYS(sys_getrusage	, 2)	MIPS_SYS(sys_gettimeofday, 2)	MIPS_SYS(sys_settimeofday, 2)	MIPS_SYS(sys_getgroups	, 2)	/* 4080 */	MIPS_SYS(sys_setgroups	, 2)	MIPS_SYS(sys_ni_syscall	, 0)	/* old_select */	MIPS_SYS(sys_symlink	, 2)	MIPS_SYS(sys_ni_syscall	, 0)	/* was sys_lstat */	MIPS_SYS(sys_readlink	, 3)	/* 4085 */	MIPS_SYS(sys_uselib	, 1)	MIPS_SYS(sys_swapon	, 2)	MIPS_SYS(sys_reboot	, 3)	MIPS_SYS(old_readdir	, 3)	MIPS_SYS(old_mmap	, 6)	/* 4090 */	MIPS_SYS(sys_munmap	, 2)	MIPS_SYS(sys_truncate	, 2)	MIPS_SYS(sys_ftruncate	, 2)	MIPS_SYS(sys_fchmod	, 2)	MIPS_SYS(sys_fchown	, 3)	/* 4095 */	MIPS_SYS(sys_getpriority	, 2)	MIPS_SYS(sys_setpriority	, 3)	MIPS_SYS(sys_ni_syscall	, 0)	MIPS_SYS(sys_statfs	, 2)	MIPS_SYS(sys_fstatfs	, 2)	/* 4100 */	MIPS_SYS(sys_ni_syscall	, 0)	/* was ioperm(2) */	MIPS_SYS(sys_socketcall	, 2)	MIPS_SYS(sys_syslog	, 3)	MIPS_SYS(sys_setitimer	, 3)	MIPS_SYS(sys_getitimer	, 2)	/* 4105 */	MIPS_SYS(sys_newstat	, 2)	MIPS_SYS(sys_newlstat	, 2)	MIPS_SYS(sys_newfstat	, 2)	MIPS_SYS(sys_uname	, 1)	MIPS_SYS(sys_ni_syscall	, 0)	/* 4110 was iopl(2) */	MIPS_SYS(sys_vhangup	, 0)	MIPS_SYS(sys_ni_syscall	, 0)	/* was sys_idle() */	MIPS_SYS(sys_ni_syscall	, 0)	/* was sys_vm86 */	MIPS_SYS(sys_wait4	, 4)	MIPS_SYS(sys_swapoff	, 1)	/* 4115 */	MIPS_SYS(sys_sysinfo	, 1)	MIPS_SYS(sys_ipc		, 6)	MIPS_SYS(sys_fsync	, 1)	MIPS_SYS(sys_sigreturn	, 0)	MIPS_SYS(sys_clone	, 0)	/* 4120 */	MIPS_SYS(sys_setdomainname, 2)	MIPS_SYS(sys_newuname	, 1)	MIPS_SYS(sys_ni_syscall	, 0)	/* sys_modify_ldt */	MIPS_SYS(sys_adjtimex	, 1)	MIPS_SYS(sys_mprotect	, 3)	/* 4125 */	MIPS_SYS(sys_sigprocmask	, 3)	MIPS_SYS(sys_ni_syscall	, 0)	/* was create_module */	MIPS_SYS(sys_init_module	, 5)	MIPS_SYS(sys_delete_module, 1)	MIPS_SYS(sys_ni_syscall	, 0)	/* 4130	was get_kernel_syms */	MIPS_SYS(sys_quotactl	, 0)	MIPS_SYS(sys_getpgid	, 1)	MIPS_SYS(sys_fchdir	, 1)	MIPS_SYS(sys_bdflush	, 2)	MIPS_SYS(sys_sysfs	, 3)	/* 4135 */	MIPS_SYS(sys_personality	, 1)	MIPS_SYS(sys_ni_syscall	, 0)	/* for afs_syscall */	MIPS_SYS(sys_setfsuid	, 1)	MIPS_SYS(sys_setfsgid	, 1)	MIPS_SYS(sys_llseek	, 5)	/* 4140 */	MIPS_SYS(sys_getdents	, 3)	MIPS_SYS(sys_select	, 5)	MIPS_SYS(sys_flock	, 2)	MIPS_SYS(sys_msync	, 3)	MIPS_SYS(sys_readv	, 3)	/* 4145 */	MIPS_SYS(sys_writev	, 3)	MIPS_SYS(sys_cacheflush	, 3)	MIPS_SYS(sys_cachectl	, 3)	MIPS_SYS(sys_sysmips	, 4)	MIPS_SYS(sys_ni_syscall	, 0)	/* 4150 */	MIPS_SYS(sys_getsid	, 1)	MIPS_SYS(sys_fdatasync	, 0)	MIPS_SYS(sys_sysctl	, 1)	MIPS_SYS(sys_mlock	, 2)	MIPS_SYS(sys_munlock	, 2)	/* 4155 */	MIPS_SYS(sys_mlockall	, 1)	MIPS_SYS(sys_munlockall	, 0)	MIPS_SYS(sys_sched_setparam, 2)	MIPS_SYS(sys_sched_getparam, 2)	MIPS_SYS(sys_sched_setscheduler, 3)	/* 4160 */	MIPS_SYS(sys_sched_getscheduler, 1)	MIPS_SYS(sys_sched_yield	, 0)	MIPS_SYS(sys_sched_get_priority_max, 1)	MIPS_SYS(sys_sched_get_priority_min, 1)	MIPS_SYS(sys_sched_rr_get_interval, 2)	/* 4165 */	MIPS_SYS(sys_nanosleep,	2)	MIPS_SYS(sys_mremap	, 4)	MIPS_SYS(sys_accept	, 3)	MIPS_SYS(sys_bind	, 3)	MIPS_SYS(sys_connect	, 3)	/* 4170 */	MIPS_SYS(sys_getpeername	, 3)	MIPS_SYS(sys_getsockname	, 3)	MIPS_SYS(sys_getsockopt	, 5)	MIPS_SYS(sys_listen	, 2)	MIPS_SYS(sys_recv	, 4)	/* 4175 */	MIPS_SYS(sys_recvfrom	, 6)	MIPS_SYS(sys_recvmsg	, 3)	MIPS_SYS(sys_send	, 4)	MIPS_SYS(sys_sendmsg	, 3)	MIPS_SYS(sys_sendto	, 6)	/* 4180 */	MIPS_SYS(sys_setsockopt	, 5)	MIPS_SYS(sys_shutdown	, 2)	MIPS_SYS(sys_socket	, 3)	MIPS_SYS(sys_socketpair	, 4)	MIPS_SYS(sys_setresuid	, 3)	/* 4185 */	MIPS_SYS(sys_getresuid	, 3)	MIPS_SYS(sys_ni_syscall	, 0)	/* was sys_query_module */	MIPS_SYS(sys_poll	, 3)	MIPS_SYS(sys_nfsservctl	, 3)	MIPS_SYS(sys_setresgid	, 3)	/* 4190 */	MIPS_SYS(sys_getresgid	, 3)	MIPS_SYS(sys_prctl	, 5)	MIPS_SYS(sys_rt_sigreturn, 0)	MIPS_SYS(sys_rt_sigaction, 4)	MIPS_SYS(sys_rt_sigprocmask, 4)	/* 4195 */	MIPS_SYS(sys_rt_sigpending, 2)	MIPS_SYS(sys_rt_sigtimedwait, 4)	MIPS_SYS(sys_rt_sigqueueinfo, 3)	MIPS_SYS(sys_rt_sigsuspend, 0)	MIPS_SYS(sys_pread64	, 6)	/* 4200 */	MIPS_SYS(sys_pwrite64	, 6)	MIPS_SYS(sys_chown	, 3)	MIPS_SYS(sys_getcwd	, 2)	MIPS_SYS(sys_capget	, 2)	MIPS_SYS(sys_capset	, 2)	/* 4205 */	MIPS_SYS(sys_sigaltstack	, 0)	MIPS_SYS(sys_sendfile	, 4)	MIPS_SYS(sys_ni_syscall	, 0)	MIPS_SYS(sys_ni_syscall	, 0)	MIPS_SYS(sys_mmap2	, 6)	/* 4210 */	MIPS_SYS(sys_truncate64	, 4)	MIPS_SYS(sys_ftruncate64	, 4)	MIPS_SYS(sys_stat64	, 2)	MIPS_SYS(sys_lstat64	, 2)	MIPS_SYS(sys_fstat64	, 2)	/* 4215 */	MIPS_SYS(sys_pivot_root	, 2)	MIPS_SYS(sys_mincore	, 3)	MIPS_SYS(sys_madvise	, 3)	MIPS_SYS(sys_getdents64	, 3)	MIPS_SYS(sys_fcntl64	, 3)	/* 4220 */	MIPS_SYS(sys_ni_syscall	, 0)	MIPS_SYS(sys_gettid	, 0)	MIPS_SYS(sys_readahead	, 5)	MIPS_SYS(sys_setxattr	, 5)	MIPS_SYS(sys_lsetxattr	, 5)	/* 4225 */	MIPS_SYS(sys_fsetxattr	, 5)	MIPS_SYS(sys_getxattr	, 4)	MIPS_SYS(sys_lgetxattr	, 4)	MIPS_SYS(sys_fgetxattr	, 4)	MIPS_SYS(sys_listxattr	, 3)	/* 4230 */	MIPS_SYS(sys_llistxattr	, 3)	MIPS_SYS(sys_flistxattr	, 3)	MIPS_SYS(sys_removexattr	, 2)	MIPS_SYS(sys_lremovexattr, 2)	MIPS_SYS(sys_fremovexattr, 2)	/* 4235 */	MIPS_SYS(sys_tkill	, 2)	MIPS_SYS(sys_sendfile64	, 5)	MIPS_SYS(sys_futex	, 2)	MIPS_SYS(sys_sched_setaffinity, 3)	MIPS_SYS(sys_sched_getaffinity, 3)	/* 4240 */	MIPS_SYS(sys_io_setup	, 2)	MIPS_SYS(sys_io_destroy	, 1)	MIPS_SYS(sys_io_getevents, 5)	MIPS_SYS(sys_io_submit	, 3)	MIPS_SYS(sys_io_cancel	, 3)	/* 4245 */	MIPS_SYS(sys_exit_group	, 1)	MIPS_SYS(sys_lookup_dcookie, 3)	MIPS_SYS(sys_epoll_create, 1)	MIPS_SYS(sys_epoll_ctl	, 4)	MIPS_SYS(sys_epoll_wait	, 3)	/* 4250 */	MIPS_SYS(sys_remap_file_pages, 5)	MIPS_SYS(sys_set_tid_address, 1)	MIPS_SYS(sys_restart_syscall, 0)	MIPS_SYS(sys_fadvise64_64, 7)	MIPS_SYS(sys_statfs64	, 3)	/* 4255 */	MIPS_SYS(sys_fstatfs64	, 2)	MIPS_SYS(sys_timer_create, 3)	MIPS_SYS(sys_timer_settime, 4)	MIPS_SYS(sys_timer_gettime, 2)	MIPS_SYS(sys_timer_getoverrun, 1)	/* 4260 */	MIPS_SYS(sys_timer_delete, 1)	MIPS_SYS(sys_clock_settime, 2)	MIPS_SYS(sys_clock_gettime, 2)	MIPS_SYS(sys_clock_getres, 2)	MIPS_SYS(sys_clock_nanosleep, 4)	/* 4265 */	MIPS_SYS(sys_tgkill	, 3)	MIPS_SYS(sys_utimes	, 2)	MIPS_SYS(sys_mbind	, 4)	MIPS_SYS(sys_ni_syscall	, 0)	/* sys_get_mempolicy */	MIPS_SYS(sys_ni_syscall	, 0)	/* 4270 sys_set_mempolicy */	MIPS_SYS(sys_mq_open	, 4)	MIPS_SYS(sys_mq_unlink	, 1)	MIPS_SYS(sys_mq_timedsend, 5)	MIPS_SYS(sys_mq_timedreceive, 5)	MIPS_SYS(sys_mq_notify	, 2)	/* 4275 */	MIPS_SYS(sys_mq_getsetattr, 3)	MIPS_SYS(sys_ni_syscall	, 0)	/* sys_vserver */	MIPS_SYS(sys_waitid	, 4)	MIPS_SYS(sys_ni_syscall	, 0)	/* available, was setaltroot */	MIPS_SYS(sys_add_key	, 5)	MIPS_SYS(sys_request_key	, 4)	MIPS_SYS(sys_keyctl	, 5)};#undef MIPS_SYSvoid cpu_loop(CPUMIPSState *env){    target_siginfo_t info;    int trapnr, ret, nb_args;    unsigned int syscall_num;    target_ulong arg5, arg6, sp_reg;    for(;;) {        trapnr = cpu_mips_exec(env);        switch(trapnr) {        case EXCP_SYSCALL:            {                syscall_num = env->gpr[2] - 4000;                env->PC += 4;                if (syscall_num >= sizeof(mips_syscall_args)) {                    ret = -ENOSYS;                } else {                    nb_args = mips_syscall_args[syscall_num];                    if (nb_args >= 5) {                        sp_reg = env->gpr[29];                        /* these arguments are taken from the stack */                        arg5 = tgetl(sp_reg + 16);                        if (nb_args >= 6) {                            arg6 = tgetl(sp_reg + 20);                        } else {                            arg6 = 0;                        }                    } else {                        arg5 = 0;                        arg6 = 0;                    }                    ret = do_syscall(env,                                      env->gpr[2],                                      env->gpr[4],                                     env->gpr[5],                                     env->gpr[6],                                     env->gpr[7],                                     arg5,                                      arg6);                }                if ((unsigned int)ret >= (unsigned int)(-1133)) {                    env->gpr[7] = 1; /* error flag */                    ret = -ret;                    env->gpr[0] = ret;                    env->gpr[2] = ret;                } else {                    env->gpr[7] = 0; /* error flag */                    env->gpr[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);        

⌨️ 快捷键说明

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