Commit c3278b7bf0be16b06f51aa82ffbf4807e608e7b1

Authored by bellard
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
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;
... ...