summaryrefslogtreecommitdiff
path: root/target-arm
diff options
context:
space:
mode:
authorKirill Batuzov <batuzovk@ispras.ru>2015-02-05 13:37:22 +0000
committerPeter Maydell <peter.maydell@linaro.org>2015-02-05 13:37:22 +0000
commit45140a57675ecb4b0daee71bf145c24dbdf9429c (patch)
tree2d53ceff6ba8454498c177d3ee38e910c285ac87 /target-arm
parenta8eb6e19991d1a7a6a7b04ac447548d30d75eb4a (diff)
downloadqemu-45140a57675ecb4b0daee71bf145c24dbdf9429c.tar.gz
target-arm: check that LSB <= MSB in BFI instruction
The documentation states that if LSB > MSB in BFI instruction behaviour is unpredictable. Currently QEMU crashes because of assertion failure in this case: tcg/tcg-op.h:2061: tcg_gen_deposit_i32: Assertion `len <= 32' failed. While assertion failure may meet the "unpredictable" definition this behaviour is undesirable because it allows an unprivileged guest program to crash the emulator with the OS and other programs. This patch addresses the issue by throwing illegal instruction exception if LSB > MSB. Only ARM decoder is affected because Thumb decoder already has this check in place. To reproduce issue run the following program int main(void) { asm volatile (".long 0x07c00c12" :: ); return 0; } compiled with gcc -marm -static badop_arm.c -o badop_arm Signed-off-by: Kirill Batuzov <batuzovk@ispras.ru> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'target-arm')
-rw-r--r--target-arm/translate.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/target-arm/translate.c b/target-arm/translate.c
index bdfcdf169c..2c1c2a7085 100644
--- a/target-arm/translate.c
+++ b/target-arm/translate.c
@@ -8739,6 +8739,10 @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
ARCH(6T2);
shift = (insn >> 7) & 0x1f;
i = (insn >> 16) & 0x1f;
+ if (i < shift) {
+ /* UNPREDICTABLE; we choose to UNDEF */
+ goto illegal_op;
+ }
i = i + 1 - shift;
if (rm == 15) {
tmp = tcg_temp_new_i32();