diff options
Diffstat (limited to 'arch/powerpc/kernel/entry_64.S')
| -rw-r--r-- | arch/powerpc/kernel/entry_64.S | 44 |
1 files changed, 36 insertions, 8 deletions
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index 3320bcac7192..2748584b767d 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S | |||
| @@ -37,6 +37,11 @@ | |||
| 37 | #include <asm/tm.h> | 37 | #include <asm/tm.h> |
| 38 | #include <asm/ppc-opcode.h> | 38 | #include <asm/ppc-opcode.h> |
| 39 | #include <asm/export.h> | 39 | #include <asm/export.h> |
| 40 | #ifdef CONFIG_PPC_BOOK3S | ||
| 41 | #include <asm/exception-64s.h> | ||
| 42 | #else | ||
| 43 | #include <asm/exception-64e.h> | ||
| 44 | #endif | ||
| 40 | 45 | ||
| 41 | /* | 46 | /* |
| 42 | * System calls. | 47 | * System calls. |
| @@ -262,13 +267,23 @@ BEGIN_FTR_SECTION | |||
| 262 | END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR) | 267 | END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR) |
| 263 | 268 | ||
| 264 | ld r13,GPR13(r1) /* only restore r13 if returning to usermode */ | 269 | ld r13,GPR13(r1) /* only restore r13 if returning to usermode */ |
| 270 | ld r2,GPR2(r1) | ||
| 271 | ld r1,GPR1(r1) | ||
| 272 | mtlr r4 | ||
| 273 | mtcr r5 | ||
| 274 | mtspr SPRN_SRR0,r7 | ||
| 275 | mtspr SPRN_SRR1,r8 | ||
| 276 | RFI_TO_USER | ||
| 277 | b . /* prevent speculative execution */ | ||
| 278 | |||
| 279 | /* exit to kernel */ | ||
| 265 | 1: ld r2,GPR2(r1) | 280 | 1: ld r2,GPR2(r1) |
| 266 | ld r1,GPR1(r1) | 281 | ld r1,GPR1(r1) |
| 267 | mtlr r4 | 282 | mtlr r4 |
| 268 | mtcr r5 | 283 | mtcr r5 |
| 269 | mtspr SPRN_SRR0,r7 | 284 | mtspr SPRN_SRR0,r7 |
| 270 | mtspr SPRN_SRR1,r8 | 285 | mtspr SPRN_SRR1,r8 |
| 271 | RFI | 286 | RFI_TO_KERNEL |
| 272 | b . /* prevent speculative execution */ | 287 | b . /* prevent speculative execution */ |
| 273 | 288 | ||
| 274 | .Lsyscall_error: | 289 | .Lsyscall_error: |
| @@ -397,8 +412,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR) | |||
| 397 | mtmsrd r10, 1 | 412 | mtmsrd r10, 1 |
| 398 | mtspr SPRN_SRR0, r11 | 413 | mtspr SPRN_SRR0, r11 |
| 399 | mtspr SPRN_SRR1, r12 | 414 | mtspr SPRN_SRR1, r12 |
| 400 | 415 | RFI_TO_USER | |
| 401 | rfid | ||
| 402 | b . /* prevent speculative execution */ | 416 | b . /* prevent speculative execution */ |
| 403 | #endif | 417 | #endif |
| 404 | _ASM_NOKPROBE_SYMBOL(system_call_common); | 418 | _ASM_NOKPROBE_SYMBOL(system_call_common); |
| @@ -878,7 +892,7 @@ BEGIN_FTR_SECTION | |||
| 878 | END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR) | 892 | END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR) |
| 879 | ACCOUNT_CPU_USER_EXIT(r13, r2, r4) | 893 | ACCOUNT_CPU_USER_EXIT(r13, r2, r4) |
| 880 | REST_GPR(13, r1) | 894 | REST_GPR(13, r1) |
| 881 | 1: | 895 | |
| 882 | mtspr SPRN_SRR1,r3 | 896 | mtspr SPRN_SRR1,r3 |
| 883 | 897 | ||
| 884 | ld r2,_CCR(r1) | 898 | ld r2,_CCR(r1) |
| @@ -891,8 +905,22 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR) | |||
| 891 | ld r3,GPR3(r1) | 905 | ld r3,GPR3(r1) |
| 892 | ld r4,GPR4(r1) | 906 | ld r4,GPR4(r1) |
| 893 | ld r1,GPR1(r1) | 907 | ld r1,GPR1(r1) |
| 908 | RFI_TO_USER | ||
| 909 | b . /* prevent speculative execution */ | ||
| 894 | 910 | ||
| 895 | rfid | 911 | 1: mtspr SPRN_SRR1,r3 |
| 912 | |||
| 913 | ld r2,_CCR(r1) | ||
| 914 | mtcrf 0xFF,r2 | ||
| 915 | ld r2,_NIP(r1) | ||
| 916 | mtspr SPRN_SRR0,r2 | ||
| 917 | |||
| 918 | ld r0,GPR0(r1) | ||
| 919 | ld r2,GPR2(r1) | ||
| 920 | ld r3,GPR3(r1) | ||
| 921 | ld r4,GPR4(r1) | ||
| 922 | ld r1,GPR1(r1) | ||
| 923 | RFI_TO_KERNEL | ||
| 896 | b . /* prevent speculative execution */ | 924 | b . /* prevent speculative execution */ |
| 897 | 925 | ||
| 898 | #endif /* CONFIG_PPC_BOOK3E */ | 926 | #endif /* CONFIG_PPC_BOOK3E */ |
| @@ -1073,7 +1101,7 @@ __enter_rtas: | |||
| 1073 | 1101 | ||
| 1074 | mtspr SPRN_SRR0,r5 | 1102 | mtspr SPRN_SRR0,r5 |
| 1075 | mtspr SPRN_SRR1,r6 | 1103 | mtspr SPRN_SRR1,r6 |
| 1076 | rfid | 1104 | RFI_TO_KERNEL |
| 1077 | b . /* prevent speculative execution */ | 1105 | b . /* prevent speculative execution */ |
| 1078 | 1106 | ||
| 1079 | rtas_return_loc: | 1107 | rtas_return_loc: |
| @@ -1098,7 +1126,7 @@ rtas_return_loc: | |||
| 1098 | 1126 | ||
| 1099 | mtspr SPRN_SRR0,r3 | 1127 | mtspr SPRN_SRR0,r3 |
| 1100 | mtspr SPRN_SRR1,r4 | 1128 | mtspr SPRN_SRR1,r4 |
| 1101 | rfid | 1129 | RFI_TO_KERNEL |
| 1102 | b . /* prevent speculative execution */ | 1130 | b . /* prevent speculative execution */ |
| 1103 | _ASM_NOKPROBE_SYMBOL(__enter_rtas) | 1131 | _ASM_NOKPROBE_SYMBOL(__enter_rtas) |
| 1104 | _ASM_NOKPROBE_SYMBOL(rtas_return_loc) | 1132 | _ASM_NOKPROBE_SYMBOL(rtas_return_loc) |
| @@ -1171,7 +1199,7 @@ _GLOBAL(enter_prom) | |||
| 1171 | LOAD_REG_IMMEDIATE(r12, MSR_SF | MSR_ISF | MSR_LE) | 1199 | LOAD_REG_IMMEDIATE(r12, MSR_SF | MSR_ISF | MSR_LE) |
| 1172 | andc r11,r11,r12 | 1200 | andc r11,r11,r12 |
| 1173 | mtsrr1 r11 | 1201 | mtsrr1 r11 |
| 1174 | rfid | 1202 | RFI_TO_KERNEL |
| 1175 | #endif /* CONFIG_PPC_BOOK3E */ | 1203 | #endif /* CONFIG_PPC_BOOK3E */ |
| 1176 | 1204 | ||
| 1177 | 1: /* Return from OF */ | 1205 | 1: /* Return from OF */ |
