#include <asm/blackfin.h>
 
+#ifndef CONFIG_SMP
 #ifndef __ASSEMBLY__
 
 /* Data that is "mapped" into the process VM at the start of the L1 scratch
                                                get_l1_scratch_start())
 
 #endif
+#endif
 
 #endif
 
  * pass the data segment into user programs if it exists,
  * it can't hurt anything as far as I can tell
  */
+#ifndef CONFIG_SMP
 #define start_thread(_regs, _pc, _usp)                                 \
 do {                                                                   \
        set_fs(USER_DS);                                                \
                sizeof(*L1_SCRATCH_TASK_INFO));                         \
        wrusp(_usp);                                                    \
 } while(0)
+#else
+#define start_thread(_regs, _pc, _usp)                                 \
+do {                                                                   \
+       set_fs(USER_DS);                                                \
+       (_regs)->pc = (_pc);                                            \
+       if (current->mm)                                                \
+               (_regs)->p5 = current->mm->start_data;                  \
+       wrusp(_usp);                                                    \
+} while (0)
+#endif
 
 /* Forward declaration, a strange C thing */
 struct task_struct;
 
 
 asmlinkage struct task_struct *resume(struct task_struct *prev, struct task_struct *next);
 
+#ifndef CONFIG_SMP
 #define switch_to(prev,next,last) \
 do {    \
        memcpy (&task_thread_info(prev)->l1_task_info, L1_SCRATCH_TASK_INFO, \
                sizeof *L1_SCRATCH_TASK_INFO); \
        (last) = resume (prev, next);   \
 } while (0)
+#else
+#define switch_to(prev, next, last) \
+do {    \
+       (last) = resume(prev, next);   \
+} while (0)
+#endif
 
 #endif /* _BLACKFIN_SYSTEM_H */
 
        int preempt_count;      /* 0 => preemptable, <0 => BUG */
        mm_segment_t addr_limit;        /* address limit */
        struct restart_block restart_block;
+#ifndef CONFIG_SMP
        struct l1_scratch_task_info l1_task_info;
+#endif
 };
 
 /*