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
94 show_registers(regs);
95}
96
97unsigned long thread_saved_pc(struct task_struct *t)
98{
99 return (unsigned long)user_regs(t->stack)->pc;
100}
101
102void release_thread(struct task_struct *dead_task)
103{
104}
105
106
107
108
109
110extern asmlinkage void ret_from_fork(void);
111
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
143int
144copy_thread(unsigned long clone_flags, unsigned long usp,
145 unsigned long arg, struct task_struct *p)
146{
147 struct pt_regs *userregs;
148 struct pt_regs *kregs;
149 unsigned long sp = (unsigned long)task_stack_page(p) + THREAD_SIZE;
150 unsigned long top_of_kernel_stack;
151
152 top_of_kernel_stack = sp;
153
154 p->set_child_tid = p->clear_child_tid = NULL;
155
156
157 sp -= STACK_FRAME_OVERHEAD;
158 sp -= sizeof(struct pt_regs);
159 userregs = (struct pt_regs *) sp;
160
161
162 sp -= STACK_FRAME_OVERHEAD;
163 sp -= sizeof(struct pt_regs);
164 kregs = (struct pt_regs *)sp;
165
166 if (unlikely(p->flags & PF_KTHREAD)) {
167 memset(kregs, 0, sizeof(struct pt_regs));
168 kregs->gpr[20] = usp;
169 kregs->gpr[22] = arg;
170 } else {
171 *userregs = *current_pt_regs();
172
173 if (usp)
174 userregs->sp = usp;
175 userregs->gpr[11] = 0;
176
177 kregs->gpr[20] = 0;
178 }
179
180
181
182
183
184 kregs->sp = top_of_kernel_stack;
185 kregs->gpr[9] = (unsigned long)ret_from_fork;
186
187 task_thread_info(p)->ksp = (unsigned long)kregs;
188
189 return 0;
190}
191
192
193
194
195void start_thread(struct pt_regs *regs, unsigned long pc, unsigned long sp)
196{
197 unsigned long sr = mfspr(SPR_SR) & ~SPR_SR_SM;
198
199 set_fs(USER_DS);
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