aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm
diff options
context:
space:
mode:
authorJon Medhurst <tixy@yxit.co.uk>2011-04-12 02:45:23 -0400
committerNicolas Pitre <nicolas.pitre@linaro.org>2011-04-28 23:40:58 -0400
commit780b5c1162286cc75ef2dcc0f14215d9f9f06230 (patch)
treecb3b50316acfbc79adde424f0c3d754a2cf1a6cd /arch/arm
parent0e384ed164bdc2ad832270e81dbd14a17c143e78 (diff)
ARM: kprobes: Reject probing of undefined media instructions
The instructions space for media instructions contains some undefined patterns. We need to reject probing of these because they may in future become defined and the kprobes code may then emulate them faultily. Signed-off-by: Jon Medhurst <tixy@yxit.co.uk> Signed-off-by: Nicolas Pitre <nicolas.pitre@linaro.org>
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/kernel/kprobes-decode.c36
1 files changed, 35 insertions, 1 deletions
diff --git a/arch/arm/kernel/kprobes-decode.c b/arch/arm/kernel/kprobes-decode.c
index b6bbc0b5ecd6..f0ca7f4bc4cb 100644
--- a/arch/arm/kernel/kprobes-decode.c
+++ b/arch/arm/kernel/kprobes-decode.c
@@ -1326,52 +1326,86 @@ space_cccc_0110__1(kprobe_opcode_t insn, struct arch_specific_insn *asi)
1326 (insn & 0x0ff00070) == 0x06f00030) 1326 (insn & 0x0ff00070) == 0x06f00030)
1327 return prep_emulate_rd12rm0(insn, asi); 1327 return prep_emulate_rd12rm0(insn, asi);
1328 1328
1329 /* ??? : cccc 0110 0000 xxxx xxxx xxxx xxx1 xxxx : */
1329 /* SADD16 : cccc 0110 0001 xxxx xxxx xxxx 0001 xxxx :GE */ 1330 /* SADD16 : cccc 0110 0001 xxxx xxxx xxxx 0001 xxxx :GE */
1330 /* SADDSUBX : cccc 0110 0001 xxxx xxxx xxxx 0011 xxxx :GE */ 1331 /* SADDSUBX : cccc 0110 0001 xxxx xxxx xxxx 0011 xxxx :GE */
1331 /* SSUBADDX : cccc 0110 0001 xxxx xxxx xxxx 0101 xxxx :GE */ 1332 /* SSUBADDX : cccc 0110 0001 xxxx xxxx xxxx 0101 xxxx :GE */
1332 /* SSUB16 : cccc 0110 0001 xxxx xxxx xxxx 0111 xxxx :GE */ 1333 /* SSUB16 : cccc 0110 0001 xxxx xxxx xxxx 0111 xxxx :GE */
1333 /* SADD8 : cccc 0110 0001 xxxx xxxx xxxx 1001 xxxx :GE */ 1334 /* SADD8 : cccc 0110 0001 xxxx xxxx xxxx 1001 xxxx :GE */
1335 /* ??? : cccc 0110 0001 xxxx xxxx xxxx 1011 xxxx : */
1336 /* ??? : cccc 0110 0001 xxxx xxxx xxxx 1101 xxxx : */
1334 /* SSUB8 : cccc 0110 0001 xxxx xxxx xxxx 1111 xxxx :GE */ 1337 /* SSUB8 : cccc 0110 0001 xxxx xxxx xxxx 1111 xxxx :GE */
1335 /* QADD16 : cccc 0110 0010 xxxx xxxx xxxx 0001 xxxx : */ 1338 /* QADD16 : cccc 0110 0010 xxxx xxxx xxxx 0001 xxxx : */
1336 /* QADDSUBX : cccc 0110 0010 xxxx xxxx xxxx 0011 xxxx : */ 1339 /* QADDSUBX : cccc 0110 0010 xxxx xxxx xxxx 0011 xxxx : */
1337 /* QSUBADDX : cccc 0110 0010 xxxx xxxx xxxx 0101 xxxx : */ 1340 /* QSUBADDX : cccc 0110 0010 xxxx xxxx xxxx 0101 xxxx : */
1338 /* QSUB16 : cccc 0110 0010 xxxx xxxx xxxx 0111 xxxx : */ 1341 /* QSUB16 : cccc 0110 0010 xxxx xxxx xxxx 0111 xxxx : */
1339 /* QADD8 : cccc 0110 0010 xxxx xxxx xxxx 1001 xxxx : */ 1342 /* QADD8 : cccc 0110 0010 xxxx xxxx xxxx 1001 xxxx : */
1343 /* ??? : cccc 0110 0010 xxxx xxxx xxxx 1011 xxxx : */
1344 /* ??? : cccc 0110 0010 xxxx xxxx xxxx 1101 xxxx : */
1340 /* QSUB8 : cccc 0110 0010 xxxx xxxx xxxx 1111 xxxx : */ 1345 /* QSUB8 : cccc 0110 0010 xxxx xxxx xxxx 1111 xxxx : */
1341 /* SHADD16 : cccc 0110 0011 xxxx xxxx xxxx 0001 xxxx : */ 1346 /* SHADD16 : cccc 0110 0011 xxxx xxxx xxxx 0001 xxxx : */
1342 /* SHADDSUBX : cccc 0110 0011 xxxx xxxx xxxx 0011 xxxx : */ 1347 /* SHADDSUBX : cccc 0110 0011 xxxx xxxx xxxx 0011 xxxx : */
1343 /* SHSUBADDX : cccc 0110 0011 xxxx xxxx xxxx 0101 xxxx : */ 1348 /* SHSUBADDX : cccc 0110 0011 xxxx xxxx xxxx 0101 xxxx : */
1344 /* SHSUB16 : cccc 0110 0011 xxxx xxxx xxxx 0111 xxxx : */ 1349 /* SHSUB16 : cccc 0110 0011 xxxx xxxx xxxx 0111 xxxx : */
1345 /* SHADD8 : cccc 0110 0011 xxxx xxxx xxxx 1001 xxxx : */ 1350 /* SHADD8 : cccc 0110 0011 xxxx xxxx xxxx 1001 xxxx : */
1351 /* ??? : cccc 0110 0011 xxxx xxxx xxxx 1011 xxxx : */
1352 /* ??? : cccc 0110 0011 xxxx xxxx xxxx 1101 xxxx : */
1346 /* SHSUB8 : cccc 0110 0011 xxxx xxxx xxxx 1111 xxxx : */ 1353 /* SHSUB8 : cccc 0110 0011 xxxx xxxx xxxx 1111 xxxx : */
1354 /* ??? : cccc 0110 0100 xxxx xxxx xxxx xxx1 xxxx : */
1347 /* UADD16 : cccc 0110 0101 xxxx xxxx xxxx 0001 xxxx :GE */ 1355 /* UADD16 : cccc 0110 0101 xxxx xxxx xxxx 0001 xxxx :GE */
1348 /* UADDSUBX : cccc 0110 0101 xxxx xxxx xxxx 0011 xxxx :GE */ 1356 /* UADDSUBX : cccc 0110 0101 xxxx xxxx xxxx 0011 xxxx :GE */
1349 /* USUBADDX : cccc 0110 0101 xxxx xxxx xxxx 0101 xxxx :GE */ 1357 /* USUBADDX : cccc 0110 0101 xxxx xxxx xxxx 0101 xxxx :GE */
1350 /* USUB16 : cccc 0110 0101 xxxx xxxx xxxx 0111 xxxx :GE */ 1358 /* USUB16 : cccc 0110 0101 xxxx xxxx xxxx 0111 xxxx :GE */
1351 /* UADD8 : cccc 0110 0101 xxxx xxxx xxxx 1001 xxxx :GE */ 1359 /* UADD8 : cccc 0110 0101 xxxx xxxx xxxx 1001 xxxx :GE */
1360 /* ??? : cccc 0110 0101 xxxx xxxx xxxx 1011 xxxx : */
1361 /* ??? : cccc 0110 0101 xxxx xxxx xxxx 1101 xxxx : */
1352 /* USUB8 : cccc 0110 0101 xxxx xxxx xxxx 1111 xxxx :GE */ 1362 /* USUB8 : cccc 0110 0101 xxxx xxxx xxxx 1111 xxxx :GE */
1353 /* UQADD16 : cccc 0110 0110 xxxx xxxx xxxx 0001 xxxx : */ 1363 /* UQADD16 : cccc 0110 0110 xxxx xxxx xxxx 0001 xxxx : */
1354 /* UQADDSUBX : cccc 0110 0110 xxxx xxxx xxxx 0011 xxxx : */ 1364 /* UQADDSUBX : cccc 0110 0110 xxxx xxxx xxxx 0011 xxxx : */
1355 /* UQSUBADDX : cccc 0110 0110 xxxx xxxx xxxx 0101 xxxx : */ 1365 /* UQSUBADDX : cccc 0110 0110 xxxx xxxx xxxx 0101 xxxx : */
1356 /* UQSUB16 : cccc 0110 0110 xxxx xxxx xxxx 0111 xxxx : */ 1366 /* UQSUB16 : cccc 0110 0110 xxxx xxxx xxxx 0111 xxxx : */
1357 /* UQADD8 : cccc 0110 0110 xxxx xxxx xxxx 1001 xxxx : */ 1367 /* UQADD8 : cccc 0110 0110 xxxx xxxx xxxx 1001 xxxx : */
1368 /* ??? : cccc 0110 0110 xxxx xxxx xxxx 1011 xxxx : */
1369 /* ??? : cccc 0110 0110 xxxx xxxx xxxx 1101 xxxx : */
1358 /* UQSUB8 : cccc 0110 0110 xxxx xxxx xxxx 1111 xxxx : */ 1370 /* UQSUB8 : cccc 0110 0110 xxxx xxxx xxxx 1111 xxxx : */
1359 /* UHADD16 : cccc 0110 0111 xxxx xxxx xxxx 0001 xxxx : */ 1371 /* UHADD16 : cccc 0110 0111 xxxx xxxx xxxx 0001 xxxx : */
1360 /* UHADDSUBX : cccc 0110 0111 xxxx xxxx xxxx 0011 xxxx : */ 1372 /* UHADDSUBX : cccc 0110 0111 xxxx xxxx xxxx 0011 xxxx : */
1361 /* UHSUBADDX : cccc 0110 0111 xxxx xxxx xxxx 0101 xxxx : */ 1373 /* UHSUBADDX : cccc 0110 0111 xxxx xxxx xxxx 0101 xxxx : */
1362 /* UHSUB16 : cccc 0110 0111 xxxx xxxx xxxx 0111 xxxx : */ 1374 /* UHSUB16 : cccc 0110 0111 xxxx xxxx xxxx 0111 xxxx : */
1363 /* UHADD8 : cccc 0110 0111 xxxx xxxx xxxx 1001 xxxx : */ 1375 /* UHADD8 : cccc 0110 0111 xxxx xxxx xxxx 1001 xxxx : */
1376 /* ??? : cccc 0110 0111 xxxx xxxx xxxx 1011 xxxx : */
1377 /* ??? : cccc 0110 0111 xxxx xxxx xxxx 1101 xxxx : */
1364 /* UHSUB8 : cccc 0110 0111 xxxx xxxx xxxx 1111 xxxx : */ 1378 /* UHSUB8 : cccc 0110 0111 xxxx xxxx xxxx 1111 xxxx : */
1379 if ((insn & 0x0f800010) == 0x06000010) {
1380 if ((insn & 0x00300000) == 0x00000000 ||
1381 (insn & 0x000000e0) == 0x000000a0 ||
1382 (insn & 0x000000e0) == 0x000000c0)
1383 return INSN_REJECTED; /* Unallocated space */
1384 return prep_emulate_rd12rn16rm0_wflags(insn, asi);
1385 }
1386
1365 /* PKHBT : cccc 0110 1000 xxxx xxxx xxxx x001 xxxx : */ 1387 /* PKHBT : cccc 0110 1000 xxxx xxxx xxxx x001 xxxx : */
1366 /* PKHTB : cccc 0110 1000 xxxx xxxx xxxx x101 xxxx : */ 1388 /* PKHTB : cccc 0110 1000 xxxx xxxx xxxx x101 xxxx : */
1389 if ((insn & 0x0ff00030) == 0x06800010)
1390 return prep_emulate_rd12rn16rm0_wflags(insn, asi);
1391
1367 /* SXTAB16 : cccc 0110 1000 xxxx xxxx xxxx 0111 xxxx : */ 1392 /* SXTAB16 : cccc 0110 1000 xxxx xxxx xxxx 0111 xxxx : */
1368 /* SXTB : cccc 0110 1010 xxxx xxxx xxxx 0111 xxxx : */ 1393 /* SXTB : cccc 0110 1010 xxxx xxxx xxxx 0111 xxxx : */
1394 /* ??? : cccc 0110 1001 xxxx xxxx xxxx 0111 xxxx : */
1369 /* SXTAB : cccc 0110 1010 xxxx xxxx xxxx 0111 xxxx : */ 1395 /* SXTAB : cccc 0110 1010 xxxx xxxx xxxx 0111 xxxx : */
1370 /* SXTAH : cccc 0110 1011 xxxx xxxx xxxx 0111 xxxx : */ 1396 /* SXTAH : cccc 0110 1011 xxxx xxxx xxxx 0111 xxxx : */
1371 /* UXTAB16 : cccc 0110 1100 xxxx xxxx xxxx 0111 xxxx : */ 1397 /* UXTAB16 : cccc 0110 1100 xxxx xxxx xxxx 0111 xxxx : */
1398 /* ??? : cccc 0110 1101 xxxx xxxx xxxx 0111 xxxx : */
1372 /* UXTAB : cccc 0110 1110 xxxx xxxx xxxx 0111 xxxx : */ 1399 /* UXTAB : cccc 0110 1110 xxxx xxxx xxxx 0111 xxxx : */
1373 /* UXTAH : cccc 0110 1111 xxxx xxxx xxxx 0111 xxxx : */ 1400 /* UXTAH : cccc 0110 1111 xxxx xxxx xxxx 0111 xxxx : */
1374 return prep_emulate_rd12rn16rm0_wflags(insn, asi); 1401 if ((insn & 0x0f8000f0) == 0x06800070) {
1402 if ((insn & 0x00300000) == 0x00100000)
1403 return INSN_REJECTED; /* Unallocated space */
1404 return prep_emulate_rd12rn16rm0_wflags(insn, asi);
1405 }
1406
1407 /* Other instruction encodings aren't yet defined */
1408 return INSN_REJECTED;
1375} 1409}
1376 1410
1377static enum kprobe_insn __kprobes 1411static enum kprobe_insn __kprobes