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;
|
int i;
|
||||||
|
|
||||||
addr &= ~(dcache_line_size - 1);
|
addr &= ~(dcache_line_size - 1);
|
||||||
for (i = 0; i < dcache_line_size; i += 4) {
|
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) {
|
if (env->reserve_addr == addr) {
|
||||||
env->reserve_addr = (target_ulong)-1ULL;
|
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 */
|
/* 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)
|
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;
|
d = 24;
|
||||||
for (i = 0; i < xer_bc; i++) {
|
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);
|
addr = addr_add(env, addr, 1);
|
||||||
/* ra (if not 0) and rb are never modified */
|
/* ra (if not 0) and rb are never modified */
|
||||||
if (likely(reg != rb && (ra == 0 || reg != ra))) {
|
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;
|
int is_dcbzl = ctx->opcode & 0x00200000 ? 1 : 0;
|
||||||
|
|
||||||
gen_set_access_type(ctx, ACCESS_CACHE);
|
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_addr = tcg_temp_new();
|
||||||
tcgv_is_dcbzl = tcg_const_i32(is_dcbzl);
|
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));
|
TCGv_i32 t3 = tcg_const_i32(rB(ctx->opcode));
|
||||||
|
|
||||||
gen_addr_reg_index(ctx, t0);
|
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);
|
gen_helper_lscbx(t0, cpu_env, t0, t1, t2, t3);
|
||||||
tcg_temp_free_i32(t1);
|
tcg_temp_free_i32(t1);
|
||||||
tcg_temp_free_i32(t2);
|
tcg_temp_free_i32(t2);
|
||||||
|
Loading…
Reference in New Issue
Block a user