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 --- |