Message ID | 20190819213755.26175-29-richard.henderson@linaro.org |
---|---|
State | New |
Headers | show |
Series | target/arm: Convert aa32 base isa to decodetree | expand |
On Mon, 19 Aug 2019 at 22:38, Richard Henderson <richard.henderson@linaro.org> wrote: > > Prior to v7, for the A32 encoding, this operation wrote an UNKNOWN > value back to the base register. Starting in v7 this is UNPREDICTABLE. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > target/arm/translate.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/target/arm/translate.c b/target/arm/translate.c > index 4451adbb97..29e2eae441 100644 > --- a/target/arm/translate.c > +++ b/target/arm/translate.c > @@ -9880,6 +9880,14 @@ static bool do_ldm(DisasContext *s, arg_ldst_block *a) > > static bool trans_LDM_a32(DisasContext *s, arg_ldst_block *a) > { > + /* > + * Writeback register in register list is UNPREDICATABLE Typo: UNPREDICTABLE > + * for ArchVersion() >= 7. Prior to v7, A32 would write > + * an UNKNOWN value to the base register. > + */ > + if (ENABLE_ARCH_7 && a->w && (a->list & (1 << a->rn))) { > + return false; > + } > return do_ldm(s, a); > } Otherwise Reviewed-by: Peter Maydell <peter.maydell@linaro.org> thanks -- PMM
diff --git a/target/arm/translate.c b/target/arm/translate.c index 4451adbb97..29e2eae441 100644 --- a/target/arm/translate.c +++ b/target/arm/translate.c @@ -9880,6 +9880,14 @@ static bool do_ldm(DisasContext *s, arg_ldst_block *a) static bool trans_LDM_a32(DisasContext *s, arg_ldst_block *a) { + /* + * Writeback register in register list is UNPREDICATABLE + * for ArchVersion() >= 7. Prior to v7, A32 would write + * an UNKNOWN value to the base register. + */ + if (ENABLE_ARCH_7 && a->w && (a->list & (1 << a->rn))) { + return false; + } return do_ldm(s, a); }
Prior to v7, for the A32 encoding, this operation wrote an UNKNOWN value back to the base register. Starting in v7 this is UNPREDICTABLE. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- target/arm/translate.c | 8 ++++++++ 1 file changed, 8 insertions(+)