Skip to content

Commit

Permalink
target/ppc: Add gen_exception_err_nip() function
Browse files Browse the repository at this point in the history
Add gen_exception_err_nip() that does the same as gen_exception_err()
but takes the nip as a parameter to allow specifying it instead of
using the current instruction address then change gen_exception_err()
to use it.

The gen_exception() and gen_exception_nip() functions are similar so
remove code duplication from those too while at it.

Suggested-by: Nicholas Piggin <npiggin@gmail.com>
Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
  • Loading branch information
zbalaton authored and npiggin committed Mar 12, 2024
1 parent ab45250 commit d54b82a
Showing 1 changed file with 15 additions and 13 deletions.
28 changes: 15 additions & 13 deletions target/ppc/translate.c
Original file line number Diff line number Diff line change
Expand Up @@ -296,33 +296,26 @@ static inline void gen_update_nip(DisasContext *ctx, target_ulong nip)
tcg_gen_movi_tl(cpu_nip, nip);
}

static void gen_exception_err(DisasContext *ctx, uint32_t excp, uint32_t error)
static void gen_exception_err_nip(DisasContext *ctx, uint32_t excp,
uint32_t error, target_ulong nip)
{
TCGv_i32 t0, t1;

/*
* These are all synchronous exceptions, we set the PC back to the
* faulting instruction
*/
gen_update_nip(ctx, ctx->cia);
gen_update_nip(ctx, nip);
t0 = tcg_constant_i32(excp);
t1 = tcg_constant_i32(error);
gen_helper_raise_exception_err(tcg_env, t0, t1);
ctx->base.is_jmp = DISAS_NORETURN;
}

static void gen_exception(DisasContext *ctx, uint32_t excp)
static inline void gen_exception_err(DisasContext *ctx, uint32_t excp,
uint32_t error)
{
TCGv_i32 t0;

/*
* These are all synchronous exceptions, we set the PC back to the
* faulting instruction
*/
gen_update_nip(ctx, ctx->cia);
t0 = tcg_constant_i32(excp);
gen_helper_raise_exception(tcg_env, t0);
ctx->base.is_jmp = DISAS_NORETURN;
gen_exception_err_nip(ctx, excp, error, ctx->cia);
}

static void gen_exception_nip(DisasContext *ctx, uint32_t excp,
Expand All @@ -336,6 +329,15 @@ static void gen_exception_nip(DisasContext *ctx, uint32_t excp,
ctx->base.is_jmp = DISAS_NORETURN;
}

static inline void gen_exception(DisasContext *ctx, uint32_t excp)
{
/*
* These are all synchronous exceptions, we set the PC back to the
* faulting instruction
*/
gen_exception_nip(ctx, excp, ctx->cia);
}

#if !defined(CONFIG_USER_ONLY)
static void gen_ppc_maybe_interrupt(DisasContext *ctx)
{
Expand Down

0 comments on commit d54b82a

Please sign in to comment.