Message ID | 155327783157.1283071.3747129891004927299.stgit@bahia.lan (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | target/ppc: Fix pseries.cap-ibs=workaround with TCG | expand |
On Fri, 2019-03-22 at 19:03 +0100, Greg Kurz wrote: > We use PPC_SEGMENT_64B in various places to guard code that is > specific > to 64-bit server processors compliant with arch 2.x. Consolidate the > logic in a helper macro with an explicit name. Tested-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com> > > Signed-off-by: Greg Kurz <groug@kaod.org> > --- > hw/ppc/ppc.c | 2 +- > target/ppc/cpu.h | 6 ++++++ > target/ppc/helper_regs.h | 2 +- > target/ppc/translate.c | 10 ++++------ > 4 files changed, 12 insertions(+), 8 deletions(-) > > diff --git a/hw/ppc/ppc.c b/hw/ppc/ppc.c > index 49d57469fb34..ad20584f268d 100644 > --- a/hw/ppc/ppc.c > +++ b/hw/ppc/ppc.c > @@ -1101,7 +1101,7 @@ clk_setup_cb cpu_ppc_tb_init (CPUPPCState *env, > uint32_t freq) > tb_env = g_malloc0(sizeof(ppc_tb_t)); > env->tb_env = tb_env; > tb_env->flags = PPC_DECR_UNDERFLOW_TRIGGERED; > - if (env->insns_flags & PPC_SEGMENT_64B) { > + if (is_book3s_arch2x(env)) { > /* All Book3S 64bit CPUs implement level based DEC logic */ > tb_env->flags |= PPC_DECR_UNDERFLOW_LEVEL; > } > diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h > index fc12b4688e8c..070717758452 100644 > --- a/target/ppc/cpu.h > +++ b/target/ppc/cpu.h > @@ -2409,6 +2409,12 @@ enum { > target_ulong cpu_read_xer(CPUPPCState *env); > void cpu_write_xer(CPUPPCState *env, target_ulong xer); > > +/* > + * All 64-bit server processors compliant with arch 2.x, ie. 970 and > newer, > + * have PPC_SEGMENT_64B. > + */ > +#define is_book3s_arch2x(ctx) (!!((ctx)->insns_flags & > PPC_SEGMENT_64B)) > + > static inline void cpu_get_tb_cpu_state(CPUPPCState *env, > target_ulong *pc, > target_ulong *cs_base, > uint32_t *flags) > { > diff --git a/target/ppc/helper_regs.h b/target/ppc/helper_regs.h > index a2205e1044c9..c863abc0bfc3 100644 > --- a/target/ppc/helper_regs.h > +++ b/target/ppc/helper_regs.h > @@ -152,7 +152,7 @@ static inline int hreg_store_msr(CPUPPCState > *env, target_ulong value, > * - 64-bit embedded implementations do not need any operation > to be > * performed when PR is set. > */ > - if ((env->insns_flags & PPC_SEGMENT_64B) && ((value >> MSR_PR) & > 1)) { > + if (is_book3s_arch2x(env) && ((value >> MSR_PR) & 1)) { > value |= (1 << MSR_EE) | (1 << MSR_DR) | (1 << MSR_IR); > } > #endif > diff --git a/target/ppc/translate.c b/target/ppc/translate.c > index d3aaa6482c6a..576210d901ad 100644 > --- a/target/ppc/translate.c > +++ b/target/ppc/translate.c > @@ -3755,7 +3755,7 @@ static void gen_bcond(DisasContext *ctx, int > type) > * arch 2.x, do implement a "test and decrement" logic > instead, > * as described in their respective UMs. > */ > - if (unlikely(!(ctx->insns_flags & PPC_SEGMENT_64B))) { > + if (unlikely(!is_book3s_arch2x(ctx))) { > gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL); > tcg_temp_free(temp); > tcg_temp_free(target); > @@ -3913,7 +3913,7 @@ static void gen_rfi(DisasContext *ctx) > /* This instruction doesn't exist anymore on 64-bit server > * processors compliant with arch 2.x > */ > - if (ctx->insns_flags & PPC_SEGMENT_64B) { > + if (is_book3s_arch2x(ctx)) { > gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL); > return; > } > @@ -6535,8 +6535,7 @@ static void gen_msgclr(DisasContext *ctx) > GEN_PRIV; > #else > CHK_HV; > - /* 64-bit server processors compliant with arch 2.x */ > - if (ctx->insns_flags & PPC_SEGMENT_64B) { > + if (is_book3s_arch2x(ctx)) { > gen_helper_book3s_msgclr(cpu_env, cpu_gpr[rB(ctx->opcode)]); > } else { > gen_helper_msgclr(cpu_env, cpu_gpr[rB(ctx->opcode)]); > @@ -6550,8 +6549,7 @@ static void gen_msgsnd(DisasContext *ctx) > GEN_PRIV; > #else > CHK_HV; > - /* 64-bit server processors compliant with arch 2.x */ > - if (ctx->insns_flags & PPC_SEGMENT_64B) { > + if (is_book3s_arch2x(ctx)) { > gen_helper_book3s_msgsnd(cpu_gpr[rB(ctx->opcode)]); > } else { > gen_helper_msgsnd(cpu_gpr[rB(ctx->opcode)]); > >
On Fri, Mar 22, 2019 at 07:03:51PM +0100, Greg Kurz wrote: > We use PPC_SEGMENT_64B in various places to guard code that is specific > to 64-bit server processors compliant with arch 2.x. Consolidate the > logic in a helper macro with an explicit name. > > Signed-off-by: Greg Kurz <groug@kaod.org> This mitigates my concern about re-using the PPC_SEGMENT_64B bit discussed in reply to the previous patch, since it leaves only one place to fix instead of a bunch. > --- > hw/ppc/ppc.c | 2 +- > target/ppc/cpu.h | 6 ++++++ > target/ppc/helper_regs.h | 2 +- > target/ppc/translate.c | 10 ++++------ > 4 files changed, 12 insertions(+), 8 deletions(-) > > diff --git a/hw/ppc/ppc.c b/hw/ppc/ppc.c > index 49d57469fb34..ad20584f268d 100644 > --- a/hw/ppc/ppc.c > +++ b/hw/ppc/ppc.c > @@ -1101,7 +1101,7 @@ clk_setup_cb cpu_ppc_tb_init (CPUPPCState *env, uint32_t freq) > tb_env = g_malloc0(sizeof(ppc_tb_t)); > env->tb_env = tb_env; > tb_env->flags = PPC_DECR_UNDERFLOW_TRIGGERED; > - if (env->insns_flags & PPC_SEGMENT_64B) { > + if (is_book3s_arch2x(env)) { > /* All Book3S 64bit CPUs implement level based DEC logic */ > tb_env->flags |= PPC_DECR_UNDERFLOW_LEVEL; > } > diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h > index fc12b4688e8c..070717758452 100644 > --- a/target/ppc/cpu.h > +++ b/target/ppc/cpu.h > @@ -2409,6 +2409,12 @@ enum { > target_ulong cpu_read_xer(CPUPPCState *env); > void cpu_write_xer(CPUPPCState *env, target_ulong xer); > > +/* > + * All 64-bit server processors compliant with arch 2.x, ie. 970 and newer, > + * have PPC_SEGMENT_64B. > + */ > +#define is_book3s_arch2x(ctx) (!!((ctx)->insns_flags & PPC_SEGMENT_64B)) > + > static inline void cpu_get_tb_cpu_state(CPUPPCState *env, target_ulong *pc, > target_ulong *cs_base, uint32_t *flags) > { > diff --git a/target/ppc/helper_regs.h b/target/ppc/helper_regs.h > index a2205e1044c9..c863abc0bfc3 100644 > --- a/target/ppc/helper_regs.h > +++ b/target/ppc/helper_regs.h > @@ -152,7 +152,7 @@ static inline int hreg_store_msr(CPUPPCState *env, target_ulong value, > * - 64-bit embedded implementations do not need any operation to be > * performed when PR is set. > */ > - if ((env->insns_flags & PPC_SEGMENT_64B) && ((value >> MSR_PR) & 1)) { > + if (is_book3s_arch2x(env) && ((value >> MSR_PR) & 1)) { > value |= (1 << MSR_EE) | (1 << MSR_DR) | (1 << MSR_IR); > } > #endif > diff --git a/target/ppc/translate.c b/target/ppc/translate.c > index d3aaa6482c6a..576210d901ad 100644 > --- a/target/ppc/translate.c > +++ b/target/ppc/translate.c > @@ -3755,7 +3755,7 @@ static void gen_bcond(DisasContext *ctx, int type) > * arch 2.x, do implement a "test and decrement" logic instead, > * as described in their respective UMs. > */ > - if (unlikely(!(ctx->insns_flags & PPC_SEGMENT_64B))) { > + if (unlikely(!is_book3s_arch2x(ctx))) { > gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL); > tcg_temp_free(temp); > tcg_temp_free(target); > @@ -3913,7 +3913,7 @@ static void gen_rfi(DisasContext *ctx) > /* This instruction doesn't exist anymore on 64-bit server > * processors compliant with arch 2.x > */ > - if (ctx->insns_flags & PPC_SEGMENT_64B) { > + if (is_book3s_arch2x(ctx)) { > gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL); > return; > } > @@ -6535,8 +6535,7 @@ static void gen_msgclr(DisasContext *ctx) > GEN_PRIV; > #else > CHK_HV; > - /* 64-bit server processors compliant with arch 2.x */ > - if (ctx->insns_flags & PPC_SEGMENT_64B) { > + if (is_book3s_arch2x(ctx)) { > gen_helper_book3s_msgclr(cpu_env, cpu_gpr[rB(ctx->opcode)]); > } else { > gen_helper_msgclr(cpu_env, cpu_gpr[rB(ctx->opcode)]); > @@ -6550,8 +6549,7 @@ static void gen_msgsnd(DisasContext *ctx) > GEN_PRIV; > #else > CHK_HV; > - /* 64-bit server processors compliant with arch 2.x */ > - if (ctx->insns_flags & PPC_SEGMENT_64B) { > + if (is_book3s_arch2x(ctx)) { > gen_helper_book3s_msgsnd(cpu_gpr[rB(ctx->opcode)]); > } else { > gen_helper_msgsnd(cpu_gpr[rB(ctx->opcode)]); >
diff --git a/hw/ppc/ppc.c b/hw/ppc/ppc.c index 49d57469fb34..ad20584f268d 100644 --- a/hw/ppc/ppc.c +++ b/hw/ppc/ppc.c @@ -1101,7 +1101,7 @@ clk_setup_cb cpu_ppc_tb_init (CPUPPCState *env, uint32_t freq) tb_env = g_malloc0(sizeof(ppc_tb_t)); env->tb_env = tb_env; tb_env->flags = PPC_DECR_UNDERFLOW_TRIGGERED; - if (env->insns_flags & PPC_SEGMENT_64B) { + if (is_book3s_arch2x(env)) { /* All Book3S 64bit CPUs implement level based DEC logic */ tb_env->flags |= PPC_DECR_UNDERFLOW_LEVEL; } diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h index fc12b4688e8c..070717758452 100644 --- a/target/ppc/cpu.h +++ b/target/ppc/cpu.h @@ -2409,6 +2409,12 @@ enum { target_ulong cpu_read_xer(CPUPPCState *env); void cpu_write_xer(CPUPPCState *env, target_ulong xer); +/* + * All 64-bit server processors compliant with arch 2.x, ie. 970 and newer, + * have PPC_SEGMENT_64B. + */ +#define is_book3s_arch2x(ctx) (!!((ctx)->insns_flags & PPC_SEGMENT_64B)) + static inline void cpu_get_tb_cpu_state(CPUPPCState *env, target_ulong *pc, target_ulong *cs_base, uint32_t *flags) { diff --git a/target/ppc/helper_regs.h b/target/ppc/helper_regs.h index a2205e1044c9..c863abc0bfc3 100644 --- a/target/ppc/helper_regs.h +++ b/target/ppc/helper_regs.h @@ -152,7 +152,7 @@ static inline int hreg_store_msr(CPUPPCState *env, target_ulong value, * - 64-bit embedded implementations do not need any operation to be * performed when PR is set. */ - if ((env->insns_flags & PPC_SEGMENT_64B) && ((value >> MSR_PR) & 1)) { + if (is_book3s_arch2x(env) && ((value >> MSR_PR) & 1)) { value |= (1 << MSR_EE) | (1 << MSR_DR) | (1 << MSR_IR); } #endif diff --git a/target/ppc/translate.c b/target/ppc/translate.c index d3aaa6482c6a..576210d901ad 100644 --- a/target/ppc/translate.c +++ b/target/ppc/translate.c @@ -3755,7 +3755,7 @@ static void gen_bcond(DisasContext *ctx, int type) * arch 2.x, do implement a "test and decrement" logic instead, * as described in their respective UMs. */ - if (unlikely(!(ctx->insns_flags & PPC_SEGMENT_64B))) { + if (unlikely(!is_book3s_arch2x(ctx))) { gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL); tcg_temp_free(temp); tcg_temp_free(target); @@ -3913,7 +3913,7 @@ static void gen_rfi(DisasContext *ctx) /* This instruction doesn't exist anymore on 64-bit server * processors compliant with arch 2.x */ - if (ctx->insns_flags & PPC_SEGMENT_64B) { + if (is_book3s_arch2x(ctx)) { gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL); return; } @@ -6535,8 +6535,7 @@ static void gen_msgclr(DisasContext *ctx) GEN_PRIV; #else CHK_HV; - /* 64-bit server processors compliant with arch 2.x */ - if (ctx->insns_flags & PPC_SEGMENT_64B) { + if (is_book3s_arch2x(ctx)) { gen_helper_book3s_msgclr(cpu_env, cpu_gpr[rB(ctx->opcode)]); } else { gen_helper_msgclr(cpu_env, cpu_gpr[rB(ctx->opcode)]); @@ -6550,8 +6549,7 @@ static void gen_msgsnd(DisasContext *ctx) GEN_PRIV; #else CHK_HV; - /* 64-bit server processors compliant with arch 2.x */ - if (ctx->insns_flags & PPC_SEGMENT_64B) { + if (is_book3s_arch2x(ctx)) { gen_helper_book3s_msgsnd(cpu_gpr[rB(ctx->opcode)]); } else { gen_helper_msgsnd(cpu_gpr[rB(ctx->opcode)]);
We use PPC_SEGMENT_64B in various places to guard code that is specific to 64-bit server processors compliant with arch 2.x. Consolidate the logic in a helper macro with an explicit name. Signed-off-by: Greg Kurz <groug@kaod.org> --- hw/ppc/ppc.c | 2 +- target/ppc/cpu.h | 6 ++++++ target/ppc/helper_regs.h | 2 +- target/ppc/translate.c | 10 ++++------ 4 files changed, 12 insertions(+), 8 deletions(-)