aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel/kprobes-arm.c
diff options
context:
space:
mode:
authorJon Medhurst <tixy@yxit.co.uk>2011-06-08 12:36:45 -0400
committerTixy <tixy@medhuaa1.miniserver.com>2011-07-13 13:32:49 -0400
commit2ce5d03307222b3d5b7c5e9849eb4857eb979fa9 (patch)
tree53216c7d9196d9241ffdf46ef62ee922ab0ced3a /arch/arm/kernel/kprobes-arm.c
parent0e44e9a0fae65c07fa5a23bd720b6108892c96f8 (diff)
ARM: kprobes: Migrate ARM space_cccc_0110__1 to decoding tables
Signed-off-by: Jon Medhurst <tixy@yxit.co.uk> Acked-by: Nicolas Pitre <nicolas.pitre@linaro.org>
Diffstat (limited to 'arch/arm/kernel/kprobes-arm.c')
-rw-r--r--arch/arm/kernel/kprobes-arm.c217
1 files changed, 91 insertions, 126 deletions
diff --git a/arch/arm/kernel/kprobes-arm.c b/arch/arm/kernel/kprobes-arm.c
index eb11a56683b6..62035057846a 100644
--- a/arch/arm/kernel/kprobes-arm.c
+++ b/arch/arm/kernel/kprobes-arm.c
@@ -1281,132 +1281,97 @@ static const union decode_item arm_cccc_001x_table[] = {
1281 DECODE_END 1281 DECODE_END
1282}; 1282};
1283 1283
1284static enum kprobe_insn __kprobes 1284static const union decode_item arm_cccc_0110_____xxx1_table[] = {
1285space_cccc_0110__1(kprobe_opcode_t insn, struct arch_specific_insn *asi) 1285 /* Media instructions */
1286{ 1286
1287 /* SEL : cccc 0110 1000 xxxx xxxx xxxx 1011 xxxx GE: !!! */ 1287 /* SEL cccc 0110 1000 xxxx xxxx xxxx 1011 xxxx */
1288 if ((insn & 0x0ff000f0) == 0x068000b0) { 1288 DECODE_EMULATEX (0x0ff000f0, 0x068000b0, emulate_rd12rn16rm0_rwflags_nopc,
1289 if (is_r15(insn, 12)) 1289 REGS(NOPC, NOPC, 0, 0, NOPC)),
1290 return INSN_REJECTED; /* Rd is PC */ 1290
1291 insn &= 0xfff00ff0; /* Rd = r0, Rn = r0 */ 1291 /* SSAT cccc 0110 101x xxxx xxxx xxxx xx01 xxxx */
1292 insn |= 0x00000001; /* Rm = r1 */ 1292 /* USAT cccc 0110 111x xxxx xxxx xxxx xx01 xxxx */
1293 asi->insn[0] = insn; 1293 DECODE_OR(0x0fa00030, 0x06a00010),
1294 asi->insn_handler = emulate_sel; 1294 /* SSAT16 cccc 0110 1010 xxxx xxxx xxxx 0011 xxxx */
1295 return INSN_GOOD; 1295 /* USAT16 cccc 0110 1110 xxxx xxxx xxxx 0011 xxxx */
1296 } 1296 DECODE_EMULATEX (0x0fb000f0, 0x06a00030, emulate_rd12rn16rm0_rwflags_nopc,
1297 1297 REGS(0, NOPC, 0, 0, NOPC)),
1298 /* SSAT : cccc 0110 101x xxxx xxxx xxxx xx01 xxxx :Q */ 1298
1299 /* USAT : cccc 0110 111x xxxx xxxx xxxx xx01 xxxx :Q */ 1299 /* REV cccc 0110 1011 xxxx xxxx xxxx 0011 xxxx */
1300 /* SSAT16 : cccc 0110 1010 xxxx xxxx xxxx 0011 xxxx :Q */ 1300 /* REV16 cccc 0110 1011 xxxx xxxx xxxx 1011 xxxx */
1301 /* USAT16 : cccc 0110 1110 xxxx xxxx xxxx 0011 xxxx :Q */ 1301 /* RBIT cccc 0110 1111 xxxx xxxx xxxx 0011 xxxx */
1302 if ((insn & 0x0fa00030) == 0x06a00010 || 1302 /* REVSH cccc 0110 1111 xxxx xxxx xxxx 1011 xxxx */
1303 (insn & 0x0fb000f0) == 0x06a00030) { 1303 DECODE_CUSTOM (0x0fb00070, 0x06b00030, prep_emulate_rd12rm0),
1304 if (is_r15(insn, 12)) 1304
1305 return INSN_REJECTED; /* Rd is PC */ 1305 /* ??? cccc 0110 0x00 xxxx xxxx xxxx xxx1 xxxx */
1306 insn &= 0xffff0ff0; /* Rd = r0, Rm = r0 */ 1306 DECODE_REJECT (0x0fb00010, 0x06000010),
1307 asi->insn[0] = insn; 1307 /* ??? cccc 0110 0xxx xxxx xxxx xxxx 1011 xxxx */
1308 asi->insn_handler = emulate_sat; 1308 DECODE_REJECT (0x0f8000f0, 0x060000b0),
1309 return INSN_GOOD; 1309 /* ??? cccc 0110 0xxx xxxx xxxx xxxx 1101 xxxx */
1310 } 1310 DECODE_REJECT (0x0f8000f0, 0x060000d0),
1311 1311 /* SADD16 cccc 0110 0001 xxxx xxxx xxxx 0001 xxxx */
1312 /* REV : cccc 0110 1011 xxxx xxxx xxxx 0011 xxxx */ 1312 /* SADDSUBX cccc 0110 0001 xxxx xxxx xxxx 0011 xxxx */
1313 /* REV16 : cccc 0110 1011 xxxx xxxx xxxx 1011 xxxx */ 1313 /* SSUBADDX cccc 0110 0001 xxxx xxxx xxxx 0101 xxxx */
1314 /* RBIT : cccc 0110 1111 xxxx xxxx xxxx 0011 xxxx */ 1314 /* SSUB16 cccc 0110 0001 xxxx xxxx xxxx 0111 xxxx */
1315 /* REVSH : cccc 0110 1111 xxxx xxxx xxxx 1011 xxxx */ 1315 /* SADD8 cccc 0110 0001 xxxx xxxx xxxx 1001 xxxx */
1316 if ((insn & 0x0ff00070) == 0x06b00030 || 1316 /* SSUB8 cccc 0110 0001 xxxx xxxx xxxx 1111 xxxx */
1317 (insn & 0x0ff00070) == 0x06f00030) 1317 /* QADD16 cccc 0110 0010 xxxx xxxx xxxx 0001 xxxx */
1318 return prep_emulate_rd12rm0(insn, asi); 1318 /* QADDSUBX cccc 0110 0010 xxxx xxxx xxxx 0011 xxxx */
1319 1319 /* QSUBADDX cccc 0110 0010 xxxx xxxx xxxx 0101 xxxx */
1320 /* ??? : cccc 0110 0000 xxxx xxxx xxxx xxx1 xxxx : */ 1320 /* QSUB16 cccc 0110 0010 xxxx xxxx xxxx 0111 xxxx */
1321 /* SADD16 : cccc 0110 0001 xxxx xxxx xxxx 0001 xxxx :GE */ 1321 /* QADD8 cccc 0110 0010 xxxx xxxx xxxx 1001 xxxx */
1322 /* SADDSUBX : cccc 0110 0001 xxxx xxxx xxxx 0011 xxxx :GE */ 1322 /* QSUB8 cccc 0110 0010 xxxx xxxx xxxx 1111 xxxx */
1323 /* SSUBADDX : cccc 0110 0001 xxxx xxxx xxxx 0101 xxxx :GE */ 1323 /* SHADD16 cccc 0110 0011 xxxx xxxx xxxx 0001 xxxx */
1324 /* SSUB16 : cccc 0110 0001 xxxx xxxx xxxx 0111 xxxx :GE */ 1324 /* SHADDSUBX cccc 0110 0011 xxxx xxxx xxxx 0011 xxxx */
1325 /* SADD8 : cccc 0110 0001 xxxx xxxx xxxx 1001 xxxx :GE */ 1325 /* SHSUBADDX cccc 0110 0011 xxxx xxxx xxxx 0101 xxxx */
1326 /* ??? : cccc 0110 0001 xxxx xxxx xxxx 1011 xxxx : */ 1326 /* SHSUB16 cccc 0110 0011 xxxx xxxx xxxx 0111 xxxx */
1327 /* ??? : cccc 0110 0001 xxxx xxxx xxxx 1101 xxxx : */ 1327 /* SHADD8 cccc 0110 0011 xxxx xxxx xxxx 1001 xxxx */
1328 /* SSUB8 : cccc 0110 0001 xxxx xxxx xxxx 1111 xxxx :GE */ 1328 /* SHSUB8 cccc 0110 0011 xxxx xxxx xxxx 1111 xxxx */
1329 /* QADD16 : cccc 0110 0010 xxxx xxxx xxxx 0001 xxxx : */ 1329 /* UADD16 cccc 0110 0101 xxxx xxxx xxxx 0001 xxxx */
1330 /* QADDSUBX : cccc 0110 0010 xxxx xxxx xxxx 0011 xxxx : */ 1330 /* UADDSUBX cccc 0110 0101 xxxx xxxx xxxx 0011 xxxx */
1331 /* QSUBADDX : cccc 0110 0010 xxxx xxxx xxxx 0101 xxxx : */ 1331 /* USUBADDX cccc 0110 0101 xxxx xxxx xxxx 0101 xxxx */
1332 /* QSUB16 : cccc 0110 0010 xxxx xxxx xxxx 0111 xxxx : */ 1332 /* USUB16 cccc 0110 0101 xxxx xxxx xxxx 0111 xxxx */
1333 /* QADD8 : cccc 0110 0010 xxxx xxxx xxxx 1001 xxxx : */ 1333 /* UADD8 cccc 0110 0101 xxxx xxxx xxxx 1001 xxxx */
1334 /* ??? : cccc 0110 0010 xxxx xxxx xxxx 1011 xxxx : */ 1334 /* USUB8 cccc 0110 0101 xxxx xxxx xxxx 1111 xxxx */
1335 /* ??? : cccc 0110 0010 xxxx xxxx xxxx 1101 xxxx : */ 1335 /* UQADD16 cccc 0110 0110 xxxx xxxx xxxx 0001 xxxx */
1336 /* QSUB8 : cccc 0110 0010 xxxx xxxx xxxx 1111 xxxx : */ 1336 /* UQADDSUBX cccc 0110 0110 xxxx xxxx xxxx 0011 xxxx */
1337 /* SHADD16 : cccc 0110 0011 xxxx xxxx xxxx 0001 xxxx : */ 1337 /* UQSUBADDX cccc 0110 0110 xxxx xxxx xxxx 0101 xxxx */
1338 /* SHADDSUBX : cccc 0110 0011 xxxx xxxx xxxx 0011 xxxx : */ 1338 /* UQSUB16 cccc 0110 0110 xxxx xxxx xxxx 0111 xxxx */
1339 /* SHSUBADDX : cccc 0110 0011 xxxx xxxx xxxx 0101 xxxx : */ 1339 /* UQADD8 cccc 0110 0110 xxxx xxxx xxxx 1001 xxxx */
1340 /* SHSUB16 : cccc 0110 0011 xxxx xxxx xxxx 0111 xxxx : */ 1340 /* UQSUB8 cccc 0110 0110 xxxx xxxx xxxx 1111 xxxx */
1341 /* SHADD8 : cccc 0110 0011 xxxx xxxx xxxx 1001 xxxx : */ 1341 /* UHADD16 cccc 0110 0111 xxxx xxxx xxxx 0001 xxxx */
1342 /* ??? : cccc 0110 0011 xxxx xxxx xxxx 1011 xxxx : */ 1342 /* UHADDSUBX cccc 0110 0111 xxxx xxxx xxxx 0011 xxxx */
1343 /* ??? : cccc 0110 0011 xxxx xxxx xxxx 1101 xxxx : */ 1343 /* UHSUBADDX cccc 0110 0111 xxxx xxxx xxxx 0101 xxxx */
1344 /* SHSUB8 : cccc 0110 0011 xxxx xxxx xxxx 1111 xxxx : */ 1344 /* UHSUB16 cccc 0110 0111 xxxx xxxx xxxx 0111 xxxx */
1345 /* ??? : cccc 0110 0100 xxxx xxxx xxxx xxx1 xxxx : */ 1345 /* UHADD8 cccc 0110 0111 xxxx xxxx xxxx 1001 xxxx */
1346 /* UADD16 : cccc 0110 0101 xxxx xxxx xxxx 0001 xxxx :GE */ 1346 /* UHSUB8 cccc 0110 0111 xxxx xxxx xxxx 1111 xxxx */
1347 /* UADDSUBX : cccc 0110 0101 xxxx xxxx xxxx 0011 xxxx :GE */ 1347 DECODE_CUSTOM (0x0f800010, 0x06000010, prep_emulate_rd12rn16rm0_wflags),
1348 /* USUBADDX : cccc 0110 0101 xxxx xxxx xxxx 0101 xxxx :GE */ 1348
1349 /* USUB16 : cccc 0110 0101 xxxx xxxx xxxx 0111 xxxx :GE */ 1349 /* PKHBT cccc 0110 1000 xxxx xxxx xxxx x001 xxxx */
1350 /* UADD8 : cccc 0110 0101 xxxx xxxx xxxx 1001 xxxx :GE */ 1350 /* PKHTB cccc 0110 1000 xxxx xxxx xxxx x101 xxxx */
1351 /* ??? : cccc 0110 0101 xxxx xxxx xxxx 1011 xxxx : */ 1351 DECODE_CUSTOM (0x0ff00030, 0x06800010, prep_emulate_rd12rn16rm0_wflags),
1352 /* ??? : cccc 0110 0101 xxxx xxxx xxxx 1101 xxxx : */ 1352
1353 /* USUB8 : cccc 0110 0101 xxxx xxxx xxxx 1111 xxxx :GE */ 1353 /* ??? cccc 0110 1001 xxxx xxxx xxxx 0111 xxxx */
1354 /* UQADD16 : cccc 0110 0110 xxxx xxxx xxxx 0001 xxxx : */ 1354 /* ??? cccc 0110 1101 xxxx xxxx xxxx 0111 xxxx */
1355 /* UQADDSUBX : cccc 0110 0110 xxxx xxxx xxxx 0011 xxxx : */ 1355 DECODE_REJECT (0x0fb000f0, 0x06900070),
1356 /* UQSUBADDX : cccc 0110 0110 xxxx xxxx xxxx 0101 xxxx : */ 1356
1357 /* UQSUB16 : cccc 0110 0110 xxxx xxxx xxxx 0111 xxxx : */ 1357 /* SXTB16 cccc 0110 1000 1111 xxxx xxxx 0111 xxxx */
1358 /* UQADD8 : cccc 0110 0110 xxxx xxxx xxxx 1001 xxxx : */ 1358 /* SXTB cccc 0110 1010 1111 xxxx xxxx 0111 xxxx */
1359 /* ??? : cccc 0110 0110 xxxx xxxx xxxx 1011 xxxx : */ 1359 /* SXTH cccc 0110 1011 1111 xxxx xxxx 0111 xxxx */
1360 /* ??? : cccc 0110 0110 xxxx xxxx xxxx 1101 xxxx : */ 1360 /* UXTB16 cccc 0110 1100 1111 xxxx xxxx 0111 xxxx */
1361 /* UQSUB8 : cccc 0110 0110 xxxx xxxx xxxx 1111 xxxx : */ 1361 /* UXTB cccc 0110 1110 1111 xxxx xxxx 0111 xxxx */
1362 /* UHADD16 : cccc 0110 0111 xxxx xxxx xxxx 0001 xxxx : */ 1362 /* UXTH cccc 0110 1111 1111 xxxx xxxx 0111 xxxx */
1363 /* UHADDSUBX : cccc 0110 0111 xxxx xxxx xxxx 0011 xxxx : */ 1363 DECODE_CUSTOM (0x0f8f00f0, 0x068f0070, prep_emulate_rd12rm0),
1364 /* UHSUBADDX : cccc 0110 0111 xxxx xxxx xxxx 0101 xxxx : */ 1364
1365 /* UHSUB16 : cccc 0110 0111 xxxx xxxx xxxx 0111 xxxx : */ 1365 /* SXTAB16 cccc 0110 1000 xxxx xxxx xxxx 0111 xxxx */
1366 /* UHADD8 : cccc 0110 0111 xxxx xxxx xxxx 1001 xxxx : */ 1366 /* SXTAB cccc 0110 1010 xxxx xxxx xxxx 0111 xxxx */
1367 /* ??? : cccc 0110 0111 xxxx xxxx xxxx 1011 xxxx : */ 1367 /* SXTAH cccc 0110 1011 xxxx xxxx xxxx 0111 xxxx */
1368 /* ??? : cccc 0110 0111 xxxx xxxx xxxx 1101 xxxx : */ 1368 /* UXTAB16 cccc 0110 1100 xxxx xxxx xxxx 0111 xxxx */
1369 /* UHSUB8 : cccc 0110 0111 xxxx xxxx xxxx 1111 xxxx : */ 1369 /* UXTAB cccc 0110 1110 xxxx xxxx xxxx 0111 xxxx */
1370 if ((insn & 0x0f800010) == 0x06000010) { 1370 /* UXTAH cccc 0110 1111 xxxx xxxx xxxx 0111 xxxx */
1371 if ((insn & 0x00300000) == 0x00000000 || 1371 DECODE_CUSTOM (0x0f8000f0, 0x06800070, prep_emulate_rd12rn16rm0_wflags),
1372 (insn & 0x000000e0) == 0x000000a0 ||
1373 (insn & 0x000000e0) == 0x000000c0)
1374 return INSN_REJECTED; /* Unallocated space */
1375 return prep_emulate_rd12rn16rm0_wflags(insn, asi);
1376 }
1377
1378 /* PKHBT : cccc 0110 1000 xxxx xxxx xxxx x001 xxxx : */
1379 /* PKHTB : cccc 0110 1000 xxxx xxxx xxxx x101 xxxx : */
1380 if ((insn & 0x0ff00030) == 0x06800010)
1381 return prep_emulate_rd12rn16rm0_wflags(insn, asi);
1382
1383 /* SXTAB16 : cccc 0110 1000 xxxx xxxx xxxx 0111 xxxx : */
1384 /* SXTB16 : cccc 0110 1000 1111 xxxx xxxx 0111 xxxx : */
1385 /* ??? : cccc 0110 1001 xxxx xxxx xxxx 0111 xxxx : */
1386 /* SXTAB : cccc 0110 1010 xxxx xxxx xxxx 0111 xxxx : */
1387 /* SXTB : cccc 0110 1010 1111 xxxx xxxx 0111 xxxx : */
1388 /* SXTAH : cccc 0110 1011 xxxx xxxx xxxx 0111 xxxx : */
1389 /* SXTH : cccc 0110 1011 1111 xxxx xxxx 0111 xxxx : */
1390 /* UXTAB16 : cccc 0110 1100 xxxx xxxx xxxx 0111 xxxx : */
1391 /* UXTB16 : cccc 0110 1100 1111 xxxx xxxx 0111 xxxx : */
1392 /* ??? : cccc 0110 1101 xxxx xxxx xxxx 0111 xxxx : */
1393 /* UXTAB : cccc 0110 1110 xxxx xxxx xxxx 0111 xxxx : */
1394 /* UXTB : cccc 0110 1110 1111 xxxx xxxx 0111 xxxx : */
1395 /* UXTAH : cccc 0110 1111 xxxx xxxx xxxx 0111 xxxx : */
1396 /* UXTH : cccc 0110 1111 1111 xxxx xxxx 0111 xxxx : */
1397 if ((insn & 0x0f8000f0) == 0x06800070) {
1398 if ((insn & 0x00300000) == 0x00100000)
1399 return INSN_REJECTED; /* Unallocated space */
1400
1401 if ((insn & 0x000f0000) == 0x000f0000)
1402 return prep_emulate_rd12rm0(insn, asi);
1403 else
1404 return prep_emulate_rd12rn16rm0_wflags(insn, asi);
1405 }
1406 1372
1407 /* Other instruction encodings aren't yet defined */ 1373 DECODE_END
1408 return INSN_REJECTED; 1374};
1409}
1410 1375
1411static enum kprobe_insn __kprobes 1376static enum kprobe_insn __kprobes
1412space_cccc_0111__1(kprobe_opcode_t insn, struct arch_specific_insn *asi) 1377space_cccc_0111__1(kprobe_opcode_t insn, struct arch_specific_insn *asi)
@@ -1563,7 +1528,7 @@ arm_kprobe_decode_insn(kprobe_opcode_t insn, struct arch_specific_insn *asi)
1563 1528
1564 else if ((insn & 0x0f000010) == 0x06000010) 1529 else if ((insn & 0x0f000010) == 0x06000010)
1565 1530
1566 return space_cccc_0110__1(insn, asi); 1531 return kprobe_decode_insn(insn, asi, arm_cccc_0110_____xxx1_table, false);
1567 1532
1568 else if ((insn & 0x0f000010) == 0x07000010) 1533 else if ((insn & 0x0f000010) == 0x07000010)
1569 1534