X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=linux-user%2Fmain.c;h=0c5e6b5b431de2f7151e13ffa88cb77694545eab;hb=c35734b2a6f9b028edacd5813ff271728ce2a9e3;hp=38e94d27b5d8412a5ad849ec4219fcc559a827b6;hpb=27908725b9e2ccabc5089eb6f8975c6b277de14b;p=qemu diff --git a/linux-user/main.c b/linux-user/main.c index 38e94d2..0c5e6b5 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -670,18 +670,23 @@ void cpu_ppc_store_tbl (CPUState *env, uint32_t value) { cpu_ppc_store_tb(env, ((uint64_t)cpu_ppc_load_tbl(env) << 32) | value); } - -uint32_t cpu_ppc_load_decr (CPUState *env) + +void cpu_ppc601_store_rtcu (CPUState *env, uint32_t value) +__attribute__ (( alias ("cpu_ppc_store_tbu") )); + +uint32_t cpu_ppc601_load_rtcu (CPUState *env) +__attribute__ (( alias ("cpu_ppc_load_tbu") )); + +void cpu_ppc601_store_rtcl (CPUState *env, uint32_t value) { - /* TO FIX */ - return -1; + cpu_ppc_store_tbl(env, value & 0x3FFFFF80); } - -void cpu_ppc_store_decr (CPUState *env, uint32_t value) + +uint32_t cpu_ppc601_load_rtcl (CPUState *env) { - /* TO FIX */ + return cpu_ppc_load_tbl(env) & 0x3FFFFF80; } - + void cpu_loop(CPUPPCState *env) { target_siginfo_t info; @@ -1297,6 +1302,7 @@ static const uint8_t mips_syscall_args[] = { MIPS_SYS(sys_add_key , 5) MIPS_SYS(sys_request_key , 4) MIPS_SYS(sys_keyctl , 5) + MIPS_SYS(sys_set_thread_area, 1) }; #undef MIPS_SYS @@ -1352,6 +1358,8 @@ void cpu_loop(CPUMIPSState *env) } } break; + case EXCP_TLBL: + case EXCP_TLBS: case EXCP_CpU: case EXCP_RI: info.si_signo = TARGET_SIGILL; @@ -1362,6 +1370,20 @@ void cpu_loop(CPUMIPSState *env) 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", @@ -1514,14 +1536,15 @@ void cpu_loop(CPUM68KState *env) void usage(void) { - printf("qemu-" TARGET_ARCH " version " QEMU_VERSION ", Copyright (c) 2003-2005 Fabrice Bellard\n" - "usage: qemu-" TARGET_ARCH " [-h] [-g] [-d opts] [-L path] [-s size] program [arguments...]\n" + printf("qemu-" TARGET_ARCH " version " QEMU_VERSION ", Copyright (c) 2003-2007 Fabrice Bellard\n" + "usage: qemu-" TARGET_ARCH " [-h] [-g] [-d opts] [-L path] [-s size] [-cpu model] program [arguments...]\n" "Linux CPU emulator (compiled for %s emulation)\n" "\n" "-h print this help\n" "-g port wait gdb connection to port\n" "-L path set the elf interpreter prefix (default=%s)\n" "-s size set the stack size in bytes (default=%ld)\n" + "-cpu model select CPU (-cpu ? for list)\n" "\n" "debug options:\n" #ifdef USE_CODE_COPY @@ -1545,6 +1568,7 @@ TaskState *first_task_state; int main(int argc, char **argv) { const char *filename; + const char *cpu_model; struct target_pt_regs regs1, *regs = ®s1; struct image_info info1, *info = &info1; TaskState ts1, *ts = &ts1; @@ -1559,6 +1583,7 @@ int main(int argc, char **argv) /* init debug */ cpu_set_log_filename(DEBUG_LOGFILE); + cpu_model = NULL; optind = 1; for(;;) { if (optind >= argc) @@ -1609,6 +1634,18 @@ int main(int argc, char **argv) gdbstub_port = atoi(argv[optind++]); } else if (!strcmp(r, "r")) { qemu_uname_release = argv[optind++]; + } else if (!strcmp(r, "cpu")) { + cpu_model = argv[optind++]; + if (strcmp(cpu_model, "?") == 0) { +#if defined(TARGET_PPC) + ppc_cpu_list(stdout, &fprintf); +#elif defined(TARGET_ARM) + arm_cpu_list(); +#elif defined(TARGET_MIPS) + mips_cpu_list(stdout, &fprintf); +#endif + _exit(1); + } } else #ifdef USE_CODE_COPY if (!strcmp(r, "no-code-copy")) { @@ -1734,7 +1771,9 @@ int main(int argc, char **argv) #elif defined(TARGET_ARM) { int i; - cpu_arm_set_model(env, ARM_CPUID_ARM1026); + if (cpu_model == NULL) + cpu_model = "arm926"; + cpu_arm_set_model(env, cpu_model); cpsr_write(env, regs->uregs[16], 0xffffffff); for(i = 0; i < 16; i++) { env->regs[i] = regs->uregs[i]; @@ -1761,15 +1800,9 @@ int main(int argc, char **argv) int i; /* Choose and initialise CPU */ - /* XXX: CPU model (or PVR) should be provided on command line */ - // ppc_find_by_name("750gx", &def); - // ppc_find_by_name("750fx", &def); - // ppc_find_by_name("750p", &def); - ppc_find_by_name("750", &def); - // ppc_find_by_name("G3", &def); - // ppc_find_by_name("604r", &def); - // ppc_find_by_name("604e", &def); - // ppc_find_by_name("604", &def); + if (cpu_model == NULL) + cpu_model = "750"; + ppc_find_by_name(cpu_model, &def); if (def == NULL) { cpu_abort(env, "Unable to find PowerPC CPU definition\n"); @@ -1816,15 +1849,24 @@ int main(int argc, char **argv) } #elif defined(TARGET_MIPS) { + mips_def_t *def; int i; + /* Choose and initialise CPU */ + if (cpu_model == NULL) + cpu_model = "24Kf"; + mips_find_by_name(cpu_model, &def); + if (def == NULL) + cpu_abort(env, "Unable to find MIPS CPU definition\n"); + cpu_mips_register(env, def); + for(i = 0; i < 32; i++) { env->gpr[i] = regs->regs[i]; } env->PC = regs->cp0_epc; -#ifdef MIPS_USES_FPU - env->CP0_Status |= (1 << CP0St_CU1); -#endif + if (env->CP0_Config1 & (1 << CP0C1_FP)) { + env->CP0_Status |= (1 << CP0St_CU1); + } } #elif defined(TARGET_SH4) {