Commit c3278b7bf0be16b06f51aa82ffbf4807e608e7b1
1 parent
86bd2ca5
sparc exception fix (we go up to the shell prompt)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1343 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
4 changed files
with
22 additions
and
4 deletions
exec-all.h
... | ... | @@ -61,6 +61,7 @@ extern target_ulong gen_opc_pc[OPC_BUF_SIZE]; |
61 | 61 | extern target_ulong gen_opc_npc[OPC_BUF_SIZE]; |
62 | 62 | extern uint8_t gen_opc_cc_op[OPC_BUF_SIZE]; |
63 | 63 | extern uint8_t gen_opc_instr_start[OPC_BUF_SIZE]; |
64 | +extern target_ulong gen_opc_jump_pc[2]; | |
64 | 65 | |
65 | 66 | typedef void (GenOpFunc)(void); |
66 | 67 | typedef void (GenOpFunc1)(long); | ... | ... |
target-sparc/helper.c
... | ... | @@ -94,7 +94,7 @@ void tlb_fill(target_ulong addr, int is_write, int is_user, void *retaddr) |
94 | 94 | if (tb) { |
95 | 95 | /* the PC is inside the translated code. It means that we have |
96 | 96 | a virtual CPU fault */ |
97 | - cpu_restore_state(tb, env, pc, NULL); | |
97 | + cpu_restore_state(tb, env, pc, (void *)T2); | |
98 | 98 | } |
99 | 99 | } |
100 | 100 | cpu_loop_exit(); | ... | ... |
target-sparc/translate.c
... | ... | @@ -1582,6 +1582,8 @@ static inline int gen_intermediate_code_internal(TranslationBlock * tb, |
1582 | 1582 | page_dump(logfile); |
1583 | 1583 | } |
1584 | 1584 | #endif |
1585 | + gen_opc_jump_pc[0] = dc->jump_pc[0]; | |
1586 | + gen_opc_jump_pc[1] = dc->jump_pc[1]; | |
1585 | 1587 | } else { |
1586 | 1588 | tb->size = last_pc + 4 - pc_start; |
1587 | 1589 | } | ... | ... |
translate-all.c
... | ... | @@ -52,6 +52,7 @@ uint8_t gen_opc_instr_start[OPC_BUF_SIZE]; |
52 | 52 | uint8_t gen_opc_cc_op[OPC_BUF_SIZE]; |
53 | 53 | #elif defined(TARGET_SPARC) |
54 | 54 | target_ulong gen_opc_npc[OPC_BUF_SIZE]; |
55 | +target_ulong gen_opc_jump_pc[2]; | |
55 | 56 | #endif |
56 | 57 | |
57 | 58 | int code_copy_enabled = 1; |
... | ... | @@ -244,9 +245,23 @@ int cpu_restore_state(TranslationBlock *tb, |
244 | 245 | #elif defined(TARGET_ARM) |
245 | 246 | env->regs[15] = gen_opc_pc[j]; |
246 | 247 | #elif defined(TARGET_SPARC) |
247 | - /* XXX: restore npc too */ | |
248 | - env->pc = gen_opc_pc[j]; | |
249 | - env->npc = gen_opc_npc[j]; | |
248 | + { | |
249 | + target_ulong npc; | |
250 | + env->pc = gen_opc_pc[j]; | |
251 | + npc = gen_opc_npc[j]; | |
252 | + if (npc == 1) { | |
253 | + /* dynamic NPC: already stored */ | |
254 | + } else if (npc == 2) { | |
255 | + target_ulong t2 = (target_ulong)puc; | |
256 | + /* jump PC: use T2 and the jump targets of the translation */ | |
257 | + if (t2) | |
258 | + env->npc = gen_opc_jump_pc[0]; | |
259 | + else | |
260 | + env->npc = gen_opc_jump_pc[1]; | |
261 | + } else { | |
262 | + env->npc = npc; | |
263 | + } | |
264 | + } | |
250 | 265 | #elif defined(TARGET_PPC) |
251 | 266 | { |
252 | 267 | int type; | ... | ... |