1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#define __KERNEL_SYSCALLS__
21#include <stdarg.h>
22
23#include <linux/errno.h>
24#include <linux/sched.h>
25#include <linux/kernel.h>
26#include <linux/module.h>
27#include <linux/mm.h>
28#include <linux/stddef.h>
29#include <linux/unistd.h>
30#include <linux/ptrace.h>
31#include <linux/slab.h>
32#include <linux/elfcore.h>
33#include <linux/interrupt.h>
34#include <linux/delay.h>
35#include <linux/init_task.h>
36#include <linux/mqueue.h>
37#include <linux/fs.h>
38
39#include <asm/uaccess.h>
40#include <asm/pgtable.h>
41#include <asm/io.h>
42#include <asm/processor.h>
43#include <asm/spr_defs.h>
44
45#include <linux/smp.h>
46
47
48
49
50
51
52struct thread_info *current_thread_info_set[NR_CPUS] = { &init_thread_info, };
53
54void machine_restart(void)
55{
56 printk(KERN_INFO "*** MACHINE RESTART ***\n");
57 __asm__("l.nop 1");
58}
59
60
61
62
63
64
65void machine_halt(void)
66{
67 printk(KERN_INFO "*** MACHINE HALT ***\n");
68 __asm__("l.nop 1");
69}
70
71
72void machine_power_off(void)
73{
74 printk(KERN_INFO "*** MACHINE POWER OFF ***\n");
75 __asm__("l.nop 1");
76}
77
78void (*pm_power_off) (void) = machine_power_off;
79
80
81
82
83
84
85void flush_thread(void)
86{
87}
88
89void show_regs(struct pt_regs *regs)
90{
91 extern void show_registers(struct pt_regs *regs);
92
93 show_regs_print_info(KERN_DEFAULT);
94
95 show_registers(regs);
96}
97
98unsigned long thread_saved_pc(struct task_struct *t)
99{
100 return (unsigned long)user_regs(t->stack)->pc;
101}
102
103void release_thread(struct task_struct *dead_task)
104{
105}
106
107
108
109
110
111extern asmlinkage void ret_from_fork(void);
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144int
145copy_thread(unsigned long clone_flags, unsigned long usp,
146 unsigned long arg, struct task_struct *p)
147{
148 struct pt_regs *userregs;
149 struct pt_regs *kregs;
150 unsigned long sp = (unsigned long)task_stack_page(p) + THREAD_SIZE;
151 unsigned long top_of_kernel_stack;
152
153 top_of_kernel_stack = sp;
154
155 p->set_child_tid = p->clear_child_tid = NULL;
156
157
158 sp -= STACK_FRAME_OVERHEAD;
159 sp -= sizeof(struct pt_regs);
160 userregs = (struct pt_regs *) sp;
161
162
163 sp -= STACK_FRAME_OVERHEAD;
164 sp -= sizeof(struct pt_regs);
165 kregs = (struct pt_regs *)sp;
166
167 if (unlikely(p->flags & PF_KTHREAD)) {
168 memset(kregs, 0, sizeof(struct pt_regs));
169 kregs->gpr[20] = usp;
170 kregs->gpr[22] = arg;
171 } else {
172 *userregs = *current_pt_regs();
173
174 if (usp)
175 userregs->sp = usp;
176 userregs->gpr[11] = 0;
177
178 kregs->gpr[20] = 0;
179 }
180
181
182
183
184
185 kregs->sp = top_of_kernel_stack;
186 kregs->gpr[9] = (unsigned long)ret_from_fork;
187
188 task_thread_info(p)->ksp = (unsigned long)kregs;
189
190 return 0;
191}
192
193
194
195
196void start_thread(struct pt_regs *regs, unsigned long pc, unsigned long sp)
197{
198 unsigned long sr = mfspr(SPR_SR) & ~SPR_SR_SM;
199
200 memset(regs, 0, sizeof(struct pt_regs));
201
202 regs->pc = pc;
203 regs->sr = sr;
204 regs->sp = sp;
205}
206
207
208int dump_fpu(struct pt_regs *regs, elf_fpregset_t * fpu)
209{
210
211 return 0;
212}
213
214extern struct thread_info *_switch(struct thread_info *old_ti,
215 struct thread_info *new_ti);
216
217struct task_struct *__switch_to(struct task_struct *old,
218 struct task_struct *new)
219{
220 struct task_struct *last;
221 struct thread_info *new_ti, *old_ti;
222 unsigned long flags;
223
224 local_irq_save(flags);
225
226
227
228
229
230 new_ti = new->stack;
231 old_ti = old->stack;
232
233 current_thread_info_set[smp_processor_id()] = new_ti;
234 last = (_switch(old_ti, new_ti))->task;
235
236 local_irq_restore(flags);
237
238 return last;
239}
240
241
242
243
244
245void dump_elf_thread(elf_greg_t *dest, struct pt_regs* regs)
246{
247 dest[0] = 0;
248 memcpy(dest+1, regs->gpr+1, 31*sizeof(unsigned long));
249 dest[32] = regs->pc;
250 dest[33] = regs->sr;
251 dest[34] = 0;
252 dest[35] = 0;
253}
254
255unsigned long get_wchan(struct task_struct *p)
256{
257
258
259 return 0;
260}
261