ppc: Don't update NIP in dcbz and lscbx
Instead, pass GETPC() result to the corresponding helpers. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
573708e329
commit
b00a3b3648
@ -141,13 +141,14 @@ void helper_stsw(CPUPPCState *env, target_ulong addr, uint32_t nb,
|
||||
}
|
||||
}
|
||||
|
||||
static void do_dcbz(CPUPPCState *env, target_ulong addr, int dcache_line_size)
|
||||
static void do_dcbz(CPUPPCState *env, target_ulong addr, int dcache_line_size,
|
||||
uintptr_t raddr)
|
||||
{
|
||||
int i;
|
||||
|
||||
addr &= ~(dcache_line_size - 1);
|
||||
for (i = 0; i < dcache_line_size; i += 4) {
|
||||
cpu_stl_data(env, addr + i, 0);
|
||||
cpu_stl_data_ra(env, addr + i, 0, raddr);
|
||||
}
|
||||
if (env->reserve_addr == addr) {
|
||||
env->reserve_addr = (target_ulong)-1ULL;
|
||||
@ -168,7 +169,7 @@ void helper_dcbz(CPUPPCState *env, target_ulong addr, uint32_t is_dcbzl)
|
||||
|
||||
/* XXX add e500mc support */
|
||||
|
||||
do_dcbz(env, addr, dcbz_size);
|
||||
do_dcbz(env, addr, dcbz_size, GETPC());
|
||||
}
|
||||
|
||||
void helper_icbi(CPUPPCState *env, target_ulong addr)
|
||||
@ -190,7 +191,7 @@ target_ulong helper_lscbx(CPUPPCState *env, target_ulong addr, uint32_t reg,
|
||||
|
||||
d = 24;
|
||||
for (i = 0; i < xer_bc; i++) {
|
||||
c = cpu_ldub_data(env, addr);
|
||||
c = cpu_ldub_data_ra(env, addr, GETPC());
|
||||
addr = addr_add(env, addr, 1);
|
||||
/* ra (if not 0) and rb are never modified */
|
||||
if (likely(reg != rb && (ra == 0 || reg != ra))) {
|
||||
|
@ -4055,8 +4055,6 @@ static void gen_dcbz(DisasContext *ctx)
|
||||
int is_dcbzl = ctx->opcode & 0x00200000 ? 1 : 0;
|
||||
|
||||
gen_set_access_type(ctx, ACCESS_CACHE);
|
||||
/* NIP cannot be restored if the memory exception comes from an helper */
|
||||
gen_update_nip(ctx, ctx->nip - 4);
|
||||
tcgv_addr = tcg_temp_new();
|
||||
tcgv_is_dcbzl = tcg_const_i32(is_dcbzl);
|
||||
|
||||
@ -4584,8 +4582,6 @@ static void gen_lscbx(DisasContext *ctx)
|
||||
TCGv_i32 t3 = tcg_const_i32(rB(ctx->opcode));
|
||||
|
||||
gen_addr_reg_index(ctx, t0);
|
||||
/* NIP cannot be restored if the memory exception comes from an helper */
|
||||
gen_update_nip(ctx, ctx->nip - 4);
|
||||
gen_helper_lscbx(t0, cpu_env, t0, t1, t2, t3);
|
||||
tcg_temp_free_i32(t1);
|
||||
tcg_temp_free_i32(t2);
|
||||
|
Loading…
Reference in New Issue
Block a user