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,6 +61,7 @@ extern target_ulong gen_opc_pc[OPC_BUF_SIZE]; | ||
| 61 | extern target_ulong gen_opc_npc[OPC_BUF_SIZE]; | 61 | extern target_ulong gen_opc_npc[OPC_BUF_SIZE]; |
| 62 | extern uint8_t gen_opc_cc_op[OPC_BUF_SIZE]; | 62 | extern uint8_t gen_opc_cc_op[OPC_BUF_SIZE]; |
| 63 | extern uint8_t gen_opc_instr_start[OPC_BUF_SIZE]; | 63 | extern uint8_t gen_opc_instr_start[OPC_BUF_SIZE]; |
| 64 | +extern target_ulong gen_opc_jump_pc[2]; | ||
| 64 | 65 | ||
| 65 | typedef void (GenOpFunc)(void); | 66 | typedef void (GenOpFunc)(void); |
| 66 | typedef void (GenOpFunc1)(long); | 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,7 +94,7 @@ void tlb_fill(target_ulong addr, int is_write, int is_user, void *retaddr) | ||
| 94 | if (tb) { | 94 | if (tb) { |
| 95 | /* the PC is inside the translated code. It means that we have | 95 | /* the PC is inside the translated code. It means that we have |
| 96 | a virtual CPU fault */ | 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 | cpu_loop_exit(); | 100 | cpu_loop_exit(); |
target-sparc/translate.c
| @@ -1582,6 +1582,8 @@ static inline int gen_intermediate_code_internal(TranslationBlock * tb, | @@ -1582,6 +1582,8 @@ static inline int gen_intermediate_code_internal(TranslationBlock * tb, | ||
| 1582 | page_dump(logfile); | 1582 | page_dump(logfile); |
| 1583 | } | 1583 | } |
| 1584 | #endif | 1584 | #endif |
| 1585 | + gen_opc_jump_pc[0] = dc->jump_pc[0]; | ||
| 1586 | + gen_opc_jump_pc[1] = dc->jump_pc[1]; | ||
| 1585 | } else { | 1587 | } else { |
| 1586 | tb->size = last_pc + 4 - pc_start; | 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,6 +52,7 @@ uint8_t gen_opc_instr_start[OPC_BUF_SIZE]; | ||
| 52 | uint8_t gen_opc_cc_op[OPC_BUF_SIZE]; | 52 | uint8_t gen_opc_cc_op[OPC_BUF_SIZE]; |
| 53 | #elif defined(TARGET_SPARC) | 53 | #elif defined(TARGET_SPARC) |
| 54 | target_ulong gen_opc_npc[OPC_BUF_SIZE]; | 54 | target_ulong gen_opc_npc[OPC_BUF_SIZE]; |
| 55 | +target_ulong gen_opc_jump_pc[2]; | ||
| 55 | #endif | 56 | #endif |
| 56 | 57 | ||
| 57 | int code_copy_enabled = 1; | 58 | int code_copy_enabled = 1; |
| @@ -244,9 +245,23 @@ int cpu_restore_state(TranslationBlock *tb, | @@ -244,9 +245,23 @@ int cpu_restore_state(TranslationBlock *tb, | ||
| 244 | #elif defined(TARGET_ARM) | 245 | #elif defined(TARGET_ARM) |
| 245 | env->regs[15] = gen_opc_pc[j]; | 246 | env->regs[15] = gen_opc_pc[j]; |
| 246 | #elif defined(TARGET_SPARC) | 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 | #elif defined(TARGET_PPC) | 265 | #elif defined(TARGET_PPC) |
| 251 | { | 266 | { |
| 252 | int type; | 267 | int type; |