updated x86_64 eclone() stub

Dave Hansen dave at linux.vnet.ibm.com
Fri Dec 4 08:21:29 PST 2009


On Fri, 2009-12-04 at 17:08 +0100, Louis Rilling wrote:
> On 04/12/09  8:05 -0800, Dave Hansen wrote:
> > > syscall also destroys r11, so it should be added to the clobber list.
> > 
> > Even though it is a ptregscall?
> 
> The assembly instruction itself destroys r11 (same for rcx).

Thanks again for the help, Louis.  How does this look?

int clone_with_pids(long flags_low, struct clone_args *clone_args, long args_size,
                 int *pids)
{
        long retval;

        __asm__  __volatile__(
                 "movq %5, %%r10\n\t"   /* pids in r10*/
                 "syscall\n\t"          /* Linux/x86_64 system call */
                 "testq %0,%0\n\t"      /* check return value */
                 "jne 1f\n\t"           /* jump if parent */
                 "popq %%rax\n\t"       /* get subthread function */
                 "popq %%rdi\n\t"       /* get the subthread function arg */
                 "call *%%rax\n\t"      /* start subthread function */
                 "movq %6,%0\n\t"
                 "syscall\n"            /* exit system call: exit subthread */
                 "1:\n\t"
                :"=a" (retval)
                :"0" (__NR_clone3),/* eax */
                 "D" (flags_low),  /* rdi */
                 "S" (clone_args), /* rsi */
                 "d" (args_size),  /* rdx */
                 "m" (pids),       /* gets moved to r10 */
                 "i" (__NR_exit)
                :"rcx", "r10", "r11", "cc" 
        );
        /*
         * glibc lists 'cc' as clobbered, so we might as
	 * well do it too.  'r11' and 'rcx' are clobbered
	 * by the 'syscall' instruction itself.  'r8' and
	 * 'r9' are clobbered by the clone, but that
	 * thread will exit before getting back out to C.
         */

        if (retval < 0) {
                errno = -retval;
                retval = -1;
        }
        return retval;
}



> Thanks,
> 
> Louis
> 
-- Dave



More information about the Containers mailing list