2 * Architecture-dependent parts of process handling.
4 * Copyright (C) 2013 Altera Corporation
5 * Copyright (C) 2010 Tobias Klauser <tklauser@distanz.ch>
6 * Copyright (C) 2009 Wind River Systems Inc
7 * Implemented by fredrik.markstrom@gmail.com and ivarholmqvist@gmail.com
8 * Copyright (C) 2004 Microtronix Datacom Ltd
10 * This file is subject to the terms and conditions of the GNU General Public
11 * License. See the file "COPYING" in the main directory of this archive
15 #include <linux/export.h>
16 #include <linux/sched.h>
17 #include <linux/sched/debug.h>
18 #include <linux/sched/task.h>
19 #include <linux/sched/task_stack.h>
20 #include <linux/mm_types.h>
21 #include <linux/tick.h>
22 #include <linux/uaccess.h>
24 #include <asm/unistd.h>
25 #include <asm/traps.h>
26 #include <asm/cpuinfo.h>
28 asmlinkage
void ret_from_fork(void);
29 asmlinkage
void ret_from_kernel_thread(void);
31 void (*pm_power_off
)(void) = NULL
;
32 EXPORT_SYMBOL(pm_power_off
);
34 void arch_cpu_idle(void)
39 * The development boards have no way to pull a board reset. Just jump to the
40 * cpu reset address and let the boot loader or the code in head.S take care of
41 * resetting peripherals.
43 void machine_restart(char *__unused
)
45 pr_notice("Machine restart (%08x)...\n", cpuinfo
.reset_addr
);
47 __asm__
__volatile__ (
50 : "r" (cpuinfo
.reset_addr
)
54 void machine_halt(void)
56 pr_notice("Machine halt...\n");
63 * There is no way to power off the development boards. So just spin for now. If
64 * we ever have a way of resetting a board using a GPIO we should add that here.
66 void machine_power_off(void)
68 pr_notice("Machine power off...\n");
74 void show_regs(struct pt_regs
*regs
)
77 show_regs_print_info(KERN_DEFAULT
);
79 pr_notice("r1: %08lx r2: %08lx r3: %08lx r4: %08lx\n",
80 regs
->r1
, regs
->r2
, regs
->r3
, regs
->r4
);
82 pr_notice("r5: %08lx r6: %08lx r7: %08lx r8: %08lx\n",
83 regs
->r5
, regs
->r6
, regs
->r7
, regs
->r8
);
85 pr_notice("r9: %08lx r10: %08lx r11: %08lx r12: %08lx\n",
86 regs
->r9
, regs
->r10
, regs
->r11
, regs
->r12
);
88 pr_notice("r13: %08lx r14: %08lx r15: %08lx\n",
89 regs
->r13
, regs
->r14
, regs
->r15
);
91 pr_notice("ra: %08lx fp: %08lx sp: %08lx gp: %08lx\n",
92 regs
->ra
, regs
->fp
, regs
->sp
, regs
->gp
);
94 pr_notice("ea: %08lx estatus: %08lx\n",
95 regs
->ea
, regs
->estatus
);
98 void flush_thread(void)
102 int copy_thread(struct task_struct
*p
, const struct kernel_clone_args
*args
)
104 unsigned long clone_flags
= args
->flags
;
105 unsigned long usp
= args
->stack
;
106 unsigned long tls
= args
->tls
;
107 struct pt_regs
*childregs
= task_pt_regs(p
);
108 struct pt_regs
*regs
;
109 struct switch_stack
*stack
;
110 struct switch_stack
*childstack
=
111 ((struct switch_stack
*)childregs
) - 1;
113 if (unlikely(args
->fn
)) {
114 memset(childstack
, 0,
115 sizeof(struct switch_stack
) + sizeof(struct pt_regs
));
117 childstack
->r16
= (unsigned long) args
->fn
;
118 childstack
->r17
= (unsigned long) args
->fn_arg
;
119 childstack
->ra
= (unsigned long) ret_from_kernel_thread
;
120 childregs
->estatus
= STATUS_PIE
;
121 childregs
->sp
= (unsigned long) childstack
;
123 p
->thread
.ksp
= (unsigned long) childstack
;
124 p
->thread
.kregs
= childregs
;
128 regs
= current_pt_regs();
130 childregs
->r2
= 0; /* Set the return value for the child. */
133 stack
= ((struct switch_stack
*) regs
) - 1;
134 *childstack
= *stack
;
135 childstack
->ra
= (unsigned long)ret_from_fork
;
136 p
->thread
.kregs
= childregs
;
137 p
->thread
.ksp
= (unsigned long) childstack
;
142 /* Initialize tls register. */
143 if (clone_flags
& CLONE_SETTLS
)
144 childstack
->r23
= tls
;
150 * Generic dumping code. Used for panic and debug.
152 void dump(struct pt_regs
*fp
)
158 pr_emerg("\nCURRENT PROCESS:\n\n");
159 pr_emerg("COMM=%s PID=%d\n", current
->comm
, current
->pid
);
162 pr_emerg("TEXT=%08x-%08x DATA=%08x-%08x BSS=%08x-%08x\n",
163 (int) current
->mm
->start_code
,
164 (int) current
->mm
->end_code
,
165 (int) current
->mm
->start_data
,
166 (int) current
->mm
->end_data
,
167 (int) current
->mm
->end_data
,
168 (int) current
->mm
->brk
);
169 pr_emerg("USER-STACK=%08x KERNEL-STACK=%08x\n\n",
170 (int) current
->mm
->start_stack
,
171 (int)(((unsigned long) current
) + THREAD_SIZE
));
174 pr_emerg("PC: %08lx\n", fp
->ea
);
175 pr_emerg("SR: %08lx SP: %08lx\n",
176 (long) fp
->estatus
, (long) fp
);
178 pr_emerg("r1: %08lx r2: %08lx r3: %08lx\n",
179 fp
->r1
, fp
->r2
, fp
->r3
);
181 pr_emerg("r4: %08lx r5: %08lx r6: %08lx r7: %08lx\n",
182 fp
->r4
, fp
->r5
, fp
->r6
, fp
->r7
);
183 pr_emerg("r8: %08lx r9: %08lx r10: %08lx r11: %08lx\n",
184 fp
->r8
, fp
->r9
, fp
->r10
, fp
->r11
);
185 pr_emerg("r12: %08lx r13: %08lx r14: %08lx r15: %08lx\n",
186 fp
->r12
, fp
->r13
, fp
->r14
, fp
->r15
);
187 pr_emerg("or2: %08lx ra: %08lx fp: %08lx sp: %08lx\n",
188 fp
->orig_r2
, fp
->ra
, fp
->fp
, fp
->sp
);
189 pr_emerg("\nUSP: %08x TRAPFRAME: %08x\n",
190 (unsigned int) fp
->sp
, (unsigned int) fp
);
193 tp
= ((unsigned char *) fp
->ea
) - 0x20;
194 for (sp
= (unsigned long *) tp
, i
= 0; (i
< 0x40); i
+= 4) {
196 pr_emerg("\n%08x: ", (int) (tp
+ i
));
197 pr_emerg("%08x ", (int) *sp
++);
201 pr_emerg("\nKERNEL STACK:");
202 tp
= ((unsigned char *) fp
) - 0x40;
203 for (sp
= (unsigned long *) tp
, i
= 0; (i
< 0xc0); i
+= 4) {
205 pr_emerg("\n%08x: ", (int) (tp
+ i
));
206 pr_emerg("%08x ", (int) *sp
++);
211 pr_emerg("\nUSER STACK:");
212 tp
= (unsigned char *) (fp
->sp
- 0x10);
213 for (sp
= (unsigned long *) tp
, i
= 0; (i
< 0x80); i
+= 4) {
215 pr_emerg("\n%08x: ", (int) (tp
+ i
));
216 pr_emerg("%08x ", (int) *sp
++);
221 unsigned long __get_wchan(struct task_struct
*p
)
223 unsigned long fp
, pc
;
224 unsigned long stack_page
;
227 stack_page
= (unsigned long)p
;
228 fp
= ((struct switch_stack
*)p
->thread
.ksp
)->fp
; /* ;dgt2 */
230 if (fp
< stack_page
+sizeof(struct task_struct
) ||
231 fp
>= 8184+stack_page
) /* ;dgt2;tmp */
233 pc
= ((unsigned long *)fp
)[1];
234 if (!in_sched_functions(pc
))
236 fp
= *(unsigned long *) fp
;
237 } while (count
++ < 16); /* ;dgt2;tmp */
242 * Do necessary setup to start up a newly executed thread.
243 * Will startup in user mode (status_extension = 0).
245 void start_thread(struct pt_regs
*regs
, unsigned long pc
, unsigned long sp
)
247 memset((void *) regs
, 0, sizeof(struct pt_regs
));
248 regs
->estatus
= ESTATUS_EPIE
| ESTATUS_EU
;
253 asmlinkage
int nios2_clone(unsigned long clone_flags
, unsigned long newsp
,
254 int __user
*parent_tidptr
, int __user
*child_tidptr
,
257 struct kernel_clone_args args
= {
258 .flags
= (lower_32_bits(clone_flags
) & ~CSIGNAL
),
259 .pidfd
= parent_tidptr
,
260 .child_tid
= child_tidptr
,
261 .parent_tid
= parent_tidptr
,
262 .exit_signal
= (lower_32_bits(clone_flags
) & CSIGNAL
),
267 return kernel_clone(&args
);