.. | .. |
---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0-or-later */ |
---|
1 | 2 | /* |
---|
2 | 3 | * Boot code and exception vectors for Book3E processors |
---|
3 | 4 | * |
---|
4 | 5 | * Copyright (C) 2007 Ben. Herrenschmidt (benh@kernel.crashing.org), IBM Corp. |
---|
5 | | - * |
---|
6 | | - * This program is free software; you can redistribute it and/or |
---|
7 | | - * modify it under the terms of the GNU General Public License |
---|
8 | | - * as published by the Free Software Foundation; either version |
---|
9 | | - * 2 of the License, or (at your option) any later version. |
---|
10 | 6 | */ |
---|
11 | 7 | |
---|
12 | 8 | #include <linux/threads.h> |
---|
.. | .. |
---|
28 | 24 | #include <asm/kvm_asm.h> |
---|
29 | 25 | #include <asm/kvm_booke_hv_asm.h> |
---|
30 | 26 | #include <asm/feature-fixups.h> |
---|
| 27 | +#include <asm/context_tracking.h> |
---|
31 | 28 | |
---|
32 | 29 | /* XXX This will ultimately add space for a special exception save |
---|
33 | 30 | * structure used to save things like SRR0/SRR1, SPRGs, MAS, etc... |
---|
.. | .. |
---|
76 | 73 | ld r3,_MSR(r1) |
---|
77 | 74 | andi. r3,r3,MSR_PR |
---|
78 | 75 | bnelr |
---|
79 | | - |
---|
80 | | - /* Copy info into temporary exception thread info */ |
---|
81 | | - ld r11,PACAKSAVE(r13) |
---|
82 | | - CURRENT_THREAD_INFO(r11, r11) |
---|
83 | | - CURRENT_THREAD_INFO(r12, r1) |
---|
84 | | - ld r10,TI_FLAGS(r11) |
---|
85 | | - std r10,TI_FLAGS(r12) |
---|
86 | | - ld r10,TI_PREEMPT(r11) |
---|
87 | | - std r10,TI_PREEMPT(r12) |
---|
88 | | - ld r10,TI_TASK(r11) |
---|
89 | | - std r10,TI_TASK(r12) |
---|
90 | 76 | |
---|
91 | 77 | /* |
---|
92 | 78 | * Advance to the next TLB exception frame for handler |
---|
.. | .. |
---|
505 | 491 | * interrupts happen before the wait instruction. |
---|
506 | 492 | */ |
---|
507 | 493 | #define CHECK_NAPPING() \ |
---|
508 | | - CURRENT_THREAD_INFO(r11, r1); \ |
---|
| 494 | + ld r11, PACA_THREAD_INFO(r13); \ |
---|
509 | 495 | ld r10,TI_LOCAL_FLAGS(r11); \ |
---|
510 | 496 | andi. r9,r10,_TLF_NAPPING; \ |
---|
511 | 497 | beq+ 1f; \ |
---|
.. | .. |
---|
765 | 751 | ld r15,PACATOC(r13) |
---|
766 | 752 | ld r14,interrupt_base_book3e@got(r15) |
---|
767 | 753 | ld r15,__end_interrupts@got(r15) |
---|
768 | | -#else |
---|
769 | | - LOAD_REG_IMMEDIATE(r14,interrupt_base_book3e) |
---|
770 | | - LOAD_REG_IMMEDIATE(r15,__end_interrupts) |
---|
771 | | -#endif |
---|
772 | 754 | cmpld cr0,r10,r14 |
---|
773 | 755 | cmpld cr1,r10,r15 |
---|
| 756 | +#else |
---|
| 757 | + LOAD_REG_IMMEDIATE_SYM(r14, r15, interrupt_base_book3e) |
---|
| 758 | + cmpld cr0, r10, r14 |
---|
| 759 | + LOAD_REG_IMMEDIATE_SYM(r14, r15, __end_interrupts) |
---|
| 760 | + cmpld cr1, r10, r14 |
---|
| 761 | +#endif |
---|
774 | 762 | blt+ cr0,1f |
---|
775 | 763 | bge+ cr1,1f |
---|
776 | 764 | |
---|
.. | .. |
---|
835 | 823 | ld r15,PACATOC(r13) |
---|
836 | 824 | ld r14,interrupt_base_book3e@got(r15) |
---|
837 | 825 | ld r15,__end_interrupts@got(r15) |
---|
838 | | -#else |
---|
839 | | - LOAD_REG_IMMEDIATE(r14,interrupt_base_book3e) |
---|
840 | | - LOAD_REG_IMMEDIATE(r15,__end_interrupts) |
---|
841 | | -#endif |
---|
842 | 826 | cmpld cr0,r10,r14 |
---|
843 | 827 | cmpld cr1,r10,r15 |
---|
| 828 | +#else |
---|
| 829 | + LOAD_REG_IMMEDIATE_SYM(r14, r15, interrupt_base_book3e) |
---|
| 830 | + cmpld cr0, r10, r14 |
---|
| 831 | + LOAD_REG_IMMEDIATE_SYM(r14, r15,__end_interrupts) |
---|
| 832 | + cmpld cr1, r10, r14 |
---|
| 833 | +#endif |
---|
844 | 834 | blt+ cr0,1f |
---|
845 | 835 | bge+ cr1,1f |
---|
846 | 836 | |
---|
.. | .. |
---|
998 | 988 | .endm |
---|
999 | 989 | |
---|
1000 | 990 | masked_interrupt_book3e_0x500: |
---|
1001 | | - // XXX When adding support for EPR, use PACA_IRQ_EE_EDGE |
---|
1002 | 991 | masked_interrupt_book3e PACA_IRQ_EE 1 |
---|
1003 | 992 | |
---|
1004 | 993 | masked_interrupt_book3e_0x900: |
---|
.. | .. |
---|
1012 | 1001 | masked_interrupt_book3e_0x280: |
---|
1013 | 1002 | masked_interrupt_book3e_0x2c0: |
---|
1014 | 1003 | masked_interrupt_book3e PACA_IRQ_DBELL 0 |
---|
1015 | | - |
---|
1016 | | -/* |
---|
1017 | | - * Called from arch_local_irq_enable when an interrupt needs |
---|
1018 | | - * to be resent. r3 contains either 0x500,0x900,0x260 or 0x280 |
---|
1019 | | - * to indicate the kind of interrupt. MSR:EE is already off. |
---|
1020 | | - * We generate a stackframe like if a real interrupt had happened. |
---|
1021 | | - * |
---|
1022 | | - * Note: While MSR:EE is off, we need to make sure that _MSR |
---|
1023 | | - * in the generated frame has EE set to 1 or the exception |
---|
1024 | | - * handler will not properly re-enable them. |
---|
1025 | | - */ |
---|
1026 | | -_GLOBAL(__replay_interrupt) |
---|
1027 | | - /* We are going to jump to the exception common code which |
---|
1028 | | - * will retrieve various register values from the PACA which |
---|
1029 | | - * we don't give a damn about. |
---|
1030 | | - */ |
---|
1031 | | - mflr r10 |
---|
1032 | | - mfmsr r11 |
---|
1033 | | - mfcr r4 |
---|
1034 | | - mtspr SPRN_SPRG_GEN_SCRATCH,r13; |
---|
1035 | | - std r1,PACA_EXGEN+EX_R1(r13); |
---|
1036 | | - stw r4,PACA_EXGEN+EX_CR(r13); |
---|
1037 | | - ori r11,r11,MSR_EE |
---|
1038 | | - subi r1,r1,INT_FRAME_SIZE; |
---|
1039 | | - cmpwi cr0,r3,0x500 |
---|
1040 | | - beq exc_0x500_common |
---|
1041 | | - cmpwi cr0,r3,0x900 |
---|
1042 | | - beq exc_0x900_common |
---|
1043 | | - cmpwi cr0,r3,0x280 |
---|
1044 | | - beq exc_0x280_common |
---|
1045 | | - blr |
---|
1046 | | - |
---|
1047 | 1004 | |
---|
1048 | 1005 | /* |
---|
1049 | 1006 | * This is called from 0x300 and 0x400 handlers after the prologs with |
---|
.. | .. |
---|
1084 | 1041 | bl alignment_exception |
---|
1085 | 1042 | b ret_from_except |
---|
1086 | 1043 | |
---|
1087 | | -/* |
---|
1088 | | - * We branch here from entry_64.S for the last stage of the exception |
---|
1089 | | - * return code path. MSR:EE is expected to be off at that point |
---|
1090 | | - */ |
---|
1091 | | -_GLOBAL(exception_return_book3e) |
---|
1092 | | - b 1f |
---|
| 1044 | + .align 7 |
---|
| 1045 | +_GLOBAL(ret_from_except) |
---|
| 1046 | + ld r11,_TRAP(r1) |
---|
| 1047 | + andi. r0,r11,1 |
---|
| 1048 | + bne ret_from_except_lite |
---|
| 1049 | + REST_NVGPRS(r1) |
---|
| 1050 | + |
---|
| 1051 | +_GLOBAL(ret_from_except_lite) |
---|
| 1052 | + /* |
---|
| 1053 | + * Disable interrupts so that current_thread_info()->flags |
---|
| 1054 | + * can't change between when we test it and when we return |
---|
| 1055 | + * from the interrupt. |
---|
| 1056 | + */ |
---|
| 1057 | + wrteei 0 |
---|
| 1058 | + |
---|
| 1059 | + ld r9, PACA_THREAD_INFO(r13) |
---|
| 1060 | + ld r3,_MSR(r1) |
---|
| 1061 | + ld r10,PACACURRENT(r13) |
---|
| 1062 | + ld r4,TI_FLAGS(r9) |
---|
| 1063 | + andi. r3,r3,MSR_PR |
---|
| 1064 | + beq resume_kernel |
---|
| 1065 | + lwz r3,(THREAD+THREAD_DBCR0)(r10) |
---|
| 1066 | + |
---|
| 1067 | + /* Check current_thread_info()->flags */ |
---|
| 1068 | + andi. r0,r4,_TIF_USER_WORK_MASK |
---|
| 1069 | + bne 1f |
---|
| 1070 | + /* |
---|
| 1071 | + * Check to see if the dbcr0 register is set up to debug. |
---|
| 1072 | + * Use the internal debug mode bit to do this. |
---|
| 1073 | + */ |
---|
| 1074 | + andis. r0,r3,DBCR0_IDM@h |
---|
| 1075 | + beq restore |
---|
| 1076 | + mfmsr r0 |
---|
| 1077 | + rlwinm r0,r0,0,~MSR_DE /* Clear MSR.DE */ |
---|
| 1078 | + mtmsr r0 |
---|
| 1079 | + mtspr SPRN_DBCR0,r3 |
---|
| 1080 | + li r10, -1 |
---|
| 1081 | + mtspr SPRN_DBSR,r10 |
---|
| 1082 | + b restore |
---|
| 1083 | +1: andi. r0,r4,_TIF_NEED_RESCHED |
---|
| 1084 | + beq 2f |
---|
| 1085 | + bl restore_interrupts |
---|
| 1086 | + SCHEDULE_USER |
---|
| 1087 | + b ret_from_except_lite |
---|
| 1088 | +2: |
---|
| 1089 | + bl save_nvgprs |
---|
| 1090 | + /* |
---|
| 1091 | + * Use a non volatile GPR to save and restore our thread_info flags |
---|
| 1092 | + * across the call to restore_interrupts. |
---|
| 1093 | + */ |
---|
| 1094 | + mr r30,r4 |
---|
| 1095 | + bl restore_interrupts |
---|
| 1096 | + mr r4,r30 |
---|
| 1097 | + addi r3,r1,STACK_FRAME_OVERHEAD |
---|
| 1098 | + bl do_notify_resume |
---|
| 1099 | + b ret_from_except |
---|
| 1100 | + |
---|
| 1101 | +resume_kernel: |
---|
| 1102 | + /* check current_thread_info, _TIF_EMULATE_STACK_STORE */ |
---|
| 1103 | + andis. r8,r4,_TIF_EMULATE_STACK_STORE@h |
---|
| 1104 | + beq+ 1f |
---|
| 1105 | + |
---|
| 1106 | + addi r8,r1,INT_FRAME_SIZE /* Get the kprobed function entry */ |
---|
| 1107 | + |
---|
| 1108 | + ld r3,GPR1(r1) |
---|
| 1109 | + subi r3,r3,INT_FRAME_SIZE /* dst: Allocate a trampoline exception frame */ |
---|
| 1110 | + mr r4,r1 /* src: current exception frame */ |
---|
| 1111 | + mr r1,r3 /* Reroute the trampoline frame to r1 */ |
---|
| 1112 | + |
---|
| 1113 | + /* Copy from the original to the trampoline. */ |
---|
| 1114 | + li r5,INT_FRAME_SIZE/8 /* size: INT_FRAME_SIZE */ |
---|
| 1115 | + li r6,0 /* start offset: 0 */ |
---|
| 1116 | + mtctr r5 |
---|
| 1117 | +2: ldx r0,r6,r4 |
---|
| 1118 | + stdx r0,r6,r3 |
---|
| 1119 | + addi r6,r6,8 |
---|
| 1120 | + bdnz 2b |
---|
| 1121 | + |
---|
| 1122 | + /* Do real store operation to complete stdu */ |
---|
| 1123 | + ld r5,GPR1(r1) |
---|
| 1124 | + std r8,0(r5) |
---|
| 1125 | + |
---|
| 1126 | + /* Clear _TIF_EMULATE_STACK_STORE flag */ |
---|
| 1127 | + lis r11,_TIF_EMULATE_STACK_STORE@h |
---|
| 1128 | + addi r5,r9,TI_FLAGS |
---|
| 1129 | +0: ldarx r4,0,r5 |
---|
| 1130 | + andc r4,r4,r11 |
---|
| 1131 | + stdcx. r4,0,r5 |
---|
| 1132 | + bne- 0b |
---|
| 1133 | +1: |
---|
| 1134 | + |
---|
| 1135 | +#ifdef CONFIG_PREEMPT |
---|
| 1136 | + /* Check if we need to preempt */ |
---|
| 1137 | + andi. r0,r4,_TIF_NEED_RESCHED |
---|
| 1138 | + beq+ restore |
---|
| 1139 | + /* Check that preempt_count() == 0 and interrupts are enabled */ |
---|
| 1140 | + lwz r8,TI_PREEMPT(r9) |
---|
| 1141 | + cmpwi cr0,r8,0 |
---|
| 1142 | + bne restore |
---|
| 1143 | + ld r0,SOFTE(r1) |
---|
| 1144 | + andi. r0,r0,IRQS_DISABLED |
---|
| 1145 | + bne restore |
---|
| 1146 | + |
---|
| 1147 | + /* |
---|
| 1148 | + * Here we are preempting the current task. We want to make |
---|
| 1149 | + * sure we are soft-disabled first and reconcile irq state. |
---|
| 1150 | + */ |
---|
| 1151 | + RECONCILE_IRQ_STATE(r3,r4) |
---|
| 1152 | + bl preempt_schedule_irq |
---|
| 1153 | + |
---|
| 1154 | + /* |
---|
| 1155 | + * arch_local_irq_restore() from preempt_schedule_irq above may |
---|
| 1156 | + * enable hard interrupt but we really should disable interrupts |
---|
| 1157 | + * when we return from the interrupt, and so that we don't get |
---|
| 1158 | + * interrupted after loading SRR0/1. |
---|
| 1159 | + */ |
---|
| 1160 | + wrteei 0 |
---|
| 1161 | +#endif /* CONFIG_PREEMPT */ |
---|
| 1162 | + |
---|
| 1163 | +restore: |
---|
| 1164 | + /* |
---|
| 1165 | + * This is the main kernel exit path. First we check if we |
---|
| 1166 | + * are about to re-enable interrupts |
---|
| 1167 | + */ |
---|
| 1168 | + ld r5,SOFTE(r1) |
---|
| 1169 | + lbz r6,PACAIRQSOFTMASK(r13) |
---|
| 1170 | + andi. r5,r5,IRQS_DISABLED |
---|
| 1171 | + bne .Lrestore_irq_off |
---|
| 1172 | + |
---|
| 1173 | + /* We are enabling, were we already enabled ? Yes, just return */ |
---|
| 1174 | + andi. r6,r6,IRQS_DISABLED |
---|
| 1175 | + beq cr0,fast_exception_return |
---|
| 1176 | + |
---|
| 1177 | + /* |
---|
| 1178 | + * We are about to soft-enable interrupts (we are hard disabled |
---|
| 1179 | + * at this point). We check if there's anything that needs to |
---|
| 1180 | + * be replayed first. |
---|
| 1181 | + */ |
---|
| 1182 | + lbz r0,PACAIRQHAPPENED(r13) |
---|
| 1183 | + cmpwi cr0,r0,0 |
---|
| 1184 | + bne- .Lrestore_check_irq_replay |
---|
| 1185 | + |
---|
| 1186 | + /* |
---|
| 1187 | + * Get here when nothing happened while soft-disabled, just |
---|
| 1188 | + * soft-enable and move-on. We will hard-enable as a side |
---|
| 1189 | + * effect of rfi |
---|
| 1190 | + */ |
---|
| 1191 | +.Lrestore_no_replay: |
---|
| 1192 | + TRACE_ENABLE_INTS |
---|
| 1193 | + li r0,IRQS_ENABLED |
---|
| 1194 | + stb r0,PACAIRQSOFTMASK(r13); |
---|
1093 | 1195 | |
---|
1094 | 1196 | /* This is the return from load_up_fpu fast path which could do with |
---|
1095 | 1197 | * less GPR restores in fact, but for now we have a single return path |
---|
1096 | 1198 | */ |
---|
1097 | | - .globl fast_exception_return |
---|
1098 | 1199 | fast_exception_return: |
---|
1099 | 1200 | wrteei 0 |
---|
1100 | 1201 | 1: mr r0,r13 |
---|
.. | .. |
---|
1134 | 1235 | ld r11,PACA_EXGEN+EX_R11(r13) |
---|
1135 | 1236 | mfspr r13,SPRN_SPRG_GEN_SCRATCH |
---|
1136 | 1237 | rfi |
---|
| 1238 | + |
---|
| 1239 | + /* |
---|
| 1240 | + * We are returning to a context with interrupts soft disabled. |
---|
| 1241 | + * |
---|
| 1242 | + * However, we may also about to hard enable, so we need to |
---|
| 1243 | + * make sure that in this case, we also clear PACA_IRQ_HARD_DIS |
---|
| 1244 | + * or that bit can get out of sync and bad things will happen |
---|
| 1245 | + */ |
---|
| 1246 | +.Lrestore_irq_off: |
---|
| 1247 | + ld r3,_MSR(r1) |
---|
| 1248 | + lbz r7,PACAIRQHAPPENED(r13) |
---|
| 1249 | + andi. r0,r3,MSR_EE |
---|
| 1250 | + beq 1f |
---|
| 1251 | + rlwinm r7,r7,0,~PACA_IRQ_HARD_DIS |
---|
| 1252 | + stb r7,PACAIRQHAPPENED(r13) |
---|
| 1253 | +1: |
---|
| 1254 | +#if defined(CONFIG_PPC_IRQ_SOFT_MASK_DEBUG) && defined(CONFIG_BUG) |
---|
| 1255 | + /* The interrupt should not have soft enabled. */ |
---|
| 1256 | + lbz r7,PACAIRQSOFTMASK(r13) |
---|
| 1257 | +1: tdeqi r7,IRQS_ENABLED |
---|
| 1258 | + EMIT_BUG_ENTRY 1b,__FILE__,__LINE__,BUGFLAG_WARNING |
---|
| 1259 | +#endif |
---|
| 1260 | + b fast_exception_return |
---|
| 1261 | + |
---|
| 1262 | + /* |
---|
| 1263 | + * Something did happen, check if a re-emit is needed |
---|
| 1264 | + * (this also clears paca->irq_happened) |
---|
| 1265 | + */ |
---|
| 1266 | +.Lrestore_check_irq_replay: |
---|
| 1267 | + /* XXX: We could implement a fast path here where we check |
---|
| 1268 | + * for irq_happened being just 0x01, in which case we can |
---|
| 1269 | + * clear it and return. That means that we would potentially |
---|
| 1270 | + * miss a decrementer having wrapped all the way around. |
---|
| 1271 | + * |
---|
| 1272 | + * Still, this might be useful for things like hash_page |
---|
| 1273 | + */ |
---|
| 1274 | + bl __check_irq_replay |
---|
| 1275 | + cmpwi cr0,r3,0 |
---|
| 1276 | + beq .Lrestore_no_replay |
---|
| 1277 | + |
---|
| 1278 | + /* |
---|
| 1279 | + * We need to re-emit an interrupt. We do so by re-using our |
---|
| 1280 | + * existing exception frame. We first change the trap value, |
---|
| 1281 | + * but we need to ensure we preserve the low nibble of it |
---|
| 1282 | + */ |
---|
| 1283 | + ld r4,_TRAP(r1) |
---|
| 1284 | + clrldi r4,r4,60 |
---|
| 1285 | + or r4,r4,r3 |
---|
| 1286 | + std r4,_TRAP(r1) |
---|
| 1287 | + |
---|
| 1288 | + /* |
---|
| 1289 | + * PACA_IRQ_HARD_DIS won't always be set here, so set it now |
---|
| 1290 | + * to reconcile the IRQ state. Tracing is already accounted for. |
---|
| 1291 | + */ |
---|
| 1292 | + lbz r4,PACAIRQHAPPENED(r13) |
---|
| 1293 | + ori r4,r4,PACA_IRQ_HARD_DIS |
---|
| 1294 | + stb r4,PACAIRQHAPPENED(r13) |
---|
| 1295 | + |
---|
| 1296 | + /* |
---|
| 1297 | + * Then find the right handler and call it. Interrupts are |
---|
| 1298 | + * still soft-disabled and we keep them that way. |
---|
| 1299 | + */ |
---|
| 1300 | + cmpwi cr0,r3,0x500 |
---|
| 1301 | + bne 1f |
---|
| 1302 | + addi r3,r1,STACK_FRAME_OVERHEAD; |
---|
| 1303 | + bl do_IRQ |
---|
| 1304 | + b ret_from_except |
---|
| 1305 | +1: cmpwi cr0,r3,0x900 |
---|
| 1306 | + bne 1f |
---|
| 1307 | + addi r3,r1,STACK_FRAME_OVERHEAD; |
---|
| 1308 | + bl timer_interrupt |
---|
| 1309 | + b ret_from_except |
---|
| 1310 | +#ifdef CONFIG_PPC_DOORBELL |
---|
| 1311 | +1: |
---|
| 1312 | + cmpwi cr0,r3,0x280 |
---|
| 1313 | + bne 1f |
---|
| 1314 | + addi r3,r1,STACK_FRAME_OVERHEAD; |
---|
| 1315 | + bl doorbell_exception |
---|
| 1316 | +#endif /* CONFIG_PPC_DOORBELL */ |
---|
| 1317 | +1: b ret_from_except /* What else to do here ? */ |
---|
| 1318 | + |
---|
| 1319 | +_ASM_NOKPROBE_SYMBOL(ret_from_except); |
---|
| 1320 | +_ASM_NOKPROBE_SYMBOL(ret_from_except_lite); |
---|
| 1321 | +_ASM_NOKPROBE_SYMBOL(resume_kernel); |
---|
| 1322 | +_ASM_NOKPROBE_SYMBOL(restore); |
---|
| 1323 | +_ASM_NOKPROBE_SYMBOL(fast_exception_return); |
---|
1137 | 1324 | |
---|
1138 | 1325 | /* |
---|
1139 | 1326 | * Trampolines used when spotting a bad kernel stack pointer in |
---|
.. | .. |
---|
1357 | 1544 | sync |
---|
1358 | 1545 | isync |
---|
1359 | 1546 | |
---|
1360 | | -/* |
---|
1361 | | - * The mapping only needs to be cache-coherent on SMP, except on |
---|
1362 | | - * Freescale e500mc derivatives where it's also needed for coherent DMA. |
---|
1363 | | - */ |
---|
1364 | | -#if defined(CONFIG_SMP) || defined(CONFIG_PPC_E500MC) |
---|
1365 | | -#define M_IF_NEEDED MAS2_M |
---|
1366 | | -#else |
---|
1367 | | -#define M_IF_NEEDED 0 |
---|
1368 | | -#endif |
---|
1369 | | - |
---|
1370 | 1547 | /* 6. Setup KERNELBASE mapping in TLB[0] |
---|
1371 | 1548 | * |
---|
1372 | 1549 | * r3 = MAS0 w/TLBSEL & ESEL for the entry we started in |
---|
.. | .. |
---|
1379 | 1556 | ori r6,r6,(MAS1_TSIZE(BOOK3E_PAGESZ_1GB))@l |
---|
1380 | 1557 | mtspr SPRN_MAS1,r6 |
---|
1381 | 1558 | |
---|
1382 | | - LOAD_REG_IMMEDIATE(r6, PAGE_OFFSET | M_IF_NEEDED) |
---|
| 1559 | + LOAD_REG_IMMEDIATE(r6, PAGE_OFFSET | MAS2_M_IF_NEEDED) |
---|
1383 | 1560 | mtspr SPRN_MAS2,r6 |
---|
1384 | 1561 | |
---|
1385 | 1562 | rlwinm r5,r5,0,0,25 |
---|
.. | .. |
---|
1464 | 1641 | a2_tlbinit_after_linear_map: |
---|
1465 | 1642 | |
---|
1466 | 1643 | /* Now we branch the new virtual address mapped by this entry */ |
---|
1467 | | - LOAD_REG_IMMEDIATE(r3,1f) |
---|
| 1644 | + LOAD_REG_IMMEDIATE_SYM(r3, r5, 1f) |
---|
1468 | 1645 | mtctr r3 |
---|
1469 | 1646 | bctr |
---|
1470 | 1647 | |
---|