We already allocated critical/machine/debug check exceptions, but
we also should initialize those associated kernel stack pointers
for use by special exceptions in the PACA.

Signed-off-by: Tiejun Chen <tiejun.c...@windriver.com>
---
 arch/powerpc/kernel/setup_64.c |   18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c
index 278ca93..5c96d92 100644
--- a/arch/powerpc/kernel/setup_64.c
+++ b/arch/powerpc/kernel/setup_64.c
@@ -526,14 +526,20 @@ static void __init exc_lvl_early_init(void)
        extern unsigned int exc_debug_debug_book3e;
 
        unsigned int i;
+       unsigned long sp;
 
        for_each_possible_cpu(i) {
-               critirq_ctx[i] = (struct thread_info *)
-                       __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
-               dbgirq_ctx[i] = (struct thread_info *)
-                       __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
-               mcheckirq_ctx[i] = (struct thread_info *)
-                       __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
+               sp = memblock_alloc(THREAD_SIZE, THREAD_SIZE);
+               critirq_ctx[i] = (struct thread_info *)__va(sp);
+               paca[i].crit_kstack = __va(sp + THREAD_SIZE);
+
+               sp = memblock_alloc(THREAD_SIZE, THREAD_SIZE);
+               dbgirq_ctx[i] = (struct thread_info *)__va(sp);
+               paca[i].dbg_kstack = __va(sp + THREAD_SIZE);
+
+               sp = memblock_alloc(THREAD_SIZE, THREAD_SIZE);
+               mcheckirq_ctx[i] = (struct thread_info *)__va(sp);
+               paca[i].mc_kstack = __va(sp + THREAD_SIZE);
        }
 
        if (cpu_has_feature(CPU_FTR_DEBUG_LVL_EXC))
-- 
1.7.9.5

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to