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