Subject: Re: Linux clone() emulation arguments
To: Emmanuel Dreyfus <p99dreyf@criens.u-psud.fr>
From: Jason R Thorpe <thorpej@zembu.com>
List: tech-kern
Date: 06/03/2001 07:33:41
On Sun, Jun 03, 2001 at 11:30:42AM +0200, Emmanuel Dreyfus wrote:

 > I don't understand how our Linux emulation of clone() works.
 > 
 > In the Linux kernel, it is implemented as:
 > i386: 
 > int sys_clone(struct pt_regs regs) 
 > 
 > PowerPC:
 > int sys_clone(int p1, int p2, int p3, int p4, int p5, int p6, struct
 > pt_regs *regs) 
 > 
 > m68k:
 > int m68k_clone(struct pt_regs *regs)
 > called by an assembly language glue (sys_clone)
 > 
 > alpha:
 > int alpha_clone(unsigned long clone_flags, unsigned long usp, struct
 > switch_stack * swstack)
 > called by an assembly language glue (sys_clone)

These are all machdep versions called by machdep syscall entry code.  The
API for all of these is the same from the userland perspective.

 > In the NetBSD emulation subsystem, we have this for all Linux ports
 > int linux_sys_clone(int flags, void *stack)
 > 
 > Question: how does this work? How do we get the correct arguments?
 > 
 > I'm currently hunting bugs in kernel thread emulations, with bad stacks
 > pointers that cause segmentation faults, and I suspect this may be my
 > problem. For instance I'm not sure the new stack address or the thread
 > entry point are correctly passed to linux_sys_clone() on the PowerPC.

Hm .. some printfs in cpu_fork() should be able to tell you pretty
quickly...

-- 
        -- Jason R. Thorpe <thorpej@zembu.com>