diff options
Diffstat (limited to 'arch/sh/kernel/process_32.c')
-rw-r--r-- | arch/sh/kernel/process_32.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/arch/sh/kernel/process_32.c b/arch/sh/kernel/process_32.c index 92d7740faab1..0673c4746be3 100644 --- a/arch/sh/kernel/process_32.c +++ b/arch/sh/kernel/process_32.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <linux/tick.h> | 23 | #include <linux/tick.h> |
24 | #include <linux/reboot.h> | 24 | #include <linux/reboot.h> |
25 | #include <linux/fs.h> | 25 | #include <linux/fs.h> |
26 | #include <linux/ftrace.h> | ||
26 | #include <linux/preempt.h> | 27 | #include <linux/preempt.h> |
27 | #include <asm/uaccess.h> | 28 | #include <asm/uaccess.h> |
28 | #include <asm/mmu_context.h> | 29 | #include <asm/mmu_context.h> |
@@ -31,15 +32,35 @@ | |||
31 | #include <asm/ubc.h> | 32 | #include <asm/ubc.h> |
32 | #include <asm/fpu.h> | 33 | #include <asm/fpu.h> |
33 | #include <asm/syscalls.h> | 34 | #include <asm/syscalls.h> |
35 | #include <asm/watchdog.h> | ||
34 | 36 | ||
35 | int ubc_usercnt = 0; | 37 | int ubc_usercnt = 0; |
36 | 38 | ||
39 | #ifdef CONFIG_32BIT | ||
40 | static void watchdog_trigger_immediate(void) | ||
41 | { | ||
42 | sh_wdt_write_cnt(0xFF); | ||
43 | sh_wdt_write_csr(0xC2); | ||
44 | } | ||
45 | |||
46 | void machine_restart(char * __unused) | ||
47 | { | ||
48 | local_irq_disable(); | ||
49 | |||
50 | /* Use watchdog timer to trigger reset */ | ||
51 | watchdog_trigger_immediate(); | ||
52 | |||
53 | while (1) | ||
54 | cpu_sleep(); | ||
55 | } | ||
56 | #else | ||
37 | void machine_restart(char * __unused) | 57 | void machine_restart(char * __unused) |
38 | { | 58 | { |
39 | /* SR.BL=1 and invoke address error to let CPU reset (manual reset) */ | 59 | /* SR.BL=1 and invoke address error to let CPU reset (manual reset) */ |
40 | asm volatile("ldc %0, sr\n\t" | 60 | asm volatile("ldc %0, sr\n\t" |
41 | "mov.l @%1, %0" : : "r" (0x10000000), "r" (0x80000001)); | 61 | "mov.l @%1, %0" : : "r" (0x10000000), "r" (0x80000001)); |
42 | } | 62 | } |
63 | #endif | ||
43 | 64 | ||
44 | void machine_halt(void) | 65 | void machine_halt(void) |
45 | { | 66 | { |
@@ -264,8 +285,8 @@ static void ubc_set_tracing(int asid, unsigned long pc) | |||
264 | * switch_to(x,y) should switch tasks from x to y. | 285 | * switch_to(x,y) should switch tasks from x to y. |
265 | * | 286 | * |
266 | */ | 287 | */ |
267 | struct task_struct *__switch_to(struct task_struct *prev, | 288 | __notrace_funcgraph struct task_struct * |
268 | struct task_struct *next) | 289 | __switch_to(struct task_struct *prev, struct task_struct *next) |
269 | { | 290 | { |
270 | #if defined(CONFIG_SH_FPU) | 291 | #if defined(CONFIG_SH_FPU) |
271 | unlazy_fpu(prev, task_pt_regs(prev)); | 292 | unlazy_fpu(prev, task_pt_regs(prev)); |