1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#define __KERNEL_SYSCALLS__
17#include <linux/errno.h>
18#include <linux/sched.h>
19#include <linux/sched/debug.h>
20#include <linux/sched/task.h>
21#include <linux/sched/task_stack.h>
22#include <linux/kernel.h>
23#include <linux/export.h>
24#include <linux/mm.h>
25#include <linux/stddef.h>
26#include <linux/unistd.h>
27#include <linux/ptrace.h>
28#include <linux/slab.h>
29#include <linux/elfcore.h>
30#include <linux/interrupt.h>
31#include <linux/delay.h>
32#include <linux/init_task.h>
33#include <linux/mqueue.h>
34#include <linux/fs.h>
35#include <linux/reboot.h>
36
37#include <linux/uaccess.h>
38#include <asm/io.h>
39#include <asm/processor.h>
40#include <asm/spr_defs.h>
41
42#include <linux/smp.h>
43
44
45
46
47
48
49struct thread_info *current_thread_info_set[NR_CPUS] = { &init_thread_info, };
50
51void machine_restart(char *cmd)
52{
53 do_kernel_restart(cmd);
54
55
56 mdelay(1000);
57
58
59 pr_emerg("Reboot failed -- System halted\n");
60 while (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 raw_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, unsigned long arg,
156 struct task_struct *p, unsigned long tls)
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 | PF_IO_WORKER))) {
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 if (clone_flags & CLONE_SETTLS)
189 userregs->gpr[10] = tls;
190
191 userregs->gpr[11] = 0;
192
193 kregs->gpr[20] = 0;
194 }
195
196
197
198
199
200 kregs->sp = top_of_kernel_stack;
201 kregs->gpr[9] = (unsigned long)ret_from_fork;
202
203 task_thread_info(p)->ksp = (unsigned long)kregs;
204
205 return 0;
206}
207
208
209
210
211void start_thread(struct pt_regs *regs, unsigned long pc, unsigned long sp)
212{
213 unsigned long sr = mfspr(SPR_SR) & ~SPR_SR_SM;
214
215 memset(regs, 0, sizeof(struct pt_regs));
216
217 regs->pc = pc;
218 regs->sr = sr;
219 regs->sp = sp;
220}
221
222extern struct thread_info *_switch(struct thread_info *old_ti,
223 struct thread_info *new_ti);
224extern int lwa_flag;
225
226struct task_struct *__switch_to(struct task_struct *old,
227 struct task_struct *new)
228{
229 struct task_struct *last;
230 struct thread_info *new_ti, *old_ti;
231 unsigned long flags;
232
233 local_irq_save(flags);
234
235
236
237
238
239 new_ti = new->stack;
240 old_ti = old->stack;
241
242 lwa_flag = 0;
243
244 current_thread_info_set[smp_processor_id()] = new_ti;
245 last = (_switch(old_ti, new_ti))->task;
246
247 local_irq_restore(flags);
248
249 return last;
250}
251
252
253
254
255
256void dump_elf_thread(elf_greg_t *dest, struct pt_regs* regs)
257{
258 dest[0] = 0;
259 memcpy(dest+1, regs->gpr+1, 31*sizeof(unsigned long));
260 dest[32] = regs->pc;
261 dest[33] = regs->sr;
262 dest[34] = 0;
263 dest[35] = 0;
264}
265
266unsigned long get_wchan(struct task_struct *p)
267{
268
269
270 return 0;
271}
272