diff options
Diffstat (limited to 'arch/powerpc/lib/sstep.c')
-rw-r--r-- | arch/powerpc/lib/sstep.c | 897 |
1 files changed, 537 insertions, 360 deletions
diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c index 5c09f365c842..3726a03179ab 100644 --- a/arch/powerpc/lib/sstep.c +++ b/arch/powerpc/lib/sstep.c | |||
@@ -98,13 +98,8 @@ static unsigned long __kprobes dform_ea(unsigned int instr, struct pt_regs *regs | |||
98 | 98 | ||
99 | ra = (instr >> 16) & 0x1f; | 99 | ra = (instr >> 16) & 0x1f; |
100 | ea = (signed short) instr; /* sign-extend */ | 100 | ea = (signed short) instr; /* sign-extend */ |
101 | if (ra) { | 101 | if (ra) |
102 | ea += regs->gpr[ra]; | 102 | ea += regs->gpr[ra]; |
103 | if (instr & 0x04000000) { /* update forms */ | ||
104 | if ((instr>>26) != 47) /* stmw is not an update form */ | ||
105 | regs->gpr[ra] = ea; | ||
106 | } | ||
107 | } | ||
108 | 103 | ||
109 | return truncate_if_32bit(regs->msr, ea); | 104 | return truncate_if_32bit(regs->msr, ea); |
110 | } | 105 | } |
@@ -120,11 +115,8 @@ static unsigned long __kprobes dsform_ea(unsigned int instr, struct pt_regs *reg | |||
120 | 115 | ||
121 | ra = (instr >> 16) & 0x1f; | 116 | ra = (instr >> 16) & 0x1f; |
122 | ea = (signed short) (instr & ~3); /* sign-extend */ | 117 | ea = (signed short) (instr & ~3); /* sign-extend */ |
123 | if (ra) { | 118 | if (ra) |
124 | ea += regs->gpr[ra]; | 119 | ea += regs->gpr[ra]; |
125 | if ((instr & 3) == 1) /* update forms */ | ||
126 | regs->gpr[ra] = ea; | ||
127 | } | ||
128 | 120 | ||
129 | return truncate_if_32bit(regs->msr, ea); | 121 | return truncate_if_32bit(regs->msr, ea); |
130 | } | 122 | } |
@@ -133,8 +125,8 @@ static unsigned long __kprobes dsform_ea(unsigned int instr, struct pt_regs *reg | |||
133 | /* | 125 | /* |
134 | * Calculate effective address for an X-form instruction | 126 | * Calculate effective address for an X-form instruction |
135 | */ | 127 | */ |
136 | static unsigned long __kprobes xform_ea(unsigned int instr, struct pt_regs *regs, | 128 | static unsigned long __kprobes xform_ea(unsigned int instr, |
137 | int do_update) | 129 | struct pt_regs *regs) |
138 | { | 130 | { |
139 | int ra, rb; | 131 | int ra, rb; |
140 | unsigned long ea; | 132 | unsigned long ea; |
@@ -142,11 +134,8 @@ static unsigned long __kprobes xform_ea(unsigned int instr, struct pt_regs *regs | |||
142 | ra = (instr >> 16) & 0x1f; | 134 | ra = (instr >> 16) & 0x1f; |
143 | rb = (instr >> 11) & 0x1f; | 135 | rb = (instr >> 11) & 0x1f; |
144 | ea = regs->gpr[rb]; | 136 | ea = regs->gpr[rb]; |
145 | if (ra) { | 137 | if (ra) |
146 | ea += regs->gpr[ra]; | 138 | ea += regs->gpr[ra]; |
147 | if (do_update) /* update forms */ | ||
148 | regs->gpr[ra] = ea; | ||
149 | } | ||
150 | 139 | ||
151 | return truncate_if_32bit(regs->msr, ea); | 140 | return truncate_if_32bit(regs->msr, ea); |
152 | } | 141 | } |
@@ -627,26 +616,27 @@ static void __kprobes do_cmp_unsigned(struct pt_regs *regs, unsigned long v1, | |||
627 | #define ROTATE(x, n) ((n) ? (((x) << (n)) | ((x) >> (8 * sizeof(long) - (n)))) : (x)) | 616 | #define ROTATE(x, n) ((n) ? (((x) << (n)) | ((x) >> (8 * sizeof(long) - (n)))) : (x)) |
628 | 617 | ||
629 | /* | 618 | /* |
630 | * Emulate instructions that cause a transfer of control, | 619 | * Decode an instruction, and execute it if that can be done just by |
631 | * loads and stores, and a few other instructions. | 620 | * modifying *regs (i.e. integer arithmetic and logical instructions, |
632 | * Returns 1 if the step was emulated, 0 if not, | 621 | * branches, and barrier instructions). |
633 | * or -1 if the instruction is one that should not be stepped, | 622 | * Returns 1 if the instruction has been executed, or 0 if not. |
634 | * such as an rfid, or a mtmsrd that would clear MSR_RI. | 623 | * Sets *op to indicate what the instruction does. |
635 | */ | 624 | */ |
636 | int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr) | 625 | int __kprobes analyse_instr(struct instruction_op *op, struct pt_regs *regs, |
626 | unsigned int instr) | ||
637 | { | 627 | { |
638 | unsigned int opcode, ra, rb, rd, spr, u; | 628 | unsigned int opcode, ra, rb, rd, spr, u; |
639 | unsigned long int imm; | 629 | unsigned long int imm; |
640 | unsigned long int val, val2; | 630 | unsigned long int val, val2; |
641 | unsigned long int ea; | 631 | unsigned int mb, me, sh; |
642 | unsigned int cr, mb, me, sh; | ||
643 | int err; | ||
644 | unsigned long old_ra, val3; | ||
645 | long ival; | 632 | long ival; |
646 | 633 | ||
634 | op->type = COMPUTE; | ||
635 | |||
647 | opcode = instr >> 26; | 636 | opcode = instr >> 26; |
648 | switch (opcode) { | 637 | switch (opcode) { |
649 | case 16: /* bc */ | 638 | case 16: /* bc */ |
639 | op->type = BRANCH; | ||
650 | imm = (signed short)(instr & 0xfffc); | 640 | imm = (signed short)(instr & 0xfffc); |
651 | if ((instr & 2) == 0) | 641 | if ((instr & 2) == 0) |
652 | imm += regs->nip; | 642 | imm += regs->nip; |
@@ -659,26 +649,14 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr) | |||
659 | return 1; | 649 | return 1; |
660 | #ifdef CONFIG_PPC64 | 650 | #ifdef CONFIG_PPC64 |
661 | case 17: /* sc */ | 651 | case 17: /* sc */ |
662 | /* | 652 | if ((instr & 0xfe2) == 2) |
663 | * N.B. this uses knowledge about how the syscall | 653 | op->type = SYSCALL; |
664 | * entry code works. If that is changed, this will | 654 | else |
665 | * need to be changed also. | 655 | op->type = UNKNOWN; |
666 | */ | 656 | return 0; |
667 | if (regs->gpr[0] == 0x1ebe && | ||
668 | cpu_has_feature(CPU_FTR_REAL_LE)) { | ||
669 | regs->msr ^= MSR_LE; | ||
670 | goto instr_done; | ||
671 | } | ||
672 | regs->gpr[9] = regs->gpr[13]; | ||
673 | regs->gpr[10] = MSR_KERNEL; | ||
674 | regs->gpr[11] = regs->nip + 4; | ||
675 | regs->gpr[12] = regs->msr & MSR_MASK; | ||
676 | regs->gpr[13] = (unsigned long) get_paca(); | ||
677 | regs->nip = (unsigned long) &system_call_common; | ||
678 | regs->msr = MSR_KERNEL; | ||
679 | return 1; | ||
680 | #endif | 657 | #endif |
681 | case 18: /* b */ | 658 | case 18: /* b */ |
659 | op->type = BRANCH; | ||
682 | imm = instr & 0x03fffffc; | 660 | imm = instr & 0x03fffffc; |
683 | if (imm & 0x02000000) | 661 | if (imm & 0x02000000) |
684 | imm -= 0x04000000; | 662 | imm -= 0x04000000; |
@@ -693,6 +671,7 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr) | |||
693 | switch ((instr >> 1) & 0x3ff) { | 671 | switch ((instr >> 1) & 0x3ff) { |
694 | case 16: /* bclr */ | 672 | case 16: /* bclr */ |
695 | case 528: /* bcctr */ | 673 | case 528: /* bcctr */ |
674 | op->type = BRANCH; | ||
696 | imm = (instr & 0x400)? regs->ctr: regs->link; | 675 | imm = (instr & 0x400)? regs->ctr: regs->link; |
697 | regs->nip = truncate_if_32bit(regs->msr, regs->nip + 4); | 676 | regs->nip = truncate_if_32bit(regs->msr, regs->nip + 4); |
698 | imm = truncate_if_32bit(regs->msr, imm); | 677 | imm = truncate_if_32bit(regs->msr, imm); |
@@ -703,9 +682,13 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr) | |||
703 | return 1; | 682 | return 1; |
704 | 683 | ||
705 | case 18: /* rfid, scary */ | 684 | case 18: /* rfid, scary */ |
706 | return -1; | 685 | if (regs->msr & MSR_PR) |
686 | goto priv; | ||
687 | op->type = RFI; | ||
688 | return 0; | ||
707 | 689 | ||
708 | case 150: /* isync */ | 690 | case 150: /* isync */ |
691 | op->type = BARRIER; | ||
709 | isync(); | 692 | isync(); |
710 | goto instr_done; | 693 | goto instr_done; |
711 | 694 | ||
@@ -731,6 +714,7 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr) | |||
731 | case 31: | 714 | case 31: |
732 | switch ((instr >> 1) & 0x3ff) { | 715 | switch ((instr >> 1) & 0x3ff) { |
733 | case 598: /* sync */ | 716 | case 598: /* sync */ |
717 | op->type = BARRIER; | ||
734 | #ifdef __powerpc64__ | 718 | #ifdef __powerpc64__ |
735 | switch ((instr >> 21) & 3) { | 719 | switch ((instr >> 21) & 3) { |
736 | case 1: /* lwsync */ | 720 | case 1: /* lwsync */ |
@@ -745,6 +729,7 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr) | |||
745 | goto instr_done; | 729 | goto instr_done; |
746 | 730 | ||
747 | case 854: /* eieio */ | 731 | case 854: /* eieio */ |
732 | op->type = BARRIER; | ||
748 | eieio(); | 733 | eieio(); |
749 | goto instr_done; | 734 | goto instr_done; |
750 | } | 735 | } |
@@ -910,33 +895,30 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr) | |||
910 | switch ((instr >> 1) & 0x3ff) { | 895 | switch ((instr >> 1) & 0x3ff) { |
911 | case 83: /* mfmsr */ | 896 | case 83: /* mfmsr */ |
912 | if (regs->msr & MSR_PR) | 897 | if (regs->msr & MSR_PR) |
913 | break; | 898 | goto priv; |
914 | regs->gpr[rd] = regs->msr & MSR_MASK; | 899 | op->type = MFMSR; |
915 | goto instr_done; | 900 | op->reg = rd; |
901 | return 0; | ||
916 | case 146: /* mtmsr */ | 902 | case 146: /* mtmsr */ |
917 | if (regs->msr & MSR_PR) | 903 | if (regs->msr & MSR_PR) |
918 | break; | 904 | goto priv; |
919 | imm = regs->gpr[rd]; | 905 | op->type = MTMSR; |
920 | if ((imm & MSR_RI) == 0) | 906 | op->reg = rd; |
921 | /* can't step mtmsr that would clear MSR_RI */ | 907 | op->val = 0xffffffff & ~(MSR_ME | MSR_LE); |
922 | return -1; | 908 | return 0; |
923 | regs->msr = imm; | ||
924 | goto instr_done; | ||
925 | #ifdef CONFIG_PPC64 | 909 | #ifdef CONFIG_PPC64 |
926 | case 178: /* mtmsrd */ | 910 | case 178: /* mtmsrd */ |
927 | /* only MSR_EE and MSR_RI get changed if bit 15 set */ | ||
928 | /* mtmsrd doesn't change MSR_HV and MSR_ME */ | ||
929 | if (regs->msr & MSR_PR) | 911 | if (regs->msr & MSR_PR) |
930 | break; | 912 | goto priv; |
931 | imm = (instr & 0x10000)? 0x8002: 0xefffffffffffefffUL; | 913 | op->type = MTMSR; |
932 | imm = (regs->msr & MSR_MASK & ~imm) | 914 | op->reg = rd; |
933 | | (regs->gpr[rd] & imm); | 915 | /* only MSR_EE and MSR_RI get changed if bit 15 set */ |
934 | if ((imm & MSR_RI) == 0) | 916 | /* mtmsrd doesn't change MSR_HV, MSR_ME or MSR_LE */ |
935 | /* can't step mtmsrd that would clear MSR_RI */ | 917 | imm = (instr & 0x10000)? 0x8002: 0xefffffffffffeffeUL; |
936 | return -1; | 918 | op->val = imm; |
937 | regs->msr = imm; | 919 | return 0; |
938 | goto instr_done; | ||
939 | #endif | 920 | #endif |
921 | |||
940 | case 19: /* mfcr */ | 922 | case 19: /* mfcr */ |
941 | regs->gpr[rd] = regs->ccr; | 923 | regs->gpr[rd] = regs->ccr; |
942 | regs->gpr[rd] &= 0xffffffffUL; | 924 | regs->gpr[rd] &= 0xffffffffUL; |
@@ -954,33 +936,43 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr) | |||
954 | goto instr_done; | 936 | goto instr_done; |
955 | 937 | ||
956 | case 339: /* mfspr */ | 938 | case 339: /* mfspr */ |
957 | spr = (instr >> 11) & 0x3ff; | 939 | spr = ((instr >> 16) & 0x1f) | ((instr >> 6) & 0x3e0); |
958 | switch (spr) { | 940 | switch (spr) { |
959 | case 0x20: /* mfxer */ | 941 | case SPRN_XER: /* mfxer */ |
960 | regs->gpr[rd] = regs->xer; | 942 | regs->gpr[rd] = regs->xer; |
961 | regs->gpr[rd] &= 0xffffffffUL; | 943 | regs->gpr[rd] &= 0xffffffffUL; |
962 | goto instr_done; | 944 | goto instr_done; |
963 | case 0x100: /* mflr */ | 945 | case SPRN_LR: /* mflr */ |
964 | regs->gpr[rd] = regs->link; | 946 | regs->gpr[rd] = regs->link; |
965 | goto instr_done; | 947 | goto instr_done; |
966 | case 0x120: /* mfctr */ | 948 | case SPRN_CTR: /* mfctr */ |
967 | regs->gpr[rd] = regs->ctr; | 949 | regs->gpr[rd] = regs->ctr; |
968 | goto instr_done; | 950 | goto instr_done; |
951 | default: | ||
952 | op->type = MFSPR; | ||
953 | op->reg = rd; | ||
954 | op->spr = spr; | ||
955 | return 0; | ||
969 | } | 956 | } |
970 | break; | 957 | break; |
971 | 958 | ||
972 | case 467: /* mtspr */ | 959 | case 467: /* mtspr */ |
973 | spr = (instr >> 11) & 0x3ff; | 960 | spr = ((instr >> 16) & 0x1f) | ((instr >> 6) & 0x3e0); |
974 | switch (spr) { | 961 | switch (spr) { |
975 | case 0x20: /* mtxer */ | 962 | case SPRN_XER: /* mtxer */ |
976 | regs->xer = (regs->gpr[rd] & 0xffffffffUL); | 963 | regs->xer = (regs->gpr[rd] & 0xffffffffUL); |
977 | goto instr_done; | 964 | goto instr_done; |
978 | case 0x100: /* mtlr */ | 965 | case SPRN_LR: /* mtlr */ |
979 | regs->link = regs->gpr[rd]; | 966 | regs->link = regs->gpr[rd]; |
980 | goto instr_done; | 967 | goto instr_done; |
981 | case 0x120: /* mtctr */ | 968 | case SPRN_CTR: /* mtctr */ |
982 | regs->ctr = regs->gpr[rd]; | 969 | regs->ctr = regs->gpr[rd]; |
983 | goto instr_done; | 970 | goto instr_done; |
971 | default: | ||
972 | op->type = MTSPR; | ||
973 | op->val = regs->gpr[rd]; | ||
974 | op->spr = spr; | ||
975 | return 0; | ||
984 | } | 976 | } |
985 | break; | 977 | break; |
986 | 978 | ||
@@ -1257,294 +1249,210 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr) | |||
1257 | * Cache instructions | 1249 | * Cache instructions |
1258 | */ | 1250 | */ |
1259 | case 54: /* dcbst */ | 1251 | case 54: /* dcbst */ |
1260 | ea = xform_ea(instr, regs, 0); | 1252 | op->type = MKOP(CACHEOP, DCBST, 0); |
1261 | if (!address_ok(regs, ea, 8)) | 1253 | op->ea = xform_ea(instr, regs); |
1262 | return 0; | 1254 | return 0; |
1263 | err = 0; | ||
1264 | __cacheop_user_asmx(ea, err, "dcbst"); | ||
1265 | if (err) | ||
1266 | return 0; | ||
1267 | goto instr_done; | ||
1268 | 1255 | ||
1269 | case 86: /* dcbf */ | 1256 | case 86: /* dcbf */ |
1270 | ea = xform_ea(instr, regs, 0); | 1257 | op->type = MKOP(CACHEOP, DCBF, 0); |
1271 | if (!address_ok(regs, ea, 8)) | 1258 | op->ea = xform_ea(instr, regs); |
1272 | return 0; | 1259 | return 0; |
1273 | err = 0; | ||
1274 | __cacheop_user_asmx(ea, err, "dcbf"); | ||
1275 | if (err) | ||
1276 | return 0; | ||
1277 | goto instr_done; | ||
1278 | 1260 | ||
1279 | case 246: /* dcbtst */ | 1261 | case 246: /* dcbtst */ |
1280 | if (rd == 0) { | 1262 | op->type = MKOP(CACHEOP, DCBTST, 0); |
1281 | ea = xform_ea(instr, regs, 0); | 1263 | op->ea = xform_ea(instr, regs); |
1282 | prefetchw((void *) ea); | 1264 | op->reg = rd; |
1283 | } | 1265 | return 0; |
1284 | goto instr_done; | ||
1285 | 1266 | ||
1286 | case 278: /* dcbt */ | 1267 | case 278: /* dcbt */ |
1287 | if (rd == 0) { | 1268 | op->type = MKOP(CACHEOP, DCBTST, 0); |
1288 | ea = xform_ea(instr, regs, 0); | 1269 | op->ea = xform_ea(instr, regs); |
1289 | prefetch((void *) ea); | 1270 | op->reg = rd; |
1290 | } | 1271 | return 0; |
1291 | goto instr_done; | ||
1292 | |||
1293 | } | 1272 | } |
1294 | break; | 1273 | break; |
1295 | } | 1274 | } |
1296 | 1275 | ||
1297 | /* | 1276 | /* |
1298 | * Following cases are for loads and stores, so bail out | 1277 | * Loads and stores. |
1299 | * if we're in little-endian mode. | ||
1300 | */ | 1278 | */ |
1301 | if (regs->msr & MSR_LE) | 1279 | op->type = UNKNOWN; |
1302 | return 0; | 1280 | op->update_reg = ra; |
1303 | 1281 | op->reg = rd; | |
1304 | /* | 1282 | op->val = regs->gpr[rd]; |
1305 | * Save register RA in case it's an update form load or store | 1283 | u = (instr >> 20) & UPDATE; |
1306 | * and the access faults. | ||
1307 | */ | ||
1308 | old_ra = regs->gpr[ra]; | ||
1309 | 1284 | ||
1310 | switch (opcode) { | 1285 | switch (opcode) { |
1311 | case 31: | 1286 | case 31: |
1312 | u = instr & 0x40; | 1287 | u = instr & UPDATE; |
1288 | op->ea = xform_ea(instr, regs); | ||
1313 | switch ((instr >> 1) & 0x3ff) { | 1289 | switch ((instr >> 1) & 0x3ff) { |
1314 | case 20: /* lwarx */ | 1290 | case 20: /* lwarx */ |
1315 | ea = xform_ea(instr, regs, 0); | 1291 | op->type = MKOP(LARX, 0, 4); |
1316 | if (ea & 3) | 1292 | break; |
1317 | break; /* can't handle misaligned */ | ||
1318 | err = -EFAULT; | ||
1319 | if (!address_ok(regs, ea, 4)) | ||
1320 | goto ldst_done; | ||
1321 | err = 0; | ||
1322 | __get_user_asmx(val, ea, err, "lwarx"); | ||
1323 | if (!err) | ||
1324 | regs->gpr[rd] = val; | ||
1325 | goto ldst_done; | ||
1326 | 1293 | ||
1327 | case 150: /* stwcx. */ | 1294 | case 150: /* stwcx. */ |
1328 | ea = xform_ea(instr, regs, 0); | 1295 | op->type = MKOP(STCX, 0, 4); |
1329 | if (ea & 3) | 1296 | break; |
1330 | break; /* can't handle misaligned */ | ||
1331 | err = -EFAULT; | ||
1332 | if (!address_ok(regs, ea, 4)) | ||
1333 | goto ldst_done; | ||
1334 | err = 0; | ||
1335 | __put_user_asmx(regs->gpr[rd], ea, err, "stwcx.", cr); | ||
1336 | if (!err) | ||
1337 | regs->ccr = (regs->ccr & 0x0fffffff) | | ||
1338 | (cr & 0xe0000000) | | ||
1339 | ((regs->xer >> 3) & 0x10000000); | ||
1340 | goto ldst_done; | ||
1341 | 1297 | ||
1342 | #ifdef __powerpc64__ | 1298 | #ifdef __powerpc64__ |
1343 | case 84: /* ldarx */ | 1299 | case 84: /* ldarx */ |
1344 | ea = xform_ea(instr, regs, 0); | 1300 | op->type = MKOP(LARX, 0, 8); |
1345 | if (ea & 7) | 1301 | break; |
1346 | break; /* can't handle misaligned */ | ||
1347 | err = -EFAULT; | ||
1348 | if (!address_ok(regs, ea, 8)) | ||
1349 | goto ldst_done; | ||
1350 | err = 0; | ||
1351 | __get_user_asmx(val, ea, err, "ldarx"); | ||
1352 | if (!err) | ||
1353 | regs->gpr[rd] = val; | ||
1354 | goto ldst_done; | ||
1355 | 1302 | ||
1356 | case 214: /* stdcx. */ | 1303 | case 214: /* stdcx. */ |
1357 | ea = xform_ea(instr, regs, 0); | 1304 | op->type = MKOP(STCX, 0, 8); |
1358 | if (ea & 7) | 1305 | break; |
1359 | break; /* can't handle misaligned */ | ||
1360 | err = -EFAULT; | ||
1361 | if (!address_ok(regs, ea, 8)) | ||
1362 | goto ldst_done; | ||
1363 | err = 0; | ||
1364 | __put_user_asmx(regs->gpr[rd], ea, err, "stdcx.", cr); | ||
1365 | if (!err) | ||
1366 | regs->ccr = (regs->ccr & 0x0fffffff) | | ||
1367 | (cr & 0xe0000000) | | ||
1368 | ((regs->xer >> 3) & 0x10000000); | ||
1369 | goto ldst_done; | ||
1370 | 1306 | ||
1371 | case 21: /* ldx */ | 1307 | case 21: /* ldx */ |
1372 | case 53: /* ldux */ | 1308 | case 53: /* ldux */ |
1373 | err = read_mem(®s->gpr[rd], xform_ea(instr, regs, u), | 1309 | op->type = MKOP(LOAD, u, 8); |
1374 | 8, regs); | 1310 | break; |
1375 | goto ldst_done; | ||
1376 | #endif | 1311 | #endif |
1377 | 1312 | ||
1378 | case 23: /* lwzx */ | 1313 | case 23: /* lwzx */ |
1379 | case 55: /* lwzux */ | 1314 | case 55: /* lwzux */ |
1380 | err = read_mem(®s->gpr[rd], xform_ea(instr, regs, u), | 1315 | op->type = MKOP(LOAD, u, 4); |
1381 | 4, regs); | 1316 | break; |
1382 | goto ldst_done; | ||
1383 | 1317 | ||
1384 | case 87: /* lbzx */ | 1318 | case 87: /* lbzx */ |
1385 | case 119: /* lbzux */ | 1319 | case 119: /* lbzux */ |
1386 | err = read_mem(®s->gpr[rd], xform_ea(instr, regs, u), | 1320 | op->type = MKOP(LOAD, u, 1); |
1387 | 1, regs); | 1321 | break; |
1388 | goto ldst_done; | ||
1389 | 1322 | ||
1390 | #ifdef CONFIG_ALTIVEC | 1323 | #ifdef CONFIG_ALTIVEC |
1391 | case 103: /* lvx */ | 1324 | case 103: /* lvx */ |
1392 | case 359: /* lvxl */ | 1325 | case 359: /* lvxl */ |
1393 | if (!(regs->msr & MSR_VEC)) | 1326 | if (!(regs->msr & MSR_VEC)) |
1394 | break; | 1327 | goto vecunavail; |
1395 | ea = xform_ea(instr, regs, 0); | 1328 | op->type = MKOP(LOAD_VMX, 0, 16); |
1396 | err = do_vec_load(rd, do_lvx, ea, regs); | 1329 | break; |
1397 | goto ldst_done; | ||
1398 | 1330 | ||
1399 | case 231: /* stvx */ | 1331 | case 231: /* stvx */ |
1400 | case 487: /* stvxl */ | 1332 | case 487: /* stvxl */ |
1401 | if (!(regs->msr & MSR_VEC)) | 1333 | if (!(regs->msr & MSR_VEC)) |
1402 | break; | 1334 | goto vecunavail; |
1403 | ea = xform_ea(instr, regs, 0); | 1335 | op->type = MKOP(STORE_VMX, 0, 16); |
1404 | err = do_vec_store(rd, do_stvx, ea, regs); | 1336 | break; |
1405 | goto ldst_done; | ||
1406 | #endif /* CONFIG_ALTIVEC */ | 1337 | #endif /* CONFIG_ALTIVEC */ |
1407 | 1338 | ||
1408 | #ifdef __powerpc64__ | 1339 | #ifdef __powerpc64__ |
1409 | case 149: /* stdx */ | 1340 | case 149: /* stdx */ |
1410 | case 181: /* stdux */ | 1341 | case 181: /* stdux */ |
1411 | val = regs->gpr[rd]; | 1342 | op->type = MKOP(STORE, u, 8); |
1412 | err = write_mem(val, xform_ea(instr, regs, u), 8, regs); | 1343 | break; |
1413 | goto ldst_done; | ||
1414 | #endif | 1344 | #endif |
1415 | 1345 | ||
1416 | case 151: /* stwx */ | 1346 | case 151: /* stwx */ |
1417 | case 183: /* stwux */ | 1347 | case 183: /* stwux */ |
1418 | val = regs->gpr[rd]; | 1348 | op->type = MKOP(STORE, u, 4); |
1419 | err = write_mem(val, xform_ea(instr, regs, u), 4, regs); | 1349 | break; |
1420 | goto ldst_done; | ||
1421 | 1350 | ||
1422 | case 215: /* stbx */ | 1351 | case 215: /* stbx */ |
1423 | case 247: /* stbux */ | 1352 | case 247: /* stbux */ |
1424 | val = regs->gpr[rd]; | 1353 | op->type = MKOP(STORE, u, 1); |
1425 | err = write_mem(val, xform_ea(instr, regs, u), 1, regs); | 1354 | break; |
1426 | goto ldst_done; | ||
1427 | 1355 | ||
1428 | case 279: /* lhzx */ | 1356 | case 279: /* lhzx */ |
1429 | case 311: /* lhzux */ | 1357 | case 311: /* lhzux */ |
1430 | err = read_mem(®s->gpr[rd], xform_ea(instr, regs, u), | 1358 | op->type = MKOP(LOAD, u, 2); |
1431 | 2, regs); | 1359 | break; |
1432 | goto ldst_done; | ||
1433 | 1360 | ||
1434 | #ifdef __powerpc64__ | 1361 | #ifdef __powerpc64__ |
1435 | case 341: /* lwax */ | 1362 | case 341: /* lwax */ |
1436 | case 373: /* lwaux */ | 1363 | case 373: /* lwaux */ |
1437 | err = read_mem(®s->gpr[rd], xform_ea(instr, regs, u), | 1364 | op->type = MKOP(LOAD, SIGNEXT | u, 4); |
1438 | 4, regs); | 1365 | break; |
1439 | if (!err) | ||
1440 | regs->gpr[rd] = (signed int) regs->gpr[rd]; | ||
1441 | goto ldst_done; | ||
1442 | #endif | 1366 | #endif |
1443 | 1367 | ||
1444 | case 343: /* lhax */ | 1368 | case 343: /* lhax */ |
1445 | case 375: /* lhaux */ | 1369 | case 375: /* lhaux */ |
1446 | err = read_mem(®s->gpr[rd], xform_ea(instr, regs, u), | 1370 | op->type = MKOP(LOAD, SIGNEXT | u, 2); |
1447 | 2, regs); | 1371 | break; |
1448 | if (!err) | ||
1449 | regs->gpr[rd] = (signed short) regs->gpr[rd]; | ||
1450 | goto ldst_done; | ||
1451 | 1372 | ||
1452 | case 407: /* sthx */ | 1373 | case 407: /* sthx */ |
1453 | case 439: /* sthux */ | 1374 | case 439: /* sthux */ |
1454 | val = regs->gpr[rd]; | 1375 | op->type = MKOP(STORE, u, 2); |
1455 | err = write_mem(val, xform_ea(instr, regs, u), 2, regs); | 1376 | break; |
1456 | goto ldst_done; | ||
1457 | 1377 | ||
1458 | #ifdef __powerpc64__ | 1378 | #ifdef __powerpc64__ |
1459 | case 532: /* ldbrx */ | 1379 | case 532: /* ldbrx */ |
1460 | err = read_mem(&val, xform_ea(instr, regs, 0), 8, regs); | 1380 | op->type = MKOP(LOAD, BYTEREV, 8); |
1461 | if (!err) | 1381 | break; |
1462 | regs->gpr[rd] = byterev_8(val); | ||
1463 | goto ldst_done; | ||
1464 | 1382 | ||
1465 | #endif | 1383 | #endif |
1466 | 1384 | ||
1467 | case 534: /* lwbrx */ | 1385 | case 534: /* lwbrx */ |
1468 | err = read_mem(&val, xform_ea(instr, regs, 0), 4, regs); | 1386 | op->type = MKOP(LOAD, BYTEREV, 4); |
1469 | if (!err) | 1387 | break; |
1470 | regs->gpr[rd] = byterev_4(val); | ||
1471 | goto ldst_done; | ||
1472 | 1388 | ||
1473 | #ifdef CONFIG_PPC_FPU | 1389 | #ifdef CONFIG_PPC_FPU |
1474 | case 535: /* lfsx */ | 1390 | case 535: /* lfsx */ |
1475 | case 567: /* lfsux */ | 1391 | case 567: /* lfsux */ |
1476 | if (!(regs->msr & MSR_FP)) | 1392 | if (!(regs->msr & MSR_FP)) |
1477 | break; | 1393 | goto fpunavail; |
1478 | ea = xform_ea(instr, regs, u); | 1394 | op->type = MKOP(LOAD_FP, u, 4); |
1479 | err = do_fp_load(rd, do_lfs, ea, 4, regs); | 1395 | break; |
1480 | goto ldst_done; | ||
1481 | 1396 | ||
1482 | case 599: /* lfdx */ | 1397 | case 599: /* lfdx */ |
1483 | case 631: /* lfdux */ | 1398 | case 631: /* lfdux */ |
1484 | if (!(regs->msr & MSR_FP)) | 1399 | if (!(regs->msr & MSR_FP)) |
1485 | break; | 1400 | goto fpunavail; |
1486 | ea = xform_ea(instr, regs, u); | 1401 | op->type = MKOP(LOAD_FP, u, 8); |
1487 | err = do_fp_load(rd, do_lfd, ea, 8, regs); | 1402 | break; |
1488 | goto ldst_done; | ||
1489 | 1403 | ||
1490 | case 663: /* stfsx */ | 1404 | case 663: /* stfsx */ |
1491 | case 695: /* stfsux */ | 1405 | case 695: /* stfsux */ |
1492 | if (!(regs->msr & MSR_FP)) | 1406 | if (!(regs->msr & MSR_FP)) |
1493 | break; | 1407 | goto fpunavail; |
1494 | ea = xform_ea(instr, regs, u); | 1408 | op->type = MKOP(STORE_FP, u, 4); |
1495 | err = do_fp_store(rd, do_stfs, ea, 4, regs); | 1409 | break; |
1496 | goto ldst_done; | ||
1497 | 1410 | ||
1498 | case 727: /* stfdx */ | 1411 | case 727: /* stfdx */ |
1499 | case 759: /* stfdux */ | 1412 | case 759: /* stfdux */ |
1500 | if (!(regs->msr & MSR_FP)) | 1413 | if (!(regs->msr & MSR_FP)) |
1501 | break; | 1414 | goto fpunavail; |
1502 | ea = xform_ea(instr, regs, u); | 1415 | op->type = MKOP(STORE_FP, u, 8); |
1503 | err = do_fp_store(rd, do_stfd, ea, 8, regs); | 1416 | break; |
1504 | goto ldst_done; | ||
1505 | #endif | 1417 | #endif |
1506 | 1418 | ||
1507 | #ifdef __powerpc64__ | 1419 | #ifdef __powerpc64__ |
1508 | case 660: /* stdbrx */ | 1420 | case 660: /* stdbrx */ |
1509 | val = byterev_8(regs->gpr[rd]); | 1421 | op->type = MKOP(STORE, BYTEREV, 8); |
1510 | err = write_mem(val, xform_ea(instr, regs, 0), 8, regs); | 1422 | op->val = byterev_8(regs->gpr[rd]); |
1511 | goto ldst_done; | 1423 | break; |
1512 | 1424 | ||
1513 | #endif | 1425 | #endif |
1514 | case 662: /* stwbrx */ | 1426 | case 662: /* stwbrx */ |
1515 | val = byterev_4(regs->gpr[rd]); | 1427 | op->type = MKOP(STORE, BYTEREV, 4); |
1516 | err = write_mem(val, xform_ea(instr, regs, 0), 4, regs); | 1428 | op->val = byterev_4(regs->gpr[rd]); |
1517 | goto ldst_done; | 1429 | break; |
1518 | 1430 | ||
1519 | case 790: /* lhbrx */ | 1431 | case 790: /* lhbrx */ |
1520 | err = read_mem(&val, xform_ea(instr, regs, 0), 2, regs); | 1432 | op->type = MKOP(LOAD, BYTEREV, 2); |
1521 | if (!err) | 1433 | break; |
1522 | regs->gpr[rd] = byterev_2(val); | ||
1523 | goto ldst_done; | ||
1524 | 1434 | ||
1525 | case 918: /* sthbrx */ | 1435 | case 918: /* sthbrx */ |
1526 | val = byterev_2(regs->gpr[rd]); | 1436 | op->type = MKOP(STORE, BYTEREV, 2); |
1527 | err = write_mem(val, xform_ea(instr, regs, 0), 2, regs); | 1437 | op->val = byterev_2(regs->gpr[rd]); |
1528 | goto ldst_done; | 1438 | break; |
1529 | 1439 | ||
1530 | #ifdef CONFIG_VSX | 1440 | #ifdef CONFIG_VSX |
1531 | case 844: /* lxvd2x */ | 1441 | case 844: /* lxvd2x */ |
1532 | case 876: /* lxvd2ux */ | 1442 | case 876: /* lxvd2ux */ |
1533 | if (!(regs->msr & MSR_VSX)) | 1443 | if (!(regs->msr & MSR_VSX)) |
1534 | break; | 1444 | goto vsxunavail; |
1535 | rd |= (instr & 1) << 5; | 1445 | op->reg = rd | ((instr & 1) << 5); |
1536 | ea = xform_ea(instr, regs, u); | 1446 | op->type = MKOP(LOAD_VSX, u, 16); |
1537 | err = do_vsx_load(rd, do_lxvd2x, ea, regs); | 1447 | break; |
1538 | goto ldst_done; | ||
1539 | 1448 | ||
1540 | case 972: /* stxvd2x */ | 1449 | case 972: /* stxvd2x */ |
1541 | case 1004: /* stxvd2ux */ | 1450 | case 1004: /* stxvd2ux */ |
1542 | if (!(regs->msr & MSR_VSX)) | 1451 | if (!(regs->msr & MSR_VSX)) |
1543 | break; | 1452 | goto vsxunavail; |
1544 | rd |= (instr & 1) << 5; | 1453 | op->reg = rd | ((instr & 1) << 5); |
1545 | ea = xform_ea(instr, regs, u); | 1454 | op->type = MKOP(STORE_VSX, u, 16); |
1546 | err = do_vsx_store(rd, do_stxvd2x, ea, regs); | 1455 | break; |
1547 | goto ldst_done; | ||
1548 | 1456 | ||
1549 | #endif /* CONFIG_VSX */ | 1457 | #endif /* CONFIG_VSX */ |
1550 | } | 1458 | } |
@@ -1552,178 +1460,124 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr) | |||
1552 | 1460 | ||
1553 | case 32: /* lwz */ | 1461 | case 32: /* lwz */ |
1554 | case 33: /* lwzu */ | 1462 | case 33: /* lwzu */ |
1555 | err = read_mem(®s->gpr[rd], dform_ea(instr, regs), 4, regs); | 1463 | op->type = MKOP(LOAD, u, 4); |
1556 | goto ldst_done; | 1464 | op->ea = dform_ea(instr, regs); |
1465 | break; | ||
1557 | 1466 | ||
1558 | case 34: /* lbz */ | 1467 | case 34: /* lbz */ |
1559 | case 35: /* lbzu */ | 1468 | case 35: /* lbzu */ |
1560 | err = read_mem(®s->gpr[rd], dform_ea(instr, regs), 1, regs); | 1469 | op->type = MKOP(LOAD, u, 1); |
1561 | goto ldst_done; | 1470 | op->ea = dform_ea(instr, regs); |
1471 | break; | ||
1562 | 1472 | ||
1563 | case 36: /* stw */ | 1473 | case 36: /* stw */ |
1564 | val = regs->gpr[rd]; | ||
1565 | err = write_mem(val, dform_ea(instr, regs), 4, regs); | ||
1566 | goto ldst_done; | ||
1567 | |||
1568 | case 37: /* stwu */ | 1474 | case 37: /* stwu */ |
1569 | val = regs->gpr[rd]; | 1475 | op->type = MKOP(STORE, u, 4); |
1570 | val3 = dform_ea(instr, regs); | 1476 | op->ea = dform_ea(instr, regs); |
1571 | /* | 1477 | break; |
1572 | * For PPC32 we always use stwu to change stack point with r1. So | ||
1573 | * this emulated store may corrupt the exception frame, now we | ||
1574 | * have to provide the exception frame trampoline, which is pushed | ||
1575 | * below the kprobed function stack. So we only update gpr[1] but | ||
1576 | * don't emulate the real store operation. We will do real store | ||
1577 | * operation safely in exception return code by checking this flag. | ||
1578 | */ | ||
1579 | if ((ra == 1) && !(regs->msr & MSR_PR) \ | ||
1580 | && (val3 >= (regs->gpr[1] - STACK_INT_FRAME_SIZE))) { | ||
1581 | #ifdef CONFIG_PPC32 | ||
1582 | /* | ||
1583 | * Check if we will touch kernel sack overflow | ||
1584 | */ | ||
1585 | if (val3 - STACK_INT_FRAME_SIZE <= current->thread.ksp_limit) { | ||
1586 | printk(KERN_CRIT "Can't kprobe this since Kernel stack overflow.\n"); | ||
1587 | err = -EINVAL; | ||
1588 | break; | ||
1589 | } | ||
1590 | #endif /* CONFIG_PPC32 */ | ||
1591 | /* | ||
1592 | * Check if we already set since that means we'll | ||
1593 | * lose the previous value. | ||
1594 | */ | ||
1595 | WARN_ON(test_thread_flag(TIF_EMULATE_STACK_STORE)); | ||
1596 | set_thread_flag(TIF_EMULATE_STACK_STORE); | ||
1597 | err = 0; | ||
1598 | } else | ||
1599 | err = write_mem(val, val3, 4, regs); | ||
1600 | goto ldst_done; | ||
1601 | 1478 | ||
1602 | case 38: /* stb */ | 1479 | case 38: /* stb */ |
1603 | case 39: /* stbu */ | 1480 | case 39: /* stbu */ |
1604 | val = regs->gpr[rd]; | 1481 | op->type = MKOP(STORE, u, 1); |
1605 | err = write_mem(val, dform_ea(instr, regs), 1, regs); | 1482 | op->ea = dform_ea(instr, regs); |
1606 | goto ldst_done; | 1483 | break; |
1607 | 1484 | ||
1608 | case 40: /* lhz */ | 1485 | case 40: /* lhz */ |
1609 | case 41: /* lhzu */ | 1486 | case 41: /* lhzu */ |
1610 | err = read_mem(®s->gpr[rd], dform_ea(instr, regs), 2, regs); | 1487 | op->type = MKOP(LOAD, u, 2); |
1611 | goto ldst_done; | 1488 | op->ea = dform_ea(instr, regs); |
1489 | break; | ||
1612 | 1490 | ||
1613 | case 42: /* lha */ | 1491 | case 42: /* lha */ |
1614 | case 43: /* lhau */ | 1492 | case 43: /* lhau */ |
1615 | err = read_mem(®s->gpr[rd], dform_ea(instr, regs), 2, regs); | 1493 | op->type = MKOP(LOAD, SIGNEXT | u, 2); |
1616 | if (!err) | 1494 | op->ea = dform_ea(instr, regs); |
1617 | regs->gpr[rd] = (signed short) regs->gpr[rd]; | 1495 | break; |
1618 | goto ldst_done; | ||
1619 | 1496 | ||
1620 | case 44: /* sth */ | 1497 | case 44: /* sth */ |
1621 | case 45: /* sthu */ | 1498 | case 45: /* sthu */ |
1622 | val = regs->gpr[rd]; | 1499 | op->type = MKOP(STORE, u, 2); |
1623 | err = write_mem(val, dform_ea(instr, regs), 2, regs); | 1500 | op->ea = dform_ea(instr, regs); |
1624 | goto ldst_done; | 1501 | break; |
1625 | 1502 | ||
1626 | case 46: /* lmw */ | 1503 | case 46: /* lmw */ |
1627 | ra = (instr >> 16) & 0x1f; | 1504 | ra = (instr >> 16) & 0x1f; |
1628 | if (ra >= rd) | 1505 | if (ra >= rd) |
1629 | break; /* invalid form, ra in range to load */ | 1506 | break; /* invalid form, ra in range to load */ |
1630 | ea = dform_ea(instr, regs); | 1507 | op->type = MKOP(LOAD_MULTI, 0, 4); |
1631 | do { | 1508 | op->ea = dform_ea(instr, regs); |
1632 | err = read_mem(®s->gpr[rd], ea, 4, regs); | 1509 | break; |
1633 | if (err) | ||
1634 | return 0; | ||
1635 | ea += 4; | ||
1636 | } while (++rd < 32); | ||
1637 | goto instr_done; | ||
1638 | 1510 | ||
1639 | case 47: /* stmw */ | 1511 | case 47: /* stmw */ |
1640 | ea = dform_ea(instr, regs); | 1512 | op->type = MKOP(STORE_MULTI, 0, 4); |
1641 | do { | 1513 | op->ea = dform_ea(instr, regs); |
1642 | err = write_mem(regs->gpr[rd], ea, 4, regs); | 1514 | break; |
1643 | if (err) | ||
1644 | return 0; | ||
1645 | ea += 4; | ||
1646 | } while (++rd < 32); | ||
1647 | goto instr_done; | ||
1648 | 1515 | ||
1649 | #ifdef CONFIG_PPC_FPU | 1516 | #ifdef CONFIG_PPC_FPU |
1650 | case 48: /* lfs */ | 1517 | case 48: /* lfs */ |
1651 | case 49: /* lfsu */ | 1518 | case 49: /* lfsu */ |
1652 | if (!(regs->msr & MSR_FP)) | 1519 | if (!(regs->msr & MSR_FP)) |
1653 | break; | 1520 | goto fpunavail; |
1654 | ea = dform_ea(instr, regs); | 1521 | op->type = MKOP(LOAD_FP, u, 4); |
1655 | err = do_fp_load(rd, do_lfs, ea, 4, regs); | 1522 | op->ea = dform_ea(instr, regs); |
1656 | goto ldst_done; | 1523 | break; |
1657 | 1524 | ||
1658 | case 50: /* lfd */ | 1525 | case 50: /* lfd */ |
1659 | case 51: /* lfdu */ | 1526 | case 51: /* lfdu */ |
1660 | if (!(regs->msr & MSR_FP)) | 1527 | if (!(regs->msr & MSR_FP)) |
1661 | break; | 1528 | goto fpunavail; |
1662 | ea = dform_ea(instr, regs); | 1529 | op->type = MKOP(LOAD_FP, u, 8); |
1663 | err = do_fp_load(rd, do_lfd, ea, 8, regs); | 1530 | op->ea = dform_ea(instr, regs); |
1664 | goto ldst_done; | 1531 | break; |
1665 | 1532 | ||
1666 | case 52: /* stfs */ | 1533 | case 52: /* stfs */ |
1667 | case 53: /* stfsu */ | 1534 | case 53: /* stfsu */ |
1668 | if (!(regs->msr & MSR_FP)) | 1535 | if (!(regs->msr & MSR_FP)) |
1669 | break; | 1536 | goto fpunavail; |
1670 | ea = dform_ea(instr, regs); | 1537 | op->type = MKOP(STORE_FP, u, 4); |
1671 | err = do_fp_store(rd, do_stfs, ea, 4, regs); | 1538 | op->ea = dform_ea(instr, regs); |
1672 | goto ldst_done; | 1539 | break; |
1673 | 1540 | ||
1674 | case 54: /* stfd */ | 1541 | case 54: /* stfd */ |
1675 | case 55: /* stfdu */ | 1542 | case 55: /* stfdu */ |
1676 | if (!(regs->msr & MSR_FP)) | 1543 | if (!(regs->msr & MSR_FP)) |
1677 | break; | 1544 | goto fpunavail; |
1678 | ea = dform_ea(instr, regs); | 1545 | op->type = MKOP(STORE_FP, u, 8); |
1679 | err = do_fp_store(rd, do_stfd, ea, 8, regs); | 1546 | op->ea = dform_ea(instr, regs); |
1680 | goto ldst_done; | 1547 | break; |
1681 | #endif | 1548 | #endif |
1682 | 1549 | ||
1683 | #ifdef __powerpc64__ | 1550 | #ifdef __powerpc64__ |
1684 | case 58: /* ld[u], lwa */ | 1551 | case 58: /* ld[u], lwa */ |
1552 | op->ea = dsform_ea(instr, regs); | ||
1685 | switch (instr & 3) { | 1553 | switch (instr & 3) { |
1686 | case 0: /* ld */ | 1554 | case 0: /* ld */ |
1687 | err = read_mem(®s->gpr[rd], dsform_ea(instr, regs), | 1555 | op->type = MKOP(LOAD, 0, 8); |
1688 | 8, regs); | 1556 | break; |
1689 | goto ldst_done; | ||
1690 | case 1: /* ldu */ | 1557 | case 1: /* ldu */ |
1691 | err = read_mem(®s->gpr[rd], dsform_ea(instr, regs), | 1558 | op->type = MKOP(LOAD, UPDATE, 8); |
1692 | 8, regs); | 1559 | break; |
1693 | goto ldst_done; | ||
1694 | case 2: /* lwa */ | 1560 | case 2: /* lwa */ |
1695 | err = read_mem(®s->gpr[rd], dsform_ea(instr, regs), | 1561 | op->type = MKOP(LOAD, SIGNEXT, 4); |
1696 | 4, regs); | 1562 | break; |
1697 | if (!err) | ||
1698 | regs->gpr[rd] = (signed int) regs->gpr[rd]; | ||
1699 | goto ldst_done; | ||
1700 | } | 1563 | } |
1701 | break; | 1564 | break; |
1702 | 1565 | ||
1703 | case 62: /* std[u] */ | 1566 | case 62: /* std[u] */ |
1704 | val = regs->gpr[rd]; | 1567 | op->ea = dsform_ea(instr, regs); |
1705 | switch (instr & 3) { | 1568 | switch (instr & 3) { |
1706 | case 0: /* std */ | 1569 | case 0: /* std */ |
1707 | err = write_mem(val, dsform_ea(instr, regs), 8, regs); | 1570 | op->type = MKOP(STORE, 0, 8); |
1708 | goto ldst_done; | 1571 | break; |
1709 | case 1: /* stdu */ | 1572 | case 1: /* stdu */ |
1710 | err = write_mem(val, dsform_ea(instr, regs), 8, regs); | 1573 | op->type = MKOP(STORE, UPDATE, 8); |
1711 | goto ldst_done; | 1574 | break; |
1712 | } | 1575 | } |
1713 | break; | 1576 | break; |
1714 | #endif /* __powerpc64__ */ | 1577 | #endif /* __powerpc64__ */ |
1715 | 1578 | ||
1716 | } | 1579 | } |
1717 | err = -EINVAL; | 1580 | return 0; |
1718 | |||
1719 | ldst_done: | ||
1720 | if (err) { | ||
1721 | regs->gpr[ra] = old_ra; | ||
1722 | return 0; /* invoke DSI if -EFAULT? */ | ||
1723 | } | ||
1724 | instr_done: | ||
1725 | regs->nip = truncate_if_32bit(regs->msr, regs->nip + 4); | ||
1726 | return 1; | ||
1727 | 1581 | ||
1728 | logical_done: | 1582 | logical_done: |
1729 | if (instr & 1) | 1583 | if (instr & 1) |
@@ -1733,5 +1587,328 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr) | |||
1733 | arith_done: | 1587 | arith_done: |
1734 | if (instr & 1) | 1588 | if (instr & 1) |
1735 | set_cr0(regs, rd); | 1589 | set_cr0(regs, rd); |
1736 | goto instr_done; | 1590 | |
1591 | instr_done: | ||
1592 | regs->nip = truncate_if_32bit(regs->msr, regs->nip + 4); | ||
1593 | return 1; | ||
1594 | |||
1595 | priv: | ||
1596 | op->type = INTERRUPT | 0x700; | ||
1597 | op->val = SRR1_PROGPRIV; | ||
1598 | return 0; | ||
1599 | |||
1600 | #ifdef CONFIG_PPC_FPU | ||
1601 | fpunavail: | ||
1602 | op->type = INTERRUPT | 0x800; | ||
1603 | return 0; | ||
1604 | #endif | ||
1605 | |||
1606 | #ifdef CONFIG_ALTIVEC | ||
1607 | vecunavail: | ||
1608 | op->type = INTERRUPT | 0xf20; | ||
1609 | return 0; | ||
1610 | #endif | ||
1611 | |||
1612 | #ifdef CONFIG_VSX | ||
1613 | vsxunavail: | ||
1614 | op->type = INTERRUPT | 0xf40; | ||
1615 | return 0; | ||
1616 | #endif | ||
1617 | } | ||
1618 | EXPORT_SYMBOL_GPL(analyse_instr); | ||
1619 | |||
1620 | /* | ||
1621 | * For PPC32 we always use stwu with r1 to change the stack pointer. | ||
1622 | * So this emulated store may corrupt the exception frame, now we | ||
1623 | * have to provide the exception frame trampoline, which is pushed | ||
1624 | * below the kprobed function stack. So we only update gpr[1] but | ||
1625 | * don't emulate the real store operation. We will do real store | ||
1626 | * operation safely in exception return code by checking this flag. | ||
1627 | */ | ||
1628 | static __kprobes int handle_stack_update(unsigned long ea, struct pt_regs *regs) | ||
1629 | { | ||
1630 | #ifdef CONFIG_PPC32 | ||
1631 | /* | ||
1632 | * Check if we will touch kernel stack overflow | ||
1633 | */ | ||
1634 | if (ea - STACK_INT_FRAME_SIZE <= current->thread.ksp_limit) { | ||
1635 | printk(KERN_CRIT "Can't kprobe this since kernel stack would overflow.\n"); | ||
1636 | return -EINVAL; | ||
1637 | } | ||
1638 | #endif /* CONFIG_PPC32 */ | ||
1639 | /* | ||
1640 | * Check if we already set since that means we'll | ||
1641 | * lose the previous value. | ||
1642 | */ | ||
1643 | WARN_ON(test_thread_flag(TIF_EMULATE_STACK_STORE)); | ||
1644 | set_thread_flag(TIF_EMULATE_STACK_STORE); | ||
1645 | return 0; | ||
1646 | } | ||
1647 | |||
1648 | static __kprobes void do_signext(unsigned long *valp, int size) | ||
1649 | { | ||
1650 | switch (size) { | ||
1651 | case 2: | ||
1652 | *valp = (signed short) *valp; | ||
1653 | break; | ||
1654 | case 4: | ||
1655 | *valp = (signed int) *valp; | ||
1656 | break; | ||
1657 | } | ||
1658 | } | ||
1659 | |||
1660 | static __kprobes void do_byterev(unsigned long *valp, int size) | ||
1661 | { | ||
1662 | switch (size) { | ||
1663 | case 2: | ||
1664 | *valp = byterev_2(*valp); | ||
1665 | break; | ||
1666 | case 4: | ||
1667 | *valp = byterev_4(*valp); | ||
1668 | break; | ||
1669 | #ifdef __powerpc64__ | ||
1670 | case 8: | ||
1671 | *valp = byterev_8(*valp); | ||
1672 | break; | ||
1673 | #endif | ||
1674 | } | ||
1675 | } | ||
1676 | |||
1677 | /* | ||
1678 | * Emulate instructions that cause a transfer of control, | ||
1679 | * loads and stores, and a few other instructions. | ||
1680 | * Returns 1 if the step was emulated, 0 if not, | ||
1681 | * or -1 if the instruction is one that should not be stepped, | ||
1682 | * such as an rfid, or a mtmsrd that would clear MSR_RI. | ||
1683 | */ | ||
1684 | int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr) | ||
1685 | { | ||
1686 | struct instruction_op op; | ||
1687 | int r, err, size; | ||
1688 | unsigned long val; | ||
1689 | unsigned int cr; | ||
1690 | int rd; | ||
1691 | |||
1692 | r = analyse_instr(&op, regs, instr); | ||
1693 | if (r != 0) | ||
1694 | return r; | ||
1695 | |||
1696 | err = 0; | ||
1697 | size = GETSIZE(op.type); | ||
1698 | switch (op.type & INSTR_TYPE_MASK) { | ||
1699 | case CACHEOP: | ||
1700 | if (!address_ok(regs, op.ea, 8)) | ||
1701 | return 0; | ||
1702 | switch (op.type & CACHEOP_MASK) { | ||
1703 | case DCBST: | ||
1704 | __cacheop_user_asmx(op.ea, err, "dcbst"); | ||
1705 | break; | ||
1706 | case DCBF: | ||
1707 | __cacheop_user_asmx(op.ea, err, "dcbf"); | ||
1708 | break; | ||
1709 | case DCBTST: | ||
1710 | if (op.reg == 0) | ||
1711 | prefetchw((void *) op.ea); | ||
1712 | break; | ||
1713 | case DCBT: | ||
1714 | if (op.reg == 0) | ||
1715 | prefetch((void *) op.ea); | ||
1716 | break; | ||
1717 | } | ||
1718 | if (err) | ||
1719 | return 0; | ||
1720 | goto instr_done; | ||
1721 | |||
1722 | case LARX: | ||
1723 | if (regs->msr & MSR_LE) | ||
1724 | return 0; | ||
1725 | if (op.ea & (size - 1)) | ||
1726 | break; /* can't handle misaligned */ | ||
1727 | err = -EFAULT; | ||
1728 | if (!address_ok(regs, op.ea, size)) | ||
1729 | goto ldst_done; | ||
1730 | err = 0; | ||
1731 | switch (size) { | ||
1732 | case 4: | ||
1733 | __get_user_asmx(val, op.ea, err, "lwarx"); | ||
1734 | break; | ||
1735 | case 8: | ||
1736 | __get_user_asmx(val, op.ea, err, "ldarx"); | ||
1737 | break; | ||
1738 | default: | ||
1739 | return 0; | ||
1740 | } | ||
1741 | if (!err) | ||
1742 | regs->gpr[op.reg] = val; | ||
1743 | goto ldst_done; | ||
1744 | |||
1745 | case STCX: | ||
1746 | if (regs->msr & MSR_LE) | ||
1747 | return 0; | ||
1748 | if (op.ea & (size - 1)) | ||
1749 | break; /* can't handle misaligned */ | ||
1750 | err = -EFAULT; | ||
1751 | if (!address_ok(regs, op.ea, size)) | ||
1752 | goto ldst_done; | ||
1753 | err = 0; | ||
1754 | switch (size) { | ||
1755 | case 4: | ||
1756 | __put_user_asmx(op.val, op.ea, err, "stwcx.", cr); | ||
1757 | break; | ||
1758 | case 8: | ||
1759 | __put_user_asmx(op.val, op.ea, err, "stdcx.", cr); | ||
1760 | break; | ||
1761 | default: | ||
1762 | return 0; | ||
1763 | } | ||
1764 | if (!err) | ||
1765 | regs->ccr = (regs->ccr & 0x0fffffff) | | ||
1766 | (cr & 0xe0000000) | | ||
1767 | ((regs->xer >> 3) & 0x10000000); | ||
1768 | goto ldst_done; | ||
1769 | |||
1770 | case LOAD: | ||
1771 | if (regs->msr & MSR_LE) | ||
1772 | return 0; | ||
1773 | err = read_mem(®s->gpr[op.reg], op.ea, size, regs); | ||
1774 | if (!err) { | ||
1775 | if (op.type & SIGNEXT) | ||
1776 | do_signext(®s->gpr[op.reg], size); | ||
1777 | if (op.type & BYTEREV) | ||
1778 | do_byterev(®s->gpr[op.reg], size); | ||
1779 | } | ||
1780 | goto ldst_done; | ||
1781 | |||
1782 | case LOAD_FP: | ||
1783 | if (regs->msr & MSR_LE) | ||
1784 | return 0; | ||
1785 | if (size == 4) | ||
1786 | err = do_fp_load(op.reg, do_lfs, op.ea, size, regs); | ||
1787 | else | ||
1788 | err = do_fp_load(op.reg, do_lfd, op.ea, size, regs); | ||
1789 | goto ldst_done; | ||
1790 | |||
1791 | #ifdef CONFIG_ALTIVEC | ||
1792 | case LOAD_VMX: | ||
1793 | if (regs->msr & MSR_LE) | ||
1794 | return 0; | ||
1795 | err = do_vec_load(op.reg, do_lvx, op.ea & ~0xfUL, regs); | ||
1796 | goto ldst_done; | ||
1797 | #endif | ||
1798 | #ifdef CONFIG_VSX | ||
1799 | case LOAD_VSX: | ||
1800 | if (regs->msr & MSR_LE) | ||
1801 | return 0; | ||
1802 | err = do_vsx_load(op.reg, do_lxvd2x, op.ea, regs); | ||
1803 | goto ldst_done; | ||
1804 | #endif | ||
1805 | case LOAD_MULTI: | ||
1806 | if (regs->msr & MSR_LE) | ||
1807 | return 0; | ||
1808 | rd = op.reg; | ||
1809 | do { | ||
1810 | err = read_mem(®s->gpr[rd], op.ea, 4, regs); | ||
1811 | if (err) | ||
1812 | return 0; | ||
1813 | op.ea += 4; | ||
1814 | } while (++rd < 32); | ||
1815 | goto instr_done; | ||
1816 | |||
1817 | case STORE: | ||
1818 | if (regs->msr & MSR_LE) | ||
1819 | return 0; | ||
1820 | if ((op.type & UPDATE) && size == sizeof(long) && | ||
1821 | op.reg == 1 && op.update_reg == 1 && | ||
1822 | !(regs->msr & MSR_PR) && | ||
1823 | op.ea >= regs->gpr[1] - STACK_INT_FRAME_SIZE) { | ||
1824 | err = handle_stack_update(op.ea, regs); | ||
1825 | goto ldst_done; | ||
1826 | } | ||
1827 | err = write_mem(op.val, op.ea, size, regs); | ||
1828 | goto ldst_done; | ||
1829 | |||
1830 | case STORE_FP: | ||
1831 | if (regs->msr & MSR_LE) | ||
1832 | return 0; | ||
1833 | if (size == 4) | ||
1834 | err = do_fp_store(op.reg, do_stfs, op.ea, size, regs); | ||
1835 | else | ||
1836 | err = do_fp_store(op.reg, do_stfd, op.ea, size, regs); | ||
1837 | goto ldst_done; | ||
1838 | |||
1839 | #ifdef CONFIG_ALTIVEC | ||
1840 | case STORE_VMX: | ||
1841 | if (regs->msr & MSR_LE) | ||
1842 | return 0; | ||
1843 | err = do_vec_store(op.reg, do_stvx, op.ea & ~0xfUL, regs); | ||
1844 | goto ldst_done; | ||
1845 | #endif | ||
1846 | #ifdef CONFIG_VSX | ||
1847 | case STORE_VSX: | ||
1848 | if (regs->msr & MSR_LE) | ||
1849 | return 0; | ||
1850 | err = do_vsx_store(op.reg, do_stxvd2x, op.ea, regs); | ||
1851 | goto ldst_done; | ||
1852 | #endif | ||
1853 | case STORE_MULTI: | ||
1854 | if (regs->msr & MSR_LE) | ||
1855 | return 0; | ||
1856 | rd = op.reg; | ||
1857 | do { | ||
1858 | err = write_mem(regs->gpr[rd], op.ea, 4, regs); | ||
1859 | if (err) | ||
1860 | return 0; | ||
1861 | op.ea += 4; | ||
1862 | } while (++rd < 32); | ||
1863 | goto instr_done; | ||
1864 | |||
1865 | case MFMSR: | ||
1866 | regs->gpr[op.reg] = regs->msr & MSR_MASK; | ||
1867 | goto instr_done; | ||
1868 | |||
1869 | case MTMSR: | ||
1870 | val = regs->gpr[op.reg]; | ||
1871 | if ((val & MSR_RI) == 0) | ||
1872 | /* can't step mtmsr[d] that would clear MSR_RI */ | ||
1873 | return -1; | ||
1874 | /* here op.val is the mask of bits to change */ | ||
1875 | regs->msr = (regs->msr & ~op.val) | (val & op.val); | ||
1876 | goto instr_done; | ||
1877 | |||
1878 | #ifdef CONFIG_PPC64 | ||
1879 | case SYSCALL: /* sc */ | ||
1880 | /* | ||
1881 | * N.B. this uses knowledge about how the syscall | ||
1882 | * entry code works. If that is changed, this will | ||
1883 | * need to be changed also. | ||
1884 | */ | ||
1885 | if (regs->gpr[0] == 0x1ebe && | ||
1886 | cpu_has_feature(CPU_FTR_REAL_LE)) { | ||
1887 | regs->msr ^= MSR_LE; | ||
1888 | goto instr_done; | ||
1889 | } | ||
1890 | regs->gpr[9] = regs->gpr[13]; | ||
1891 | regs->gpr[10] = MSR_KERNEL; | ||
1892 | regs->gpr[11] = regs->nip + 4; | ||
1893 | regs->gpr[12] = regs->msr & MSR_MASK; | ||
1894 | regs->gpr[13] = (unsigned long) get_paca(); | ||
1895 | regs->nip = (unsigned long) &system_call_common; | ||
1896 | regs->msr = MSR_KERNEL; | ||
1897 | return 1; | ||
1898 | |||
1899 | case RFI: | ||
1900 | return -1; | ||
1901 | #endif | ||
1902 | } | ||
1903 | return 0; | ||
1904 | |||
1905 | ldst_done: | ||
1906 | if (err) | ||
1907 | return 0; | ||
1908 | if (op.type & UPDATE) | ||
1909 | regs->gpr[op.update_reg] = op.ea; | ||
1910 | |||
1911 | instr_done: | ||
1912 | regs->nip = truncate_if_32bit(regs->msr, regs->nip + 4); | ||
1913 | return 1; | ||
1737 | } | 1914 | } |