From: Peter Maydell Date: Mon, 11 Apr 2011 15:26:22 +0000 (+0100) Subject: target-arm: Treat UNPREDICTABLE VTBL, VTBX case as UNDEF X-Git-Tag: v0.15.0-rc0~483 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=56907d776e1133bf4f633e4e542267d23d2c09cf;p=thirdparty%2Fqemu.git target-arm: Treat UNPREDICTABLE VTBL, VTBX case as UNDEF Catch the UNPREDICTABLE case for Neon VTBL,VTBX, and UNDEF it rather than allowing the helper function to index off the end of the register file. Signed-off-by: Peter Maydell Signed-off-by: Aurelien Jarno --- diff --git a/target-arm/translate.c b/target-arm/translate.c index b647c7bdde3..be25c8f33ae 100644 --- a/target-arm/translate.c +++ b/target-arm/translate.c @@ -6023,7 +6023,14 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) } } else if ((insn & (1 << 10)) == 0) { /* VTBL, VTBX. */ - int n = ((insn >> 5) & 0x18) + 8; + int n = ((insn >> 8) & 3) + 1; + if ((rn + n) > 32) { + /* This is UNPREDICTABLE; we choose to UNDEF to avoid the + * helper function running off the end of the register file. + */ + return 1; + } + n <<= 3; if (insn & (1 << 6)) { tmp = neon_load_reg(rd, 0); } else {