mirror of
https://github.com/qemu/qemu.git
synced 2024-11-27 22:03:35 +08:00
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
This commit is contained in:
parent
86bd2ca58a
commit
c3278b7bf0
@ -61,6 +61,7 @@ extern target_ulong gen_opc_pc[OPC_BUF_SIZE];
|
||||
extern target_ulong gen_opc_npc[OPC_BUF_SIZE];
|
||||
extern uint8_t gen_opc_cc_op[OPC_BUF_SIZE];
|
||||
extern uint8_t gen_opc_instr_start[OPC_BUF_SIZE];
|
||||
extern target_ulong gen_opc_jump_pc[2];
|
||||
|
||||
typedef void (GenOpFunc)(void);
|
||||
typedef void (GenOpFunc1)(long);
|
||||
|
@ -94,7 +94,7 @@ void tlb_fill(target_ulong addr, int is_write, int is_user, void *retaddr)
|
||||
if (tb) {
|
||||
/* the PC is inside the translated code. It means that we have
|
||||
a virtual CPU fault */
|
||||
cpu_restore_state(tb, env, pc, NULL);
|
||||
cpu_restore_state(tb, env, pc, (void *)T2);
|
||||
}
|
||||
}
|
||||
cpu_loop_exit();
|
||||
|
@ -1582,6 +1582,8 @@ static inline int gen_intermediate_code_internal(TranslationBlock * tb,
|
||||
page_dump(logfile);
|
||||
}
|
||||
#endif
|
||||
gen_opc_jump_pc[0] = dc->jump_pc[0];
|
||||
gen_opc_jump_pc[1] = dc->jump_pc[1];
|
||||
} else {
|
||||
tb->size = last_pc + 4 - pc_start;
|
||||
}
|
||||
|
@ -52,6 +52,7 @@ uint8_t gen_opc_instr_start[OPC_BUF_SIZE];
|
||||
uint8_t gen_opc_cc_op[OPC_BUF_SIZE];
|
||||
#elif defined(TARGET_SPARC)
|
||||
target_ulong gen_opc_npc[OPC_BUF_SIZE];
|
||||
target_ulong gen_opc_jump_pc[2];
|
||||
#endif
|
||||
|
||||
int code_copy_enabled = 1;
|
||||
@ -244,9 +245,23 @@ int cpu_restore_state(TranslationBlock *tb,
|
||||
#elif defined(TARGET_ARM)
|
||||
env->regs[15] = gen_opc_pc[j];
|
||||
#elif defined(TARGET_SPARC)
|
||||
/* XXX: restore npc too */
|
||||
env->pc = gen_opc_pc[j];
|
||||
env->npc = gen_opc_npc[j];
|
||||
{
|
||||
target_ulong npc;
|
||||
env->pc = gen_opc_pc[j];
|
||||
npc = gen_opc_npc[j];
|
||||
if (npc == 1) {
|
||||
/* dynamic NPC: already stored */
|
||||
} else if (npc == 2) {
|
||||
target_ulong t2 = (target_ulong)puc;
|
||||
/* jump PC: use T2 and the jump targets of the translation */
|
||||
if (t2)
|
||||
env->npc = gen_opc_jump_pc[0];
|
||||
else
|
||||
env->npc = gen_opc_jump_pc[1];
|
||||
} else {
|
||||
env->npc = npc;
|
||||
}
|
||||
}
|
||||
#elif defined(TARGET_PPC)
|
||||
{
|
||||
int type;
|
||||
|
Loading…
Reference in New Issue
Block a user