On 3/23/25 10:37, Richard Henderson wrote:
> Do not unconditionally attempt to read 4 bytes, as there
> may only be 2 bytes remaining in the translator cache.
>
> Cc: qemu-stable@nongnu.org
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> target/avr/disas.c | 21 ++++++++++++++-------
> 1 file changed, 14 insertions(+), 7 deletions(-)
>
> diff --git a/target/avr/disas.c b/target/avr/disas.c
> index b7689e8d7c..d341030174 100644
> --- a/target/avr/disas.c
> +++ b/target/avr/disas.c
> @@ -68,28 +68,35 @@ static bool decode_insn(DisasContext *ctx, uint16_t insn);
>
> int avr_print_insn(bfd_vma addr, disassemble_info *info)
> {
> - DisasContext ctx;
> + DisasContext ctx = { info };
> DisasContext *pctx = &ctx;
> bfd_byte buffer[4];
> uint16_t insn;
> int status;
>
> - ctx.info = info;
> -
> - status = info->read_memory_func(addr, buffer, 4, info);
> + status = info->read_memory_func(addr, buffer, 2, info);
> if (status != 0) {
> info->memory_error_func(status, addr, info);
> return -1;
> }
> insn = bfd_getl16(buffer);
> - ctx.next_word = bfd_getl16(buffer + 2);
> - ctx.next_word_used = false;
> +
> + status = info->read_memory_func(addr + 2, buffer + 2, 2, info);
> + if (status == 0) {
> + ctx.next_word = bfd_getl16(buffer + 2);
> + }
>
> if (!decode_insn(&ctx, insn)) {
> output(".db", "0x%02x, 0x%02x", buffer[0], buffer[1]);
> }
>
> - return ctx.next_word_used ? 4 : 2;
> + if (!ctx.next_word_used) {
> + return 2;
> + } else if (status == 0) {
> + return 4;
> + }
> + info->memory_error_func(status, addr + 2, info);
> + return -1;
> }
>
>
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>