Commit | Line | Data |
---|---|---|
f32bb79c | 1 | /* |
1da177e4 LT |
2 | * linux/arch/cris/kernel/process.c |
3 | * | |
4 | * Copyright (C) 1995 Linus Torvalds | |
5 | * Copyright (C) 2000-2002 Axis Communications AB | |
6 | * | |
7 | * Authors: Bjorn Wesen (bjornw@axis.com) | |
8 | * | |
1da177e4 LT |
9 | */ |
10 | ||
11 | /* | |
12 | * This file handles the architecture-dependent parts of process handling.. | |
13 | */ | |
14 | ||
60063497 | 15 | #include <linux/atomic.h> |
1da177e4 LT |
16 | #include <asm/pgtable.h> |
17 | #include <asm/uaccess.h> | |
18 | #include <asm/irq.h> | |
cdb04527 | 19 | #include <asm/system.h> |
1da177e4 LT |
20 | #include <linux/module.h> |
21 | #include <linux/spinlock.h> | |
1da177e4 LT |
22 | #include <linux/init_task.h> |
23 | #include <linux/sched.h> | |
24 | #include <linux/fs.h> | |
25 | #include <linux/user.h> | |
26 | #include <linux/elfcore.h> | |
27 | #include <linux/mqueue.h> | |
16dcb4bb | 28 | #include <linux/reboot.h> |
1da177e4 LT |
29 | |
30 | //#define DEBUG | |
31 | ||
32 | /* | |
33 | * Initial task structure. Make this a per-architecture thing, | |
34 | * because different architectures tend to have different | |
35 | * alignment requirements and potentially different initial | |
36 | * setup. | |
37 | */ | |
38 | ||
1da177e4 LT |
39 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); |
40 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | |
1da177e4 LT |
41 | /* |
42 | * Initial thread structure. | |
43 | * | |
44 | * We need to make sure that this is 8192-byte aligned due to the | |
45 | * way process stacks are handled. This is done by having a special | |
46 | * "init_task" linker map entry.. | |
47 | */ | |
d200c922 JP |
48 | union thread_union init_thread_union __init_task_data = |
49 | { INIT_THREAD_INFO(init_task) }; | |
1da177e4 LT |
50 | |
51 | /* | |
52 | * Initial task structure. | |
53 | * | |
54 | * All other task structs will be allocated on slabs in fork.c | |
55 | */ | |
56 | struct task_struct init_task = INIT_TASK(init_task); | |
57 | ||
58 | EXPORT_SYMBOL(init_task); | |
59 | ||
60 | /* | |
61 | * The hlt_counter, disable_hlt and enable_hlt is just here as a hook if | |
62 | * there would ever be a halt sequence (for power save when idle) with | |
63 | * some largish delay when halting or resuming *and* a driver that can't | |
64 | * afford that delay. The hlt_counter would then be checked before | |
65 | * executing the halt sequence, and the driver marks the unhaltable | |
66 | * region by enable_hlt/disable_hlt. | |
67 | */ | |
68 | ||
5d01e6ce | 69 | int cris_hlt_counter=0; |
1da177e4 LT |
70 | |
71 | void disable_hlt(void) | |
72 | { | |
5d01e6ce | 73 | cris_hlt_counter++; |
1da177e4 LT |
74 | } |
75 | ||
76 | EXPORT_SYMBOL(disable_hlt); | |
77 | ||
78 | void enable_hlt(void) | |
79 | { | |
5d01e6ce | 80 | cris_hlt_counter--; |
1da177e4 LT |
81 | } |
82 | ||
83 | EXPORT_SYMBOL(enable_hlt); | |
84 | ||
85 | /* | |
86 | * The following aren't currently used. | |
87 | */ | |
88 | void (*pm_idle)(void); | |
89 | ||
7b275523 JN |
90 | extern void default_idle(void); |
91 | ||
92 | void (*pm_power_off)(void); | |
93 | EXPORT_SYMBOL(pm_power_off); | |
94 | ||
1da177e4 LT |
95 | /* |
96 | * The idle thread. There's no useful work to be | |
97 | * done, so just try to conserve power and have a | |
98 | * low exit latency (ie sit in a loop waiting for | |
99 | * somebody to say that they'd like to reschedule) | |
100 | */ | |
f32bb79c | 101 | |
1da177e4 LT |
102 | void cpu_idle (void) |
103 | { | |
104 | /* endless idle loop with no priority at all */ | |
105 | while (1) { | |
106 | while (!need_resched()) { | |
5d01e6ce MS |
107 | void (*idle)(void); |
108 | /* | |
109 | * Mark this as an RCU critical section so that | |
110 | * synchronize_kernel() in the unload path waits | |
111 | * for our completion. | |
112 | */ | |
113 | idle = pm_idle; | |
1da177e4 LT |
114 | if (!idle) |
115 | idle = default_idle; | |
1da177e4 LT |
116 | idle(); |
117 | } | |
bd2f5536 | 118 | schedule_preempt_disabled(); |
1da177e4 | 119 | } |
1da177e4 LT |
120 | } |
121 | ||
122 | void hard_reset_now (void); | |
123 | ||
16dcb4bb | 124 | void machine_restart(char *cmd) |
1da177e4 LT |
125 | { |
126 | hard_reset_now(); | |
127 | } | |
128 | ||
1da177e4 LT |
129 | /* |
130 | * Similar to machine_power_off, but don't shut off power. Add code | |
131 | * here to freeze the system for e.g. post-mortem debug purpose when | |
132 | * possible. This halt has nothing to do with the idle halt. | |
133 | */ | |
134 | ||
135 | void machine_halt(void) | |
136 | { | |
137 | } | |
138 | ||
1da177e4 LT |
139 | /* If or when software power-off is implemented, add code here. */ |
140 | ||
141 | void machine_power_off(void) | |
142 | { | |
143 | } | |
144 | ||
1da177e4 LT |
145 | /* |
146 | * When a process does an "exec", machine state like FPU and debug | |
147 | * registers need to be reset. This is a hook function for that. | |
148 | * Currently we don't have any such state to reset, so this is empty. | |
149 | */ | |
150 | ||
151 | void flush_thread(void) | |
152 | { | |
153 | } | |
154 | ||
1da177e4 LT |
155 | /* Fill in the fpu structure for a core dump. */ |
156 | int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpu) | |
157 | { | |
158 | return 0; | |
159 | } |