diff options
Diffstat (limited to 'arch/cris/kernel/process.c')
-rw-r--r-- | arch/cris/kernel/process.c | 280 |
1 files changed, 280 insertions, 0 deletions
diff --git a/arch/cris/kernel/process.c b/arch/cris/kernel/process.c new file mode 100644 index 000000000000..9f7cad7c7849 --- /dev/null +++ b/arch/cris/kernel/process.c | |||
@@ -0,0 +1,280 @@ | |||
1 | /* $Id: process.c,v 1.17 2004/04/05 13:53:48 starvik Exp $ | ||
2 | * | ||
3 | * linux/arch/cris/kernel/process.c | ||
4 | * | ||
5 | * Copyright (C) 1995 Linus Torvalds | ||
6 | * Copyright (C) 2000-2002 Axis Communications AB | ||
7 | * | ||
8 | * Authors: Bjorn Wesen (bjornw@axis.com) | ||
9 | * | ||
10 | * $Log: process.c,v $ | ||
11 | * Revision 1.17 2004/04/05 13:53:48 starvik | ||
12 | * Merge of Linux 2.6.5 | ||
13 | * | ||
14 | * Revision 1.16 2003/10/27 08:04:33 starvik | ||
15 | * Merge of Linux 2.6.0-test9 | ||
16 | * | ||
17 | * Revision 1.15 2003/09/11 07:29:52 starvik | ||
18 | * Merge of Linux 2.6.0-test5 | ||
19 | * | ||
20 | * Revision 1.14 2003/06/10 10:21:12 johana | ||
21 | * Moved thread_saved_pc() from arch/cris/kernel/process.c to | ||
22 | * subarch specific process.c. arch-v32 has an erp, no irp. | ||
23 | * | ||
24 | * Revision 1.13 2003/04/09 05:20:47 starvik | ||
25 | * Merge of Linux 2.5.67 | ||
26 | * | ||
27 | * Revision 1.12 2002/12/11 15:41:11 starvik | ||
28 | * Extracted v10 (ETRAX 100LX) specific stuff to arch/cris/arch-v10/kernel | ||
29 | * | ||
30 | * Revision 1.11 2002/12/10 09:00:10 starvik | ||
31 | * Merge of Linux 2.5.51 | ||
32 | * | ||
33 | * Revision 1.10 2002/11/27 08:42:34 starvik | ||
34 | * Argument to user_regs() is thread_info* | ||
35 | * | ||
36 | * Revision 1.9 2002/11/26 09:44:21 starvik | ||
37 | * New threads exits through ret_from_fork (necessary for preemptive scheduling) | ||
38 | * | ||
39 | * Revision 1.8 2002/11/19 14:35:24 starvik | ||
40 | * Changes from linux 2.4 | ||
41 | * Changed struct initializer syntax to the currently prefered notation | ||
42 | * | ||
43 | * Revision 1.7 2002/11/18 07:39:42 starvik | ||
44 | * thread_saved_pc moved here from processor.h | ||
45 | * | ||
46 | * Revision 1.6 2002/11/14 06:51:27 starvik | ||
47 | * Made cpu_idle more similar with other archs | ||
48 | * init_task_union -> init_thread_union | ||
49 | * Updated for new interrupt macros | ||
50 | * sys_clone and do_fork have a new argument, user_tid | ||
51 | * | ||
52 | * Revision 1.5 2002/11/05 06:45:11 starvik | ||
53 | * Merge of Linux 2.5.45 | ||
54 | * | ||
55 | * Revision 1.4 2002/02/05 15:37:44 bjornw | ||
56 | * Need init_task.h | ||
57 | * | ||
58 | * Revision 1.3 2002/01/21 15:22:49 bjornw | ||
59 | * current->counter is gone | ||
60 | * | ||
61 | * Revision 1.22 2001/11/13 09:40:43 orjanf | ||
62 | * Added dump_fpu (needed for core dumps). | ||
63 | * | ||
64 | * Revision 1.21 2001/11/12 18:26:21 pkj | ||
65 | * Fixed compiler warnings. | ||
66 | * | ||
67 | * Revision 1.20 2001/10/03 08:21:39 jonashg | ||
68 | * cause_of_death does not exist if CONFIG_SVINTO_SIM is defined. | ||
69 | * | ||
70 | * Revision 1.19 2001/09/26 11:52:54 bjornw | ||
71 | * INIT_MMAP is gone in 2.4.10 | ||
72 | * | ||
73 | * Revision 1.18 2001/08/21 21:43:51 hp | ||
74 | * Move last watchdog fix inside #ifdef CONFIG_ETRAX_WATCHDOG | ||
75 | * | ||
76 | * Revision 1.17 2001/08/21 13:48:01 jonashg | ||
77 | * Added fix by HP to avoid oops when doing a hard_reset_now. | ||
78 | * | ||
79 | * Revision 1.16 2001/06/21 02:00:40 hp | ||
80 | * * entry.S: Include asm/unistd.h. | ||
81 | * (_sys_call_table): Use section .rodata, not .data. | ||
82 | * (_kernel_thread): Move from... | ||
83 | * * process.c: ... here. | ||
84 | * * entryoffsets.c (VAL): Break out from... | ||
85 | * (OF): Use VAL. | ||
86 | * (LCLONE_VM): New asmified value from CLONE_VM. | ||
87 | * | ||
88 | * Revision 1.15 2001/06/20 16:31:57 hp | ||
89 | * Add comments to describe empty functions according to review. | ||
90 | * | ||
91 | * Revision 1.14 2001/05/29 11:27:59 markusl | ||
92 | * Fixed so that hard_reset_now will do reset even if watchdog wasn't enabled | ||
93 | * | ||
94 | * Revision 1.13 2001/03/20 19:44:06 bjornw | ||
95 | * Use the 7th syscall argument for regs instead of current_regs | ||
96 | * | ||
97 | */ | ||
98 | |||
99 | /* | ||
100 | * This file handles the architecture-dependent parts of process handling.. | ||
101 | */ | ||
102 | |||
103 | #include <asm/atomic.h> | ||
104 | #include <asm/pgtable.h> | ||
105 | #include <asm/uaccess.h> | ||
106 | #include <asm/irq.h> | ||
107 | #include <linux/module.h> | ||
108 | #include <linux/spinlock.h> | ||
109 | #include <linux/fs_struct.h> | ||
110 | #include <linux/init_task.h> | ||
111 | #include <linux/sched.h> | ||
112 | #include <linux/fs.h> | ||
113 | #include <linux/user.h> | ||
114 | #include <linux/elfcore.h> | ||
115 | #include <linux/mqueue.h> | ||
116 | |||
117 | //#define DEBUG | ||
118 | |||
119 | /* | ||
120 | * Initial task structure. Make this a per-architecture thing, | ||
121 | * because different architectures tend to have different | ||
122 | * alignment requirements and potentially different initial | ||
123 | * setup. | ||
124 | */ | ||
125 | |||
126 | static struct fs_struct init_fs = INIT_FS; | ||
127 | static struct files_struct init_files = INIT_FILES; | ||
128 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | ||
129 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | ||
130 | struct mm_struct init_mm = INIT_MM(init_mm); | ||
131 | |||
132 | EXPORT_SYMBOL(init_mm); | ||
133 | |||
134 | /* | ||
135 | * Initial thread structure. | ||
136 | * | ||
137 | * We need to make sure that this is 8192-byte aligned due to the | ||
138 | * way process stacks are handled. This is done by having a special | ||
139 | * "init_task" linker map entry.. | ||
140 | */ | ||
141 | union thread_union init_thread_union | ||
142 | __attribute__((__section__(".data.init_task"))) = | ||
143 | { INIT_THREAD_INFO(init_task) }; | ||
144 | |||
145 | /* | ||
146 | * Initial task structure. | ||
147 | * | ||
148 | * All other task structs will be allocated on slabs in fork.c | ||
149 | */ | ||
150 | struct task_struct init_task = INIT_TASK(init_task); | ||
151 | |||
152 | EXPORT_SYMBOL(init_task); | ||
153 | |||
154 | /* | ||
155 | * The hlt_counter, disable_hlt and enable_hlt is just here as a hook if | ||
156 | * there would ever be a halt sequence (for power save when idle) with | ||
157 | * some largish delay when halting or resuming *and* a driver that can't | ||
158 | * afford that delay. The hlt_counter would then be checked before | ||
159 | * executing the halt sequence, and the driver marks the unhaltable | ||
160 | * region by enable_hlt/disable_hlt. | ||
161 | */ | ||
162 | |||
163 | static int hlt_counter=0; | ||
164 | |||
165 | void disable_hlt(void) | ||
166 | { | ||
167 | hlt_counter++; | ||
168 | } | ||
169 | |||
170 | EXPORT_SYMBOL(disable_hlt); | ||
171 | |||
172 | void enable_hlt(void) | ||
173 | { | ||
174 | hlt_counter--; | ||
175 | } | ||
176 | |||
177 | EXPORT_SYMBOL(enable_hlt); | ||
178 | |||
179 | /* | ||
180 | * The following aren't currently used. | ||
181 | */ | ||
182 | void (*pm_idle)(void); | ||
183 | |||
184 | extern void default_idle(void); | ||
185 | |||
186 | /* | ||
187 | * The idle thread. There's no useful work to be | ||
188 | * done, so just try to conserve power and have a | ||
189 | * low exit latency (ie sit in a loop waiting for | ||
190 | * somebody to say that they'd like to reschedule) | ||
191 | */ | ||
192 | void cpu_idle (void) | ||
193 | { | ||
194 | /* endless idle loop with no priority at all */ | ||
195 | while (1) { | ||
196 | while (!need_resched()) { | ||
197 | void (*idle)(void) = pm_idle; | ||
198 | |||
199 | if (!idle) | ||
200 | idle = default_idle; | ||
201 | |||
202 | idle(); | ||
203 | } | ||
204 | schedule(); | ||
205 | } | ||
206 | |||
207 | } | ||
208 | |||
209 | void hard_reset_now (void); | ||
210 | |||
211 | void machine_restart(void) | ||
212 | { | ||
213 | hard_reset_now(); | ||
214 | } | ||
215 | |||
216 | EXPORT_SYMBOL(machine_restart); | ||
217 | |||
218 | /* | ||
219 | * Similar to machine_power_off, but don't shut off power. Add code | ||
220 | * here to freeze the system for e.g. post-mortem debug purpose when | ||
221 | * possible. This halt has nothing to do with the idle halt. | ||
222 | */ | ||
223 | |||
224 | void machine_halt(void) | ||
225 | { | ||
226 | } | ||
227 | |||
228 | EXPORT_SYMBOL(machine_halt); | ||
229 | |||
230 | /* If or when software power-off is implemented, add code here. */ | ||
231 | |||
232 | void machine_power_off(void) | ||
233 | { | ||
234 | } | ||
235 | |||
236 | EXPORT_SYMBOL(machine_power_off); | ||
237 | |||
238 | /* | ||
239 | * When a process does an "exec", machine state like FPU and debug | ||
240 | * registers need to be reset. This is a hook function for that. | ||
241 | * Currently we don't have any such state to reset, so this is empty. | ||
242 | */ | ||
243 | |||
244 | void flush_thread(void) | ||
245 | { | ||
246 | } | ||
247 | |||
248 | /* | ||
249 | * fill in the user structure for a core dump.. | ||
250 | */ | ||
251 | void dump_thread(struct pt_regs * regs, struct user * dump) | ||
252 | { | ||
253 | #if 0 | ||
254 | int i; | ||
255 | |||
256 | /* changed the size calculations - should hopefully work better. lbt */ | ||
257 | dump->magic = CMAGIC; | ||
258 | dump->start_code = 0; | ||
259 | dump->start_stack = regs->esp & ~(PAGE_SIZE - 1); | ||
260 | dump->u_tsize = ((unsigned long) current->mm->end_code) >> PAGE_SHIFT; | ||
261 | dump->u_dsize = ((unsigned long) (current->mm->brk + (PAGE_SIZE-1))) >> PAGE_SHIFT; | ||
262 | dump->u_dsize -= dump->u_tsize; | ||
263 | dump->u_ssize = 0; | ||
264 | for (i = 0; i < 8; i++) | ||
265 | dump->u_debugreg[i] = current->debugreg[i]; | ||
266 | |||
267 | if (dump->start_stack < TASK_SIZE) | ||
268 | dump->u_ssize = ((unsigned long) (TASK_SIZE - dump->start_stack)) >> PAGE_SHIFT; | ||
269 | |||
270 | dump->regs = *regs; | ||
271 | |||
272 | dump->u_fpvalid = dump_fpu (regs, &dump->i387); | ||
273 | #endif | ||
274 | } | ||
275 | |||
276 | /* Fill in the fpu structure for a core dump. */ | ||
277 | int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpu) | ||
278 | { | ||
279 | return 0; | ||
280 | } | ||