target/arm: Pass in pc to thumb_insn_is_16bit

This function is used in two different contexts, and it will be
clearer if the function is given the address to which it applies.

Backports commit 331b1ca616cb708db30dab68e3262d286e687f24 from qemu
This commit is contained in:
Richard Henderson 2019-11-18 16:52:25 -05:00 committed by Lioncash
parent c61e22627d
commit 1aa3c685a8
No known key found for this signature in database
GPG key ID: 4E3C3CC1031BA9C7

View file

@ -9423,11 +9423,11 @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
}
}
static bool thumb_insn_is_16bit(DisasContext *s, uint32_t insn)
static bool thumb_insn_is_16bit(DisasContext *s, uint32_t pc, uint32_t insn)
{
/* Return true if this is a 16 bit instruction. We must be precise
* about this (matching the decode). We assume that s->pc still
* points to the first 16 bits of the insn.
/*
* Return true if this is a 16 bit instruction. We must be precise
* about this (matching the decode).
*/
if ((insn >> 11) < 0x1d) {
/* Definitely a 16-bit instruction */
@ -9447,7 +9447,7 @@ static bool thumb_insn_is_16bit(DisasContext *s, uint32_t insn)
return false;
}
if ((insn >> 11) == 0x1e && s->pc - s->page_start < TARGET_PAGE_SIZE - 3) {
if ((insn >> 11) == 0x1e && pc - s->page_start < TARGET_PAGE_SIZE - 3) {
/* 0b1111_0xxx_xxxx_xxxx : BL/BLX prefix, and the suffix
* is not on the next page; we merge this into a 32-bit
* insn.
@ -11989,7 +11989,7 @@ static bool insn_crosses_page(CPUARMState *env, DisasContext *s)
*/
uint16_t insn = arm_lduw_code(env, s->pc, s->sctlr_b);
return !thumb_insn_is_16bit(s, insn);
return !thumb_insn_is_16bit(s, s->pc, insn);
}
static void arm_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
@ -12302,7 +12302,7 @@ static void thumb_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
}
insn = arm_lduw_code(env, dc->pc, dc->sctlr_b);
is_16bit = thumb_insn_is_16bit(dc, insn);
is_16bit = thumb_insn_is_16bit(dc, dc->pc, insn);
dc->pc += 2;
if (!is_16bit) {
uint32_t insn2 = arm_lduw_code(env, dc->pc, dc->sctlr_b);