summaryrefslogtreecommitdiff
path: root/target-ppc
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2016-07-27 16:56:44 +1000
committerDavid Gibson <david@gibson.dropbear.id.au>2016-09-07 12:40:11 +1000
commitfbc3b39b3974bd6d3960376a1d4898adbbd47787 (patch)
tree0477cd0713bca587c1efd70bbe7f6de52ec18e6a /target-ppc
parentc9f82d013be0d8d9c5d9f51bb76e337a0a5a5cac (diff)
downloadqemu-fbc3b39b3974bd6d3960376a1d4898adbbd47787.tar.gz
ppc: Fix CFAR updates
We were one instruction off Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Diffstat (limited to 'target-ppc')
-rw-r--r--target-ppc/translate.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index ac2c79bf28..bc5b2ee97f 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -3346,7 +3346,7 @@ static void gen_b(DisasContext *ctx)
if (LK(ctx->opcode)) {
gen_setlr(ctx, ctx->nip);
}
- gen_update_cfar(ctx, ctx->nip);
+ gen_update_cfar(ctx, ctx->nip - 4);
gen_goto_tb(ctx, 0, target);
}
@@ -3411,7 +3411,7 @@ static inline void gen_bcond(DisasContext *ctx, int type)
}
tcg_temp_free_i32(temp);
}
- gen_update_cfar(ctx, ctx->nip);
+ gen_update_cfar(ctx, ctx->nip - 4);
if (type == BCOND_IM) {
target_ulong li = (target_long)((int16_t)(BD(ctx->opcode)));
if (likely(AA(ctx->opcode) == 0)) {
@@ -3526,7 +3526,7 @@ static void gen_rfi(DisasContext *ctx)
*/
/* Restore CPU state */
CHK_SV;
- gen_update_cfar(ctx, ctx->nip);
+ gen_update_cfar(ctx, ctx->nip - 4);
gen_helper_rfi(cpu_env);
gen_sync_exception(ctx);
#endif
@@ -3540,7 +3540,7 @@ static void gen_rfid(DisasContext *ctx)
#else
/* Restore CPU state */
CHK_SV;
- gen_update_cfar(ctx, ctx->nip);
+ gen_update_cfar(ctx, ctx->nip - 4);
gen_helper_rfid(cpu_env);
gen_sync_exception(ctx);
#endif