process.c (49232773d8233ed70c4998851bc84e465fc1c788) process.c (93a4fa622eb061f75f87f0cf9609ab4e69c67d01)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Author: Huacai Chen <chenhuacai@loongson.cn>
4 * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
5 *
6 * Derived from MIPS:
7 * Copyright (C) 1994 - 1999, 2000 by Ralf Baechle and others.
8 * Copyright (C) 2005, 2006 by Ralf Baechle (ralf@linux-mips.org)

--- 121 unchanged lines hidden (view full) ---

130 struct pt_regs *childregs, *regs = current_pt_regs();
131
132 childksp = (unsigned long)task_stack_page(p) + THREAD_SIZE - 32;
133
134 /* set up new TSS. */
135 childregs = (struct pt_regs *) childksp - 1;
136 /* Put the stack after the struct pt_regs. */
137 childksp = (unsigned long) childregs;
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Author: Huacai Chen <chenhuacai@loongson.cn>
4 * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
5 *
6 * Derived from MIPS:
7 * Copyright (C) 1994 - 1999, 2000 by Ralf Baechle and others.
8 * Copyright (C) 2005, 2006 by Ralf Baechle (ralf@linux-mips.org)

--- 121 unchanged lines hidden (view full) ---

130 struct pt_regs *childregs, *regs = current_pt_regs();
131
132 childksp = (unsigned long)task_stack_page(p) + THREAD_SIZE - 32;
133
134 /* set up new TSS. */
135 childregs = (struct pt_regs *) childksp - 1;
136 /* Put the stack after the struct pt_regs. */
137 childksp = (unsigned long) childregs;
138 p->thread.sched_cfa = 0;
138 p->thread.csr_euen = 0;
139 p->thread.csr_crmd = csr_read32(LOONGARCH_CSR_CRMD);
140 p->thread.csr_prmd = csr_read32(LOONGARCH_CSR_PRMD);
141 p->thread.csr_ecfg = csr_read32(LOONGARCH_CSR_ECFG);
142 if (unlikely(args->fn)) {
143 /* kernel thread */
144 p->thread.reg03 = childksp;
145 p->thread.reg23 = (unsigned long)args->fn;
146 p->thread.reg24 = (unsigned long)args->fn_arg;
147 p->thread.reg01 = (unsigned long)ret_from_kernel_thread;
139 p->thread.csr_euen = 0;
140 p->thread.csr_crmd = csr_read32(LOONGARCH_CSR_CRMD);
141 p->thread.csr_prmd = csr_read32(LOONGARCH_CSR_PRMD);
142 p->thread.csr_ecfg = csr_read32(LOONGARCH_CSR_ECFG);
143 if (unlikely(args->fn)) {
144 /* kernel thread */
145 p->thread.reg03 = childksp;
146 p->thread.reg23 = (unsigned long)args->fn;
147 p->thread.reg24 = (unsigned long)args->fn_arg;
148 p->thread.reg01 = (unsigned long)ret_from_kernel_thread;
149 p->thread.sched_ra = (unsigned long)ret_from_kernel_thread;
148 memset(childregs, 0, sizeof(struct pt_regs));
149 childregs->csr_euen = p->thread.csr_euen;
150 childregs->csr_crmd = p->thread.csr_crmd;
151 childregs->csr_prmd = p->thread.csr_prmd;
152 childregs->csr_ecfg = p->thread.csr_ecfg;
153 return 0;
154 }
155
156 /* user thread */
157 *childregs = *regs;
158 childregs->regs[4] = 0; /* Child gets zero as return value */
159 if (usp)
160 childregs->regs[3] = usp;
161
162 p->thread.reg03 = (unsigned long) childregs;
163 p->thread.reg01 = (unsigned long) ret_from_fork;
150 memset(childregs, 0, sizeof(struct pt_regs));
151 childregs->csr_euen = p->thread.csr_euen;
152 childregs->csr_crmd = p->thread.csr_crmd;
153 childregs->csr_prmd = p->thread.csr_prmd;
154 childregs->csr_ecfg = p->thread.csr_ecfg;
155 return 0;
156 }
157
158 /* user thread */
159 *childregs = *regs;
160 childregs->regs[4] = 0; /* Child gets zero as return value */
161 if (usp)
162 childregs->regs[3] = usp;
163
164 p->thread.reg03 = (unsigned long) childregs;
165 p->thread.reg01 = (unsigned long) ret_from_fork;
166 p->thread.sched_ra = (unsigned long) ret_from_fork;
164
165 /*
166 * New tasks lose permission to use the fpu. This accelerates context
167 * switching for most programs since they don't use the fpu.
168 */
169 childregs->csr_euen = 0;
170
171 clear_tsk_thread_flag(p, TIF_USEDFPU);

--- 4 unchanged lines hidden (view full) ---

176 if (clone_flags & CLONE_SETTLS)
177 childregs->regs[2] = tls;
178
179 return 0;
180}
181
182unsigned long __get_wchan(struct task_struct *task)
183{
167
168 /*
169 * New tasks lose permission to use the fpu. This accelerates context
170 * switching for most programs since they don't use the fpu.
171 */
172 childregs->csr_euen = 0;
173
174 clear_tsk_thread_flag(p, TIF_USEDFPU);

--- 4 unchanged lines hidden (view full) ---

179 if (clone_flags & CLONE_SETTLS)
180 childregs->regs[2] = tls;
181
182 return 0;
183}
184
185unsigned long __get_wchan(struct task_struct *task)
186{
184 return 0;
187 unsigned long pc;
188 struct unwind_state state;
189
190 if (!try_get_task_stack(task))
191 return 0;
192
193 unwind_start(&state, task, NULL);
194 state.sp = thread_saved_fp(task);
195 get_stack_info(state.sp, state.task, &state.stack_info);
196 state.pc = thread_saved_ra(task);
197#ifdef CONFIG_UNWINDER_PROLOGUE
198 state.type = UNWINDER_PROLOGUE;
199#endif
200 for (; !unwind_done(&state); unwind_next_frame(&state)) {
201 pc = unwind_get_return_address(&state);
202 if (!pc)
203 break;
204 if (in_sched_functions(pc))
205 continue;
206 break;
207 }
208
209 put_task_stack(task);
210
211 return pc;
185}
186
187bool in_irq_stack(unsigned long stack, struct stack_info *info)
188{
189 unsigned long nextsp;
190 unsigned long begin = (unsigned long)this_cpu_read(irq_stack);
191 unsigned long end = begin + IRQ_STACK_START;
192

--- 138 unchanged lines hidden ---
212}
213
214bool in_irq_stack(unsigned long stack, struct stack_info *info)
215{
216 unsigned long nextsp;
217 unsigned long begin = (unsigned long)this_cpu_read(irq_stack);
218 unsigned long end = begin + IRQ_STACK_START;
219

--- 138 unchanged lines hidden ---