diff options
Diffstat (limited to 'arch/powerpc/kernel/entry_32.S')
-rw-r--r-- | arch/powerpc/kernel/entry_32.S | 129 |
1 files changed, 62 insertions, 67 deletions
diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S index 6f7eb7e00c79..4dd38f129153 100644 --- a/arch/powerpc/kernel/entry_32.S +++ b/arch/powerpc/kernel/entry_32.S | |||
@@ -63,7 +63,7 @@ debug_transfer_to_handler: | |||
63 | 63 | ||
64 | .globl crit_transfer_to_handler | 64 | .globl crit_transfer_to_handler |
65 | crit_transfer_to_handler: | 65 | crit_transfer_to_handler: |
66 | #ifdef CONFIG_FSL_BOOKE | 66 | #ifdef CONFIG_PPC_BOOK3E_MMU |
67 | mfspr r0,SPRN_MAS0 | 67 | mfspr r0,SPRN_MAS0 |
68 | stw r0,MAS0(r11) | 68 | stw r0,MAS0(r11) |
69 | mfspr r0,SPRN_MAS1 | 69 | mfspr r0,SPRN_MAS1 |
@@ -78,7 +78,7 @@ crit_transfer_to_handler: | |||
78 | mfspr r0,SPRN_MAS7 | 78 | mfspr r0,SPRN_MAS7 |
79 | stw r0,MAS7(r11) | 79 | stw r0,MAS7(r11) |
80 | #endif /* CONFIG_PHYS_64BIT */ | 80 | #endif /* CONFIG_PHYS_64BIT */ |
81 | #endif /* CONFIG_FSL_BOOKE */ | 81 | #endif /* CONFIG_PPC_BOOK3E_MMU */ |
82 | #ifdef CONFIG_44x | 82 | #ifdef CONFIG_44x |
83 | mfspr r0,SPRN_MMUCR | 83 | mfspr r0,SPRN_MMUCR |
84 | stw r0,MMUCR(r11) | 84 | stw r0,MMUCR(r11) |
@@ -914,7 +914,7 @@ exc_exit_restart_end: | |||
914 | mtspr SPRN_##exc_lvl_srr0,r9; \ | 914 | mtspr SPRN_##exc_lvl_srr0,r9; \ |
915 | mtspr SPRN_##exc_lvl_srr1,r10; | 915 | mtspr SPRN_##exc_lvl_srr1,r10; |
916 | 916 | ||
917 | #if defined(CONFIG_FSL_BOOKE) | 917 | #if defined(CONFIG_PPC_BOOK3E_MMU) |
918 | #ifdef CONFIG_PHYS_64BIT | 918 | #ifdef CONFIG_PHYS_64BIT |
919 | #define RESTORE_MAS7 \ | 919 | #define RESTORE_MAS7 \ |
920 | lwz r11,MAS7(r1); \ | 920 | lwz r11,MAS7(r1); \ |
@@ -956,7 +956,7 @@ ret_from_crit_exc: | |||
956 | lwz r10,crit_srr1@l(r10); | 956 | lwz r10,crit_srr1@l(r10); |
957 | mtspr SPRN_SRR0,r9; | 957 | mtspr SPRN_SRR0,r9; |
958 | mtspr SPRN_SRR1,r10; | 958 | mtspr SPRN_SRR1,r10; |
959 | RET_FROM_EXC_LEVEL(SPRN_CSRR0, SPRN_CSRR1, RFCI) | 959 | RET_FROM_EXC_LEVEL(SPRN_CSRR0, SPRN_CSRR1, PPC_RFCI) |
960 | #endif /* CONFIG_40x */ | 960 | #endif /* CONFIG_40x */ |
961 | 961 | ||
962 | #ifdef CONFIG_BOOKE | 962 | #ifdef CONFIG_BOOKE |
@@ -967,7 +967,7 @@ ret_from_crit_exc: | |||
967 | stw r10,KSP_LIMIT(r9) | 967 | stw r10,KSP_LIMIT(r9) |
968 | RESTORE_xSRR(SRR0,SRR1); | 968 | RESTORE_xSRR(SRR0,SRR1); |
969 | RESTORE_MMU_REGS; | 969 | RESTORE_MMU_REGS; |
970 | RET_FROM_EXC_LEVEL(SPRN_CSRR0, SPRN_CSRR1, RFCI) | 970 | RET_FROM_EXC_LEVEL(SPRN_CSRR0, SPRN_CSRR1, PPC_RFCI) |
971 | 971 | ||
972 | .globl ret_from_debug_exc | 972 | .globl ret_from_debug_exc |
973 | ret_from_debug_exc: | 973 | ret_from_debug_exc: |
@@ -981,7 +981,7 @@ ret_from_debug_exc: | |||
981 | RESTORE_xSRR(SRR0,SRR1); | 981 | RESTORE_xSRR(SRR0,SRR1); |
982 | RESTORE_xSRR(CSRR0,CSRR1); | 982 | RESTORE_xSRR(CSRR0,CSRR1); |
983 | RESTORE_MMU_REGS; | 983 | RESTORE_MMU_REGS; |
984 | RET_FROM_EXC_LEVEL(SPRN_DSRR0, SPRN_DSRR1, RFDI) | 984 | RET_FROM_EXC_LEVEL(SPRN_DSRR0, SPRN_DSRR1, PPC_RFDI) |
985 | 985 | ||
986 | .globl ret_from_mcheck_exc | 986 | .globl ret_from_mcheck_exc |
987 | ret_from_mcheck_exc: | 987 | ret_from_mcheck_exc: |
@@ -992,7 +992,7 @@ ret_from_mcheck_exc: | |||
992 | RESTORE_xSRR(CSRR0,CSRR1); | 992 | RESTORE_xSRR(CSRR0,CSRR1); |
993 | RESTORE_xSRR(DSRR0,DSRR1); | 993 | RESTORE_xSRR(DSRR0,DSRR1); |
994 | RESTORE_MMU_REGS; | 994 | RESTORE_MMU_REGS; |
995 | RET_FROM_EXC_LEVEL(SPRN_MCSRR0, SPRN_MCSRR1, RFMCI) | 995 | RET_FROM_EXC_LEVEL(SPRN_MCSRR0, SPRN_MCSRR1, PPC_RFMCI) |
996 | #endif /* CONFIG_BOOKE */ | 996 | #endif /* CONFIG_BOOKE */ |
997 | 997 | ||
998 | /* | 998 | /* |
@@ -1176,59 +1176,27 @@ _GLOBAL(_mcount) | |||
1176 | bctr | 1176 | bctr |
1177 | 1177 | ||
1178 | _GLOBAL(ftrace_caller) | 1178 | _GLOBAL(ftrace_caller) |
1179 | /* Based off of objdump optput from glibc */ | 1179 | MCOUNT_SAVE_FRAME |
1180 | stwu r1,-48(r1) | 1180 | /* r3 ends up with link register */ |
1181 | stw r3, 12(r1) | ||
1182 | stw r4, 16(r1) | ||
1183 | stw r5, 20(r1) | ||
1184 | stw r6, 24(r1) | ||
1185 | mflr r3 | ||
1186 | lwz r4, 52(r1) | ||
1187 | mfcr r5 | ||
1188 | stw r7, 28(r1) | ||
1189 | stw r8, 32(r1) | ||
1190 | stw r9, 36(r1) | ||
1191 | stw r10,40(r1) | ||
1192 | stw r3, 44(r1) | ||
1193 | stw r5, 8(r1) | ||
1194 | subi r3, r3, MCOUNT_INSN_SIZE | 1181 | subi r3, r3, MCOUNT_INSN_SIZE |
1195 | .globl ftrace_call | 1182 | .globl ftrace_call |
1196 | ftrace_call: | 1183 | ftrace_call: |
1197 | bl ftrace_stub | 1184 | bl ftrace_stub |
1198 | nop | 1185 | nop |
1199 | lwz r6, 8(r1) | 1186 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER |
1200 | lwz r0, 44(r1) | 1187 | .globl ftrace_graph_call |
1201 | lwz r3, 12(r1) | 1188 | ftrace_graph_call: |
1202 | mtctr r0 | 1189 | b ftrace_graph_stub |
1203 | lwz r4, 16(r1) | 1190 | _GLOBAL(ftrace_graph_stub) |
1204 | mtcr r6 | 1191 | #endif |
1205 | lwz r5, 20(r1) | 1192 | MCOUNT_RESTORE_FRAME |
1206 | lwz r6, 24(r1) | 1193 | /* old link register ends up in ctr reg */ |
1207 | lwz r0, 52(r1) | ||
1208 | lwz r7, 28(r1) | ||
1209 | lwz r8, 32(r1) | ||
1210 | mtlr r0 | ||
1211 | lwz r9, 36(r1) | ||
1212 | lwz r10,40(r1) | ||
1213 | addi r1, r1, 48 | ||
1214 | bctr | 1194 | bctr |
1215 | #else | 1195 | #else |
1216 | _GLOBAL(mcount) | 1196 | _GLOBAL(mcount) |
1217 | _GLOBAL(_mcount) | 1197 | _GLOBAL(_mcount) |
1218 | stwu r1,-48(r1) | 1198 | |
1219 | stw r3, 12(r1) | 1199 | MCOUNT_SAVE_FRAME |
1220 | stw r4, 16(r1) | ||
1221 | stw r5, 20(r1) | ||
1222 | stw r6, 24(r1) | ||
1223 | mflr r3 | ||
1224 | lwz r4, 52(r1) | ||
1225 | mfcr r5 | ||
1226 | stw r7, 28(r1) | ||
1227 | stw r8, 32(r1) | ||
1228 | stw r9, 36(r1) | ||
1229 | stw r10,40(r1) | ||
1230 | stw r3, 44(r1) | ||
1231 | stw r5, 8(r1) | ||
1232 | 1200 | ||
1233 | subi r3, r3, MCOUNT_INSN_SIZE | 1201 | subi r3, r3, MCOUNT_INSN_SIZE |
1234 | LOAD_REG_ADDR(r5, ftrace_trace_function) | 1202 | LOAD_REG_ADDR(r5, ftrace_trace_function) |
@@ -1236,28 +1204,55 @@ _GLOBAL(_mcount) | |||
1236 | 1204 | ||
1237 | mtctr r5 | 1205 | mtctr r5 |
1238 | bctrl | 1206 | bctrl |
1239 | |||
1240 | nop | 1207 | nop |
1241 | 1208 | ||
1242 | lwz r6, 8(r1) | 1209 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER |
1243 | lwz r0, 44(r1) | 1210 | b ftrace_graph_caller |
1244 | lwz r3, 12(r1) | 1211 | #endif |
1245 | mtctr r0 | 1212 | MCOUNT_RESTORE_FRAME |
1246 | lwz r4, 16(r1) | ||
1247 | mtcr r6 | ||
1248 | lwz r5, 20(r1) | ||
1249 | lwz r6, 24(r1) | ||
1250 | lwz r0, 52(r1) | ||
1251 | lwz r7, 28(r1) | ||
1252 | lwz r8, 32(r1) | ||
1253 | mtlr r0 | ||
1254 | lwz r9, 36(r1) | ||
1255 | lwz r10,40(r1) | ||
1256 | addi r1, r1, 48 | ||
1257 | bctr | 1213 | bctr |
1258 | #endif | 1214 | #endif |
1259 | 1215 | ||
1260 | _GLOBAL(ftrace_stub) | 1216 | _GLOBAL(ftrace_stub) |
1261 | blr | 1217 | blr |
1262 | 1218 | ||
1219 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | ||
1220 | _GLOBAL(ftrace_graph_caller) | ||
1221 | /* load r4 with local address */ | ||
1222 | lwz r4, 44(r1) | ||
1223 | subi r4, r4, MCOUNT_INSN_SIZE | ||
1224 | |||
1225 | /* get the parent address */ | ||
1226 | addi r3, r1, 52 | ||
1227 | |||
1228 | bl prepare_ftrace_return | ||
1229 | nop | ||
1230 | |||
1231 | MCOUNT_RESTORE_FRAME | ||
1232 | /* old link register ends up in ctr reg */ | ||
1233 | bctr | ||
1234 | |||
1235 | _GLOBAL(return_to_handler) | ||
1236 | /* need to save return values */ | ||
1237 | stwu r1, -32(r1) | ||
1238 | stw r3, 20(r1) | ||
1239 | stw r4, 16(r1) | ||
1240 | stw r31, 12(r1) | ||
1241 | mr r31, r1 | ||
1242 | |||
1243 | bl ftrace_return_to_handler | ||
1244 | nop | ||
1245 | |||
1246 | /* return value has real return address */ | ||
1247 | mtlr r3 | ||
1248 | |||
1249 | lwz r3, 20(r1) | ||
1250 | lwz r4, 16(r1) | ||
1251 | lwz r31,12(r1) | ||
1252 | lwz r1, 0(r1) | ||
1253 | |||
1254 | /* Jump back to real return address */ | ||
1255 | blr | ||
1256 | #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ | ||
1257 | |||
1263 | #endif /* CONFIG_MCOUNT */ | 1258 | #endif /* CONFIG_MCOUNT */ |