diff options
Diffstat (limited to 'arch/sh/kernel/process.c')
-rw-r--r-- | arch/sh/kernel/process.c | 28 |
1 files changed, 13 insertions, 15 deletions
diff --git a/arch/sh/kernel/process.c b/arch/sh/kernel/process.c index f2031314cb2b..0b1d5dd7a93b 100644 --- a/arch/sh/kernel/process.c +++ b/arch/sh/kernel/process.c | |||
@@ -81,16 +81,6 @@ void cpu_idle(void) | |||
81 | 81 | ||
82 | void machine_restart(char * __unused) | 82 | void machine_restart(char * __unused) |
83 | { | 83 | { |
84 | |||
85 | #ifdef CONFIG_KEXEC | ||
86 | struct kimage *image; | ||
87 | image = xchg(&kexec_image, 0); | ||
88 | if (image) { | ||
89 | machine_shutdown(); | ||
90 | machine_kexec(image); | ||
91 | } | ||
92 | #endif | ||
93 | |||
94 | /* SR.BL=1 and invoke address error to let CPU reset (manual reset) */ | 84 | /* SR.BL=1 and invoke address error to let CPU reset (manual reset) */ |
95 | asm volatile("ldc %0, sr\n\t" | 85 | asm volatile("ldc %0, sr\n\t" |
96 | "mov.l @%1, %0" : : "r" (0x10000000), "r" (0x80000001)); | 86 | "mov.l @%1, %0" : : "r" (0x10000000), "r" (0x80000001)); |
@@ -263,6 +253,7 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long usp, | |||
263 | unsigned long unused, | 253 | unsigned long unused, |
264 | struct task_struct *p, struct pt_regs *regs) | 254 | struct task_struct *p, struct pt_regs *regs) |
265 | { | 255 | { |
256 | struct thread_info *ti = task_thread_info(p); | ||
266 | struct pt_regs *childregs; | 257 | struct pt_regs *childregs; |
267 | #if defined(CONFIG_SH_FPU) | 258 | #if defined(CONFIG_SH_FPU) |
268 | struct task_struct *tsk = current; | 259 | struct task_struct *tsk = current; |
@@ -277,8 +268,10 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long usp, | |||
277 | 268 | ||
278 | if (user_mode(regs)) { | 269 | if (user_mode(regs)) { |
279 | childregs->regs[15] = usp; | 270 | childregs->regs[15] = usp; |
271 | ti->addr_limit = USER_DS; | ||
280 | } else { | 272 | } else { |
281 | childregs->regs[15] = (unsigned long)task_stack_page(p) + THREAD_SIZE; | 273 | childregs->regs[15] = (unsigned long)task_stack_page(p) + THREAD_SIZE; |
274 | ti->addr_limit = KERNEL_DS; | ||
282 | } | 275 | } |
283 | if (clone_flags & CLONE_SETTLS) { | 276 | if (clone_flags & CLONE_SETTLS) { |
284 | childregs->gbr = childregs->regs[0]; | 277 | childregs->gbr = childregs->regs[0]; |
@@ -299,13 +292,15 @@ ubc_set_tracing(int asid, unsigned long pc) | |||
299 | { | 292 | { |
300 | ctrl_outl(pc, UBC_BARA); | 293 | ctrl_outl(pc, UBC_BARA); |
301 | 294 | ||
295 | #ifdef CONFIG_MMU | ||
302 | /* We don't have any ASID settings for the SH-2! */ | 296 | /* We don't have any ASID settings for the SH-2! */ |
303 | if (cpu_data->type != CPU_SH7604) | 297 | if (cpu_data->type != CPU_SH7604) |
304 | ctrl_outb(asid, UBC_BASRA); | 298 | ctrl_outb(asid, UBC_BASRA); |
299 | #endif | ||
305 | 300 | ||
306 | ctrl_outl(0, UBC_BAMRA); | 301 | ctrl_outl(0, UBC_BAMRA); |
307 | 302 | ||
308 | if (cpu_data->type == CPU_SH7729) { | 303 | if (cpu_data->type == CPU_SH7729 || cpu_data->type == CPU_SH7710) { |
309 | ctrl_outw(BBR_INST | BBR_READ | BBR_CPU, UBC_BBRA); | 304 | ctrl_outw(BBR_INST | BBR_READ | BBR_CPU, UBC_BBRA); |
310 | ctrl_outl(BRCR_PCBA | BRCR_PCTE, UBC_BRCR); | 305 | ctrl_outl(BRCR_PCBA | BRCR_PCTE, UBC_BRCR); |
311 | } else { | 306 | } else { |
@@ -344,6 +339,7 @@ struct task_struct *__switch_to(struct task_struct *prev, struct task_struct *ne | |||
344 | } | 339 | } |
345 | #endif | 340 | #endif |
346 | 341 | ||
342 | #ifdef CONFIG_MMU | ||
347 | /* | 343 | /* |
348 | * Restore the kernel mode register | 344 | * Restore the kernel mode register |
349 | * k7 (r7_bank1) | 345 | * k7 (r7_bank1) |
@@ -351,19 +347,21 @@ struct task_struct *__switch_to(struct task_struct *prev, struct task_struct *ne | |||
351 | asm volatile("ldc %0, r7_bank" | 347 | asm volatile("ldc %0, r7_bank" |
352 | : /* no output */ | 348 | : /* no output */ |
353 | : "r" (task_thread_info(next))); | 349 | : "r" (task_thread_info(next))); |
350 | #endif | ||
354 | 351 | ||
355 | #ifdef CONFIG_MMU | ||
356 | /* If no tasks are using the UBC, we're done */ | 352 | /* If no tasks are using the UBC, we're done */ |
357 | if (ubc_usercnt == 0) | 353 | if (ubc_usercnt == 0) |
358 | /* If no tasks are using the UBC, we're done */; | 354 | /* If no tasks are using the UBC, we're done */; |
359 | else if (next->thread.ubc_pc && next->mm) { | 355 | else if (next->thread.ubc_pc && next->mm) { |
360 | ubc_set_tracing(next->mm->context & MMU_CONTEXT_ASID_MASK, | 356 | int asid = 0; |
361 | next->thread.ubc_pc); | 357 | #ifdef CONFIG_MMU |
358 | asid |= next->mm->context.id & MMU_CONTEXT_ASID_MASK; | ||
359 | #endif | ||
360 | ubc_set_tracing(asid, next->thread.ubc_pc); | ||
362 | } else { | 361 | } else { |
363 | ctrl_outw(0, UBC_BBRA); | 362 | ctrl_outw(0, UBC_BBRA); |
364 | ctrl_outw(0, UBC_BBRB); | 363 | ctrl_outw(0, UBC_BBRB); |
365 | } | 364 | } |
366 | #endif | ||
367 | 365 | ||
368 | return prev; | 366 | return prev; |
369 | } | 367 | } |