CVSROOT: /sources/qemu Module name: qemu Changes by: Paul Brook <pbrook> 06/06/17 19:58:25
Modified files: . : cpu-exec.c linux-user : main.c target-sh4 : helper.c translate.c Log message: SH usermode fault handling. CVSWeb URLs: http://cvs.savannah.gnu.org/viewcvs/qemu/cpu-exec.c?cvsroot=qemu&r1=1.80&r2=1.81 http://cvs.savannah.gnu.org/viewcvs/qemu/linux-user/main.c?cvsroot=qemu&r1=1.86&r2=1.87 http://cvs.savannah.gnu.org/viewcvs/qemu/target-sh4/helper.c?cvsroot=qemu&r1=1.1&r2=1.2 http://cvs.savannah.gnu.org/viewcvs/qemu/target-sh4/translate.c?cvsroot=qemu&r1=1.3&r2=1.4 Patches: Index: cpu-exec.c =================================================================== RCS file: /sources/qemu/qemu/cpu-exec.c,v retrieving revision 1.80 retrieving revision 1.81 diff -u -b -r1.80 -r1.81 --- cpu-exec.c 14 Jun 2006 17:32:25 -0000 1.80 +++ cpu-exec.c 17 Jun 2006 19:58:24 -0000 1.81 @@ -1172,7 +1172,6 @@ a virtual CPU fault */ cpu_restore_state(tb, env, pc, puc); } - if (ret == 1) { #if 0 printf("PF exception: NIP=0x%08x error=0x%x %p\n", env->nip, env->error_code, tb); @@ -1180,11 +1179,7 @@ /* we restore the process signal mask as the sigreturn should do it (XXX: use sigsetjmp) */ sigprocmask(SIG_SETMASK, old_set, NULL); - // do_raise_exception_err(env->exception_index, env->error_code); - } else { - /* activate soft MMU for this block */ - cpu_resume_from_signal(env, puc); - } + cpu_loop_exit(); /* never comes here */ return 1; } Index: linux-user/main.c =================================================================== RCS file: /sources/qemu/qemu/linux-user/main.c,v retrieving revision 1.86 retrieving revision 1.87 diff -u -b -r1.86 -r1.87 --- linux-user/main.c 17 Jun 2006 18:30:42 -0000 1.86 +++ linux-user/main.c 17 Jun 2006 19:58:24 -0000 1.87 @@ -1362,7 +1362,7 @@ void cpu_loop (CPUState *env) { int trapnr, ret; - // target_siginfo_t info; + target_siginfo_t info; while (1) { trapnr = cpu_sh4_exec (env); @@ -1380,6 +1380,20 @@ env->gregs[0x10] = 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); Index: target-sh4/helper.c =================================================================== RCS file: /sources/qemu/qemu/target-sh4/helper.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -b -r1.1 -r1.2 --- target-sh4/helper.c 27 Apr 2006 21:00:31 -0000 1.1 +++ target-sh4/helper.c 17 Jun 2006 19:58:24 -0000 1.2 @@ -28,6 +28,38 @@ #include "cpu.h" #include "exec-all.h" +#if defined(CONFIG_USER_ONLY) + +void do_interrupt (CPUState *env) +{ + env->exception_index = -1; +} + +int cpu_sh4_handle_mmu_fault(CPUState * env, target_ulong address, int rw, + int is_user, int is_softmmu) +{ + env->tea = address; + switch (rw) { + case 0: + env->exception_index = 0x0a0; + break; + case 1: + env->exception_index = 0x0c0; + break; + case 2: + env->exception_index = 0x0a0; + break; + } + return 1; +} + +target_ulong cpu_get_phys_page_debug(CPUState * env, target_ulong addr) +{ + return addr; +} + +#else /* !CONFIG_USER_ONLY */ + #define MMU_OK 0 #define MMU_ITLB_MISS (-1) #define MMU_ITLB_MULTIPLE (-2) @@ -396,3 +428,14 @@ return tlb_set_page(env, address, physical, prot, is_user, is_softmmu); } + +target_ulong cpu_get_phys_page_debug(CPUState * env, target_ulong addr) +{ + target_ulong physical; + int prot; + + get_physical_address(env, &physical, &prot, addr, PAGE_READ, 0); + return physical; +} + +#endif Index: target-sh4/translate.c =================================================================== RCS file: /sources/qemu/qemu/target-sh4/translate.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -b -r1.3 -r1.4 --- target-sh4/translate.c 17 Jun 2006 18:48:31 -0000 1.3 +++ target-sh4/translate.c 17 Jun 2006 19:58:25 -0000 1.4 @@ -144,22 +144,6 @@ return env; } -#ifdef CONFIG_USER_ONLY -target_ulong cpu_get_phys_page_debug(CPUState * env, target_ulong addr) -{ - return addr; -} -#else -target_ulong cpu_get_phys_page_debug(CPUState * env, target_ulong addr) -{ - target_ulong physical; - int prot; - - get_physical_address(env, &physical, &prot, addr, PAGE_READ, 0); - return physical; -} -#endif - static void gen_goto_tb(DisasContext * ctx, int n, target_ulong dest) { TranslationBlock *tb; @@ -1108,7 +1092,7 @@ target_ulong pc_start; static uint16_t *gen_opc_end; uint32_t old_flags; - int i; + int i, ii; pc_start = tb->pc; gen_opc_ptr = gen_opc_buf; @@ -1135,6 +1119,7 @@ } #endif + ii = -1; while ((old_flags & (DELAY_SLOT | DELAY_SLOT_CONDITIONAL)) == 0 && (ctx.flags & (BRANCH | BRANCH_CONDITIONAL | MODE_CHANGE | BRANCH_EXCEPTION)) == 0 && @@ -1151,6 +1136,16 @@ } } } + if (search_pc) { + i = gen_opc_ptr - gen_opc_buf; + if (ii < i) { + ii++; + while (ii < i) + gen_opc_instr_start[ii++] = 0; + } + gen_opc_pc[ii] = ctx.pc; + gen_opc_instr_start[ii] = 1; + } #if 0 fprintf(stderr, "Loading opcode at address 0x%08x\n", ctx.pc); fflush(stderr); @@ -1192,7 +1187,15 @@ gen_op_debug(); } *gen_opc_ptr = INDEX_op_end; + if (search_pc) { + i = gen_opc_ptr - gen_opc_buf; + ii++; + while (ii <= i) + gen_opc_instr_start[ii++] = 0; + tb->size = 0; + } else { tb->size = ctx.pc - pc_start; + } #ifdef DEBUG_DISAS #ifdef SH4_DEBUG_DISAS @@ -1220,6 +1223,5 @@ int gen_intermediate_code_pc(CPUState * env, struct TranslationBlock *tb) { - assert(0); return gen_intermediate_code_internal(env, tb, 1); } _______________________________________________ Qemu-devel mailing list Qemu-devel@nongnu.org http://lists.nongnu.org/mailman/listinfo/qemu-devel