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