|
@@ -17,6 +17,8 @@
|
|
|
#include <asm/asm-offsets.h>
|
|
|
#include <linux/sched.h>
|
|
|
|
|
|
+#define KSP_WORD_OFF ((TASK_THREAD + THREAD_KSP) / 4)
|
|
|
+
|
|
|
struct task_struct *__sched
|
|
|
__switch_to(struct task_struct *prev_task, struct task_struct *next_task)
|
|
|
{
|
|
@@ -45,7 +47,16 @@ __switch_to(struct task_struct *prev_task, struct task_struct *next_task)
|
|
|
#endif
|
|
|
|
|
|
/* set ksp of outgoing task in tsk->thread.ksp */
|
|
|
+#if KSP_WORD_OFF <= 255
|
|
|
"st.as sp, [%3, %1] \n\t"
|
|
|
+#else
|
|
|
+ /*
|
|
|
+ * Workaround for NR_CPUS=4k
|
|
|
+ * %1 is bigger than 255 (S9 offset for st.as)
|
|
|
+ */
|
|
|
+ "add2 r24, %3, %1 \n\t"
|
|
|
+ "st sp, [r24] \n\t"
|
|
|
+#endif
|
|
|
|
|
|
"sync \n\t"
|
|
|
|
|
@@ -97,7 +108,7 @@ __switch_to(struct task_struct *prev_task, struct task_struct *next_task)
|
|
|
/* FP/BLINK restore generated by gcc (standard func epilogue */
|
|
|
|
|
|
: "=r"(tmp)
|
|
|
- : "n"((TASK_THREAD + THREAD_KSP) / 4), "r"(next), "r"(prev)
|
|
|
+ : "n"(KSP_WORD_OFF), "r"(next), "r"(prev)
|
|
|
: "blink"
|
|
|
);
|
|
|
|