summaryrefslogtreecommitdiffstats
path: root/arch/mn10300/include/asm/frame.inc
diff options
context:
space:
mode:
Diffstat (limited to 'arch/mn10300/include/asm/frame.inc')
-rw-r--r--arch/mn10300/include/asm/frame.inc36
1 files changed, 36 insertions, 0 deletions
diff --git a/arch/mn10300/include/asm/frame.inc b/arch/mn10300/include/asm/frame.inc
index 5b1949bdf03..406060e5e1c 100644
--- a/arch/mn10300/include/asm/frame.inc
+++ b/arch/mn10300/include/asm/frame.inc
@@ -18,6 +18,9 @@
#ifndef __ASM_OFFSETS_H__
#include <asm/asm-offsets.h>
#endif
+#ifdef CONFIG_SMP
+#include <proc/smp-regs.h>
+#endif
#define pi break
@@ -37,9 +40,25 @@
movm [d2,d3,a2,a3,exreg0,exreg1,exother],(sp)
mov sp,fp # FRAME pointer in A3
add -12,sp # allow for calls to be made
+#ifdef CONFIG_SMP
+#ifdef CONFIG_PREEMPT /* FIXME */
+ mov epsw,d2
+ and ~EPSW_IE,epsw
+#endif
+ mov (CPUID),a0
+ add a0,a0
+ add a0,a0
+ mov (___frame,a0),a1
+ mov a1,(REG_NEXT,fp)
+ mov fp,(___frame,a0)
+#ifdef CONFIG_PREEMPT /* FIXME */
+ mov d2,epsw
+#endif
+#else /* CONFIG_SMP */
mov (__frame),a1
mov a1,(REG_NEXT,fp)
mov fp,(__frame)
+#endif /* CONFIG_SMP */
and ~EPSW_FE,epsw # disable the FPU inside the kernel
@@ -57,10 +76,27 @@
.macro RESTORE_ALL
# peel back the stack to the calling frame
# - this permits execve() to discard extra frames due to kernel syscalls
+#ifdef CONFIG_SMP
+#ifdef CONFIG_PREEMPT /* FIXME */
+ mov epsw,d2
+ and ~EPSW_IE,epsw
+#endif
+ mov (CPUID),a0
+ add a0,a0
+ add a0,a0
+ mov (___frame,a0),fp
+ mov fp,sp
+ mov (REG_NEXT,fp),d0 # userspace has regs->next == 0
+ mov d0,(___frame,a0)
+#ifdef CONFIG_PREEMPT /* FIXME */
+ mov d2,epsw
+#endif
+#else /* CONFIG_SMP */
mov (__frame),fp
mov fp,sp
mov (REG_NEXT,fp),d0 # userspace has regs->next == 0
mov d0,(__frame)
+#endif /* CONFIG_SMP */
#ifndef CONFIG_MN10300_USING_JTAG
mov (REG_EPSW,fp),d0