mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-29 06:20:26 +00:00
target/arm: Diagnose base == pc for LDM/STM
We have been using store_reg and not store_reg_for_load when writing back a loaded value into the base register. At first glance this is incorrect when base == pc, however that case is UNPREDICTABLE. Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20190904193059.26202-32-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
4b222545db
commit
b0e382b8cf
@ -9863,7 +9863,7 @@ static bool op_stm(DisasContext *s, arg_ldst_block *a, int min_n)
|
||||
|
||||
list = a->list;
|
||||
n = ctpop16(list);
|
||||
if (n < min_n) {
|
||||
if (n < min_n || a->rn == 15) {
|
||||
unallocated_encoding(s);
|
||||
return true;
|
||||
}
|
||||
@ -9943,7 +9943,7 @@ static bool do_ldm(DisasContext *s, arg_ldst_block *a, int min_n)
|
||||
|
||||
list = a->list;
|
||||
n = ctpop16(list);
|
||||
if (n < min_n) {
|
||||
if (n < min_n || a->rn == 15) {
|
||||
unallocated_encoding(s);
|
||||
return true;
|
||||
}
|
||||
@ -9983,6 +9983,7 @@ static bool do_ldm(DisasContext *s, arg_ldst_block *a, int min_n)
|
||||
op_addr_block_post(s, a, addr, n);
|
||||
|
||||
if (loaded_base) {
|
||||
/* Note that we reject base == pc above. */
|
||||
store_reg(s, a->rn, loaded_var);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user