process.c (767bf7e7a1e82a81c59778348d156993d0a6175d) process.c (045ab94e10ee17038066d71abc8fdce719ab56f9)
1/*
2 * linux/arch/arm/kernel/process.c
3 *
4 * Copyright (C) 1996-2000 Russell King - Converted to ARM.
5 * Original Copyright (C) 1995 Linus Torvalds
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11#include <stdarg.h>
12
13#include <linux/export.h>
14#include <linux/sched.h>
15#include <linux/kernel.h>
16#include <linux/mm.h>
17#include <linux/stddef.h>
18#include <linux/unistd.h>
19#include <linux/user.h>
1/*
2 * linux/arch/arm/kernel/process.c
3 *
4 * Copyright (C) 1996-2000 Russell King - Converted to ARM.
5 * Original Copyright (C) 1995 Linus Torvalds
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11#include <stdarg.h>
12
13#include <linux/export.h>
14#include <linux/sched.h>
15#include <linux/kernel.h>
16#include <linux/mm.h>
17#include <linux/stddef.h>
18#include <linux/unistd.h>
19#include <linux/user.h>
20#include <linux/delay.h>
21#include <linux/reboot.h>
22#include <linux/interrupt.h>
23#include <linux/kallsyms.h>
24#include <linux/init.h>
20#include <linux/interrupt.h>
21#include <linux/kallsyms.h>
22#include <linux/init.h>
25#include <linux/cpu.h>
26#include <linux/elfcore.h>
27#include <linux/pm.h>
28#include <linux/tick.h>
29#include <linux/utsname.h>
30#include <linux/uaccess.h>
31#include <linux/random.h>
32#include <linux/hw_breakpoint.h>
33#include <linux/leds.h>
23#include <linux/elfcore.h>
24#include <linux/pm.h>
25#include <linux/tick.h>
26#include <linux/utsname.h>
27#include <linux/uaccess.h>
28#include <linux/random.h>
29#include <linux/hw_breakpoint.h>
30#include <linux/leds.h>
34#include <linux/reboot.h>
35
31
36#include <asm/cacheflush.h>
37#include <asm/idmap.h>
38#include <asm/processor.h>
39#include <asm/thread_notify.h>
40#include <asm/stacktrace.h>
41#include <asm/system_misc.h>
42#include <asm/mach/time.h>
43#include <asm/tls.h>
32#include <asm/processor.h>
33#include <asm/thread_notify.h>
34#include <asm/stacktrace.h>
35#include <asm/system_misc.h>
36#include <asm/mach/time.h>
37#include <asm/tls.h>
44#include "reboot.h"
38#include <asm/vdso.h>
45
46#ifdef CONFIG_CC_STACKPROTECTOR
47#include <linux/stackprotector.h>
48unsigned long __stack_chk_guard __read_mostly;
49EXPORT_SYMBOL(__stack_chk_guard);
50#endif
51
52static const char *processor_modes[] __maybe_unused = {
53 "USER_26", "FIQ_26" , "IRQ_26" , "SVC_26" , "UK4_26" , "UK5_26" , "UK6_26" , "UK7_26" ,
54 "UK8_26" , "UK9_26" , "UK10_26", "UK11_26", "UK12_26", "UK13_26", "UK14_26", "UK15_26",
55 "USER_32", "FIQ_32" , "IRQ_32" , "SVC_32" , "UK4_32" , "UK5_32" , "MON_32" , "ABT_32" ,
56 "UK8_32" , "UK9_32" , "HYP_32", "UND_32" , "UK12_32", "UK13_32", "UK14_32", "SYS_32"
57};
58
59static const char *isa_modes[] __maybe_unused = {
60 "ARM" , "Thumb" , "Jazelle", "ThumbEE"
61};
62
39
40#ifdef CONFIG_CC_STACKPROTECTOR
41#include <linux/stackprotector.h>
42unsigned long __stack_chk_guard __read_mostly;
43EXPORT_SYMBOL(__stack_chk_guard);
44#endif
45
46static const char *processor_modes[] __maybe_unused = {
47 "USER_26", "FIQ_26" , "IRQ_26" , "SVC_26" , "UK4_26" , "UK5_26" , "UK6_26" , "UK7_26" ,
48 "UK8_26" , "UK9_26" , "UK10_26", "UK11_26", "UK12_26", "UK13_26", "UK14_26", "UK15_26",
49 "USER_32", "FIQ_32" , "IRQ_32" , "SVC_32" , "UK4_32" , "UK5_32" , "MON_32" , "ABT_32" ,
50 "UK8_32" , "UK9_32" , "HYP_32", "UND_32" , "UK12_32", "UK13_32", "UK14_32", "SYS_32"
51};
52
53static const char *isa_modes[] __maybe_unused = {
54 "ARM" , "Thumb" , "Jazelle", "ThumbEE"
55};
56
63extern void call_with_stack(void (*fn)(void *), void *arg, void *sp);
64typedef void (*phys_reset_t)(unsigned long);
65
66/*
57/*
67 * A temporary stack to use for CPU reset. This is static so that we
68 * don't clobber it with the identity mapping. When running with this
69 * stack, any references to the current task *will not work* so you
70 * should really do as little as possible before jumping to your reset
71 * code.
72 */
73static u64 soft_restart_stack[16];
74
75static void __soft_restart(void *addr)
76{
77 phys_reset_t phys_reset;
78
79 /* Take out a flat memory mapping. */
80 setup_mm_for_reboot();
81
82 /* Clean and invalidate caches */
83 flush_cache_all();
84
85 /* Turn off caching */
86 cpu_proc_fin();
87
88 /* Push out any further dirty data, and ensure cache is empty */
89 flush_cache_all();
90
91 /* Switch to the identity mapping. */
92 phys_reset = (phys_reset_t)(unsigned long)virt_to_phys(cpu_reset);
93 phys_reset((unsigned long)addr);
94
95 /* Should never get here. */
96 BUG();
97}
98
99void _soft_restart(unsigned long addr, bool disable_l2)
100{
101 u64 *stack = soft_restart_stack + ARRAY_SIZE(soft_restart_stack);
102
103 /* Disable interrupts first */
104 raw_local_irq_disable();
105 local_fiq_disable();
106
107 /* Disable the L2 if we're the last man standing. */
108 if (disable_l2)
109 outer_disable();
110
111 /* Change to the new stack and continue with the reset. */
112 call_with_stack(__soft_restart, (void *)addr, (void *)stack);
113
114 /* Should never get here. */
115 BUG();
116}
117
118void soft_restart(unsigned long addr)
119{
120 _soft_restart(addr, num_online_cpus() == 1);
121}
122
123/*
124 * Function pointers to optional machine specific functions
125 */
126void (*pm_power_off)(void);
127EXPORT_SYMBOL(pm_power_off);
128
129void (*arm_pm_restart)(enum reboot_mode reboot_mode, const char *cmd);
130
131/*
132 * This is our default idle handler.
133 */
134
135void (*arm_pm_idle)(void);
136
137/*
138 * Called from the core idle loop.
139 */

