patch-2.4.21 linux-2.4.21/arch/sparc/kernel/process.c
Next file: linux-2.4.21/arch/sparc/kernel/rtrap.S
Previous file: linux-2.4.21/arch/sparc/kernel/irq.c
Back to the patch index
Back to the overall index
- Lines: 121
- Date:
2003-06-13 07:51:32.000000000 -0700
- Orig file:
linux-2.4.20/arch/sparc/kernel/process.c
- Orig date:
2002-08-02 17:39:43.000000000 -0700
diff -urN linux-2.4.20/arch/sparc/kernel/process.c linux-2.4.21/arch/sparc/kernel/process.c
@@ -384,54 +384,6 @@
}
}
-static __inline__ void copy_regs(struct pt_regs *dst, struct pt_regs *src)
-{
- __asm__ __volatile__("ldd\t[%1 + 0x00], %%g2\n\t"
- "ldd\t[%1 + 0x08], %%g4\n\t"
- "ldd\t[%1 + 0x10], %%o4\n\t"
- "std\t%%g2, [%0 + 0x00]\n\t"
- "std\t%%g4, [%0 + 0x08]\n\t"
- "std\t%%o4, [%0 + 0x10]\n\t"
- "ldd\t[%1 + 0x18], %%g2\n\t"
- "ldd\t[%1 + 0x20], %%g4\n\t"
- "ldd\t[%1 + 0x28], %%o4\n\t"
- "std\t%%g2, [%0 + 0x18]\n\t"
- "std\t%%g4, [%0 + 0x20]\n\t"
- "std\t%%o4, [%0 + 0x28]\n\t"
- "ldd\t[%1 + 0x30], %%g2\n\t"
- "ldd\t[%1 + 0x38], %%g4\n\t"
- "ldd\t[%1 + 0x40], %%o4\n\t"
- "std\t%%g2, [%0 + 0x30]\n\t"
- "std\t%%g4, [%0 + 0x38]\n\t"
- "ldd\t[%1 + 0x48], %%g2\n\t"
- "std\t%%o4, [%0 + 0x40]\n\t"
- "std\t%%g2, [%0 + 0x48]\n\t" : :
- "r" (dst), "r" (src) :
- "g2", "g3", "g4", "g5", "o4", "o5");
-}
-
-static __inline__ void copy_regwin(struct reg_window *dst, struct reg_window *src)
-{
- __asm__ __volatile__("ldd\t[%1 + 0x00], %%g2\n\t"
- "ldd\t[%1 + 0x08], %%g4\n\t"
- "ldd\t[%1 + 0x10], %%o4\n\t"
- "std\t%%g2, [%0 + 0x00]\n\t"
- "std\t%%g4, [%0 + 0x08]\n\t"
- "std\t%%o4, [%0 + 0x10]\n\t"
- "ldd\t[%1 + 0x18], %%g2\n\t"
- "ldd\t[%1 + 0x20], %%g4\n\t"
- "ldd\t[%1 + 0x28], %%o4\n\t"
- "std\t%%g2, [%0 + 0x18]\n\t"
- "std\t%%g4, [%0 + 0x20]\n\t"
- "std\t%%o4, [%0 + 0x28]\n\t"
- "ldd\t[%1 + 0x30], %%g2\n\t"
- "ldd\t[%1 + 0x38], %%g4\n\t"
- "std\t%%g2, [%0 + 0x30]\n\t"
- "std\t%%g4, [%0 + 0x38]\n\t" : :
- "r" (dst), "r" (src) :
- "g2", "g3", "g4", "g5", "o4", "o5");
-}
-
static __inline__ struct sparc_stackf *
clone_stackframe(struct sparc_stackf *dst, struct sparc_stackf *src)
{
@@ -473,8 +425,7 @@
struct task_struct *p, struct pt_regs *regs)
{
struct pt_regs *childregs;
- struct reg_window *new_stack;
- unsigned long stack_offset;
+ char *new_stack;
#ifndef CONFIG_SMP
if(last_task_used_math == current) {
@@ -489,15 +440,18 @@
#endif
}
- /* Calculate offset to stack_frame & pt_regs */
- stack_offset = TASK_UNION_SIZE - TRACEREG_SZ;
-
- if(regs->psr & PSR_PS)
- stack_offset -= REGWIN_SZ;
- childregs = ((struct pt_regs *) (((unsigned long)p) + stack_offset));
- copy_regs(childregs, regs);
- new_stack = (((struct reg_window *) childregs) - 1);
- copy_regwin(new_stack, (((struct reg_window *) regs) - 1));
+ /*
+ * p new_stack childregs
+ * ! ! ! {if(PSR_PS) }
+ * V V (stk.fr.) V (pt_regs) { (stk.fr.) }
+ * +----- - - - - - ------+===========+============={+==========}+
+ */
+ new_stack = (char*)p + TASK_UNION_SIZE;
+ if (regs->psr & PSR_PS)
+ new_stack -= STACKFRAME_SZ;
+ new_stack -= STACKFRAME_SZ + TRACEREG_SZ;
+ memcpy(new_stack, (char *)regs - STACKFRAME_SZ, STACKFRAME_SZ + TRACEREG_SZ);
+ childregs = (struct pt_regs *) (new_stack + STACKFRAME_SZ);
p->thread.ksp = (unsigned long) new_stack;
p->thread.kpc = (((unsigned long) ret_from_fork) - 0x8);
@@ -511,16 +465,11 @@
extern struct pt_regs fake_swapper_regs;
p->thread.kregs = &fake_swapper_regs;
- new_stack = (struct reg_window *)
- ((((unsigned long)p) +
- (TASK_UNION_SIZE)) -
- (REGWIN_SZ));
+ new_stack += STACKFRAME_SZ + TRACEREG_SZ;
childregs->u_regs[UREG_FP] = (unsigned long) new_stack;
p->thread.flags |= SPARC_FLAG_KTHREAD;
p->thread.current_ds = KERNEL_DS;
- memcpy((void *)new_stack,
- (void *)regs->u_regs[UREG_FP],
- sizeof(struct reg_window));
+ memcpy(new_stack, (void *)regs->u_regs[UREG_FP], STACKFRAME_SZ);
childregs->u_regs[UREG_G6] = (unsigned long) p;
} else {
p->thread.kregs = childregs;
@@ -676,7 +625,7 @@
* a system call from a "real" process, but the process memory space will
* not be free'd until both the parent and the child have exited.
*/
-pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
+pid_t arch_kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
{
long retval;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)