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,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;