diff options
author | Jon Medhurst <tixy@yxit.co.uk> | 2011-06-08 12:36:45 -0400 |
---|---|---|
committer | Tixy <tixy@medhuaa1.miniserver.com> | 2011-07-13 13:32:49 -0400 |
commit | 2ce5d03307222b3d5b7c5e9849eb4857eb979fa9 (patch) | |
tree | 53216c7d9196d9241ffdf46ef62ee922ab0ced3a /arch/arm/kernel/kprobes-arm.c | |
parent | 0e44e9a0fae65c07fa5a23bd720b6108892c96f8 (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.c | 217 |
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 | ||
1284 | static enum kprobe_insn __kprobes | 1284 | static const union decode_item arm_cccc_0110_____xxx1_table[] = { |
1285 | space_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 | ||
1411 | static enum kprobe_insn __kprobes | 1376 | static enum kprobe_insn __kprobes |
1412 | space_cccc_0111__1(kprobe_opcode_t insn, struct arch_specific_insn *asi) | 1377 | space_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 | ||