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 set_fs(USER_DS);
201 memset(regs, 0, sizeof(struct pt_regs));
202
203 regs->pc = pc;
204 regs->sr = sr;
205 regs->sp = sp;
206}
207
208
209int dump_fpu(struct pt_regs *regs, elf_fpregset_t * fpu)
210{
211
212 return 0;
213}
214
215extern struct thread_info *_switch(struct thread_info *old_ti,
216 struct thread_info *new_ti);
217
218struct task_struct *__switch_to(struct task_struct *old,
219 struct task_struct *new)
220{
221 struct task_struct *last;
222 struct thread_info *new_ti, *old_ti;
223 unsigned long flags;
224
225 local_irq_save(flags);
226
227
228
229
230
231 new_ti = new->stack;
232 old_ti = old->stack;
233
234 current_thread_info_set[smp_processor_id()] = new_ti;
235 last = (_switch(old_ti, new_ti))->task;
236
237 local_irq_restore(flags);
238
239 return last;
240}
241
242
243
244
245
246void dump_elf_thread(elf_greg_t *dest, struct pt_regs* regs)
247{
248 dest[0] = 0;
249 memcpy(dest+1, regs->gpr+1, 31*sizeof(unsigned long));
250 dest[32] = regs->pc;
251 dest[33] = regs->sr;
252 dest[34] = 0;
253 dest[35] = 0;
254}
255
256unsigned long get_wchan(struct task_struct *p)
257{
258
259
260 return 0;
261}
262