ARC: [SMP] Fix build failures for large NR_CPUS
[firefly-linux-kernel-4.4.55.git] / arch / arc / kernel / ctx_sw_asm.S
index d8972345e4c22ab9bd036827c76974065229cb39..65690e7fcc8cce6b3d1f76e33750f49b788d0b19 100644 (file)
@@ -14,6 +14,8 @@
 #include <asm/asm-offsets.h>
 #include <asm/linkage.h>
 
+#define KSP_WORD_OFF   ((TASK_THREAD + THREAD_KSP) / 4)
+
 ;################### Low Level Context Switch ##########################
 
        .section .sched.text,"ax",@progbits
@@ -28,8 +30,13 @@ __switch_to:
        SAVE_CALLEE_SAVED_KERNEL
 
        /* Save the now KSP in task->thread.ksp */
-       st.as  sp, [r0, (TASK_THREAD + THREAD_KSP)/4]
-
+#if KSP_WORD_OFF  <= 255
+       st.as  sp, [r0, KSP_WORD_OFF]
+#else
+       /* Workaround for NR_CPUS=4k as ST.as can only take s9 offset */
+       add2    r24, r0, KSP_WORD_OFF
+       st      sp, [r24]
+#endif
        /*
        * Return last task in r0 (return reg)
        * On ARC, Return reg = First Arg reg = r0.