diff options
-rw-r--r-- | arch/powerpc/mm/slb.c | 21 |
1 files changed, 8 insertions, 13 deletions
diff --git a/arch/powerpc/mm/slb.c b/arch/powerpc/mm/slb.c index 5b7038f248b6..227056c21eee 100644 --- a/arch/powerpc/mm/slb.c +++ b/arch/powerpc/mm/slb.c | |||
@@ -218,23 +218,18 @@ void switch_slb(struct task_struct *tsk, struct mm_struct *mm) | |||
218 | else | 218 | else |
219 | unmapped_base = TASK_UNMAPPED_BASE_USER64; | 219 | unmapped_base = TASK_UNMAPPED_BASE_USER64; |
220 | 220 | ||
221 | if (is_kernel_addr(pc)) | 221 | if (is_kernel_addr(pc) || is_kernel_addr(stack) || |
222 | return; | 222 | is_kernel_addr(unmapped_base)) |
223 | slb_allocate(pc); | ||
224 | |||
225 | if (esids_match(pc,stack)) | ||
226 | return; | 223 | return; |
227 | 224 | ||
228 | if (is_kernel_addr(stack)) | 225 | slb_allocate(pc); |
229 | return; | ||
230 | slb_allocate(stack); | ||
231 | 226 | ||
232 | if (esids_match(pc,unmapped_base) || esids_match(stack,unmapped_base)) | 227 | if (!esids_match(pc, stack)) |
233 | return; | 228 | slb_allocate(stack); |
234 | 229 | ||
235 | if (is_kernel_addr(unmapped_base)) | 230 | if (!esids_match(pc, unmapped_base) && |
236 | return; | 231 | !esids_match(stack, unmapped_base)) |
237 | slb_allocate(unmapped_base); | 232 | slb_allocate(unmapped_base); |
238 | } | 233 | } |
239 | 234 | ||
240 | static inline void patch_slb_encoding(unsigned int *insn_addr, | 235 | static inline void patch_slb_encoding(unsigned int *insn_addr, |