Commit 08e46e54ea498b7e9a2a415435844f21c17064fc

Authored by j_mayer
1 parent 95d1f3ed

PowerPC emulation bugfixes:

- don't generate multiple exit_tb at the end of conditional branches
- disable TRACE exception as it is not correct for embedded PowerPC.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2679 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 7 additions and 5 deletions
target-ppc/translate.c
@@ -2806,11 +2806,11 @@ static inline void gen_bcond(DisasContext *ctx, int type) @@ -2806,11 +2806,11 @@ static inline void gen_bcond(DisasContext *ctx, int type)
2806 #endif 2806 #endif
2807 gen_op_btest_T1(ctx->nip); 2807 gen_op_btest_T1(ctx->nip);
2808 gen_op_reset_T0(); 2808 gen_op_reset_T0();
2809 - }  
2810 no_test: 2809 no_test:
2811 - if (ctx->singlestep_enabled)  
2812 - gen_op_debug();  
2813 - gen_op_exit_tb(); 2810 + if (ctx->singlestep_enabled)
  2811 + gen_op_debug();
  2812 + gen_op_exit_tb();
  2813 + }
2814 ctx->exception = EXCP_BRANCH; 2814 ctx->exception = EXCP_BRANCH;
2815 } 2815 }
2816 2816
@@ -4725,7 +4725,7 @@ GEN_HANDLER(wrteei, 0x1F, 0x03, 0x05, 0x000EFC01, PPC_EMB_COMMON) @@ -4725,7 +4725,7 @@ GEN_HANDLER(wrteei, 0x1F, 0x03, 0x05, 0x000EFC01, PPC_EMB_COMMON)
4725 #endif 4725 #endif
4726 } 4726 }
4727 4727
4728 -/* PPC 440 specific instructions */ 4728 +/* PowerPC 440 specific instructions */
4729 /* dlmzb */ 4729 /* dlmzb */
4730 GEN_HANDLER(dlmzb, 0x1F, 0x0E, 0x02, 0x00000000, PPC_440_SPEC) 4730 GEN_HANDLER(dlmzb, 0x1F, 0x0E, 0x02, 0x00000000, PPC_440_SPEC)
4731 { 4731 {
@@ -5838,6 +5838,7 @@ static inline int gen_intermediate_code_internal (CPUState *env, @@ -5838,6 +5838,7 @@ static inline int gen_intermediate_code_internal (CPUState *env,
5838 handler->count++; 5838 handler->count++;
5839 #endif 5839 #endif
5840 /* Check trace mode exceptions */ 5840 /* Check trace mode exceptions */
  5841 +#if 0 // XXX: buggy on embedded PowerPC
5841 if (unlikely((msr_be && ctx.exception == EXCP_BRANCH) || 5842 if (unlikely((msr_be && ctx.exception == EXCP_BRANCH) ||
5842 /* Check in single step trace mode 5843 /* Check in single step trace mode
5843 * we need to stop except if: 5844 * we need to stop except if:
@@ -5852,6 +5853,7 @@ static inline int gen_intermediate_code_internal (CPUState *env, @@ -5852,6 +5853,7 @@ static inline int gen_intermediate_code_internal (CPUState *env,
5852 ctx.exception != EXCP_TRAP))) { 5853 ctx.exception != EXCP_TRAP))) {
5853 RET_EXCP(ctxp, EXCP_TRACE, 0); 5854 RET_EXCP(ctxp, EXCP_TRACE, 0);
5854 } 5855 }
  5856 +#endif
5855 /* if we reach a page boundary or are single stepping, stop 5857 /* if we reach a page boundary or are single stepping, stop
5856 * generation 5858 * generation
5857 */ 5859 */