--- 27 unchanged lines hidden (view full) ---

167
168#ifdef CONFIG_HOTPLUG_CPU
169void arch_cpu_idle_dead(void)
170{
171 cpu_die();
172}
173#endif
174
58 * This is our default idle handler.
59 */
60
61void (*arm_pm_idle)(void);
62
63/*
64 * Called from the core idle loop.
65 */

--- 27 unchanged lines hidden (view full) ---

93
94#ifdef CONFIG_HOTPLUG_CPU
95void arch_cpu_idle_dead(void)
96{
97 cpu_die();
98}
99#endif
100
175/*
176 * Called by kexec, immediately prior to machine_kexec().
177 *
178 * This must completely disable all secondary CPUs; simply causing those CPUs
179 * to execute e.g. a RAM-based pin loop is not sufficient. This allows the
180 * kexec'd kernel to use any and all RAM as it sees fit, without having to
181 * avoid any code or data used by any SW CPU pin loop. The CPU hotplug
182 * functionality embodied in disable_nonboot_cpus() to achieve this.
183 */
184void machine_shutdown(void)
185{
186 disable_nonboot_cpus();
187}
188
189/*
190 * Halting simply requires that the secondary CPUs stop performing any
191 * activity (executing tasks, handling interrupts). smp_send_stop()
192 * achieves this.
193 */
194void machine_halt(void)
195{
196 local_irq_disable();
197 smp_send_stop();
198
199 local_irq_disable();
200 while (1);
201}
202
203/*
204 * Power-off simply requires that the secondary CPUs stop performing any
205 * activity (executing tasks, handling interrupts). smp_send_stop()
206 * achieves this. When the system power is turned off, it will take all CPUs
207 * with it.
208 */
209void machine_power_off(void)
210{
211 local_irq_disable();
212 smp_send_stop();
213
214 if (pm_power_off)
215 pm_power_off();
216}
217
218/*
219 * Restart requires that the secondary CPUs stop performing any activity
220 * while the primary CPU resets the system. Systems with a single CPU can
221 * use soft_restart() as their machine descriptor's .restart hook, since that
222 * will cause the only available CPU to reset. Systems with multiple CPUs must
223 * provide a HW restart implementation, to ensure that all CPUs reset at once.
224 * This is required so that any code running after reset on the primary CPU
225 * doesn't have to co-ordinate with other CPUs to ensure they aren't still
226 * executing pre-reset code, and using RAM that the primary CPU's code wishes
227 * to use. Implementing such co-ordination would be essentially impossible.
228 */
229void machine_restart(char *cmd)
230{
231 local_irq_disable();
232 smp_send_stop();
233
234 if (arm_pm_restart)
235 arm_pm_restart(reboot_mode, cmd);
236 else
237 do_kernel_restart(cmd);
238
239 /* Give a grace period for failure to restart of 1s */
240 mdelay(1000);
241
242 /* Whoops - the platform was unable to reboot. Tell the user! */
243 printk("Reboot failed -- System halted\n");
244 local_irq_disable();
245 while (1);
246}
247
248void __show_regs(struct pt_regs *regs)
249{
250 unsigned long flags;
251 char buf[64];
252
253 show_regs_print_info(KERN_DEFAULT);
254
255 print_symbol("PC is at %s\n", instruction_pointer(regs));

--- 305 unchanged lines hidden ---
101void __show_regs(struct pt_regs *regs)
102{
103 unsigned long flags;
104 char buf[64];
105
106 show_regs_print_info(KERN_DEFAULT);
107
108 print_symbol("PC is at %s\n", instruction_pointer(regs));

--- 305 unchanged lines hidden ---