Skip to contentSkip to conversation

ltp_clone

LTP Will Deacon 2 participants 3 messages Feb 25, 2011

lore
Share & tools
lore
#0 lore raw

Hello,

The definition of ltp_clone looks like this:

int
ltp_clone(unsigned long clone_flags, int (*fn)(void *arg), void *arg,
size_t stack_size, void *stack)

{
	int ret;
#if defined(__hppa__)
	ret = clone(fn, stack, clone_flags, arg);
#elif defined(__ia64__)
	ret = clone2(fn, stack, stack_size, clone_flags, arg, NULL, NULL, NULL);
#elif defined(__arm__)
	/*
	 * Stack size should be a multiple of 32 bit words
	 * & stack limit must be aligned to a 32 bit boundary
	 */
	ret = clone(fn, (stack ? stack + stack_size : NULL),
			clone_flags, arg);
#else
	ret = clone(fn, (stack ? stack + stack_size - 1 : NULL),
			clone_flags, arg);

#endif

	return ret;
}

I believe the __arm__ case is to ensure that we pass an aligned stack pointer to the syscall (as required by the architecture). What I don't understand, is why we pass an unaligned address in the #else case? Given that a stack push decrements the sp before writing on every architecture I know of, it seems that the __arm__ case should be used as the default rather than forcing a misaligned stack on other architectures.

Will

------------------------------------------------------------------------------
Free Software Download: Index, Search & Analyze Logs and other IT data in Real-Time with Splunk. Collect, index and harness all the fast moving IT data generated by your applications, servers and devices whether physical, virtual or in the cloud. Deliver compliance at lower cost and gain new business insights. http://p.sf.net/sfu/splunk-dev2dev
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

#1 lore raw
Quoted 39 lines · ext Will Deacon

Hello,

The definition of ltp_clone looks like this:

int
ltp_clone(unsigned long clone_flags, int (*fn)(void *arg), void *arg,
size_t stack_size, void *stack)

{
	int ret;
#if defined(__hppa__)
	ret = clone(fn, stack, clone_flags, arg);
#elif defined(__ia64__)
	ret = clone2(fn, stack, stack_size, clone_flags, arg, NULL, NULL, NULL);
#elif defined(__arm__)
	/*
	 * Stack size should be a multiple of 32 bit words
	 * & stack limit must be aligned to a 32 bit boundary
	 */
	ret = clone(fn, (stack ? stack + stack_size : NULL),
			clone_flags, arg);
#else
	ret = clone(fn, (stack ? stack + stack_size - 1 : NULL),
			clone_flags, arg);

#endif

	return ret;
}

I believe the __arm__ case is to ensure that we pass an aligned stack pointer to the syscall (as required by the architecture). What I don't understand, is why we pass an unaligned address in the #else case? Given that a stack push decrements the sp before writing on every architecture I know of, it seems that the __arm__ case should be used as the default rather than forcing a misaligned stack on other architectures.

Quoted 2 lines

Will

Hi,

have you fetched the latest from the git tree:
git://ltp.git.sourceforge.net/gitroot/ltp/ltp ?

Lines are:

int
ltp_clone(unsigned long clone_flags, int (*fn)(void *arg), void *arg,
size_t stack_size, void *stack)

{
        int ret;
#if defined(__hppa__)
        ret = clone(fn, stack, clone_flags, arg);

#elif defined(__ia64__)
ret = clone2(fn, stack, stack_size, clone_flags, arg, NULL, NULL,
NULL);
#else
/*
* For archs where stack grows downwards, stack points to the topmost
* address of the memory space set up for the child stack. */
ret = clone(fn, (stack ? stack + stack_size : NULL),
clone_flags, arg);
#endif

        return ret;
}

br,
Hannu

------------------------------------------------------------------------------
Free Software Download: Index, Search & Analyze Logs and other IT data in Real-Time with Splunk. Collect, index and harness all the fast moving IT data generated by your applications, servers and devices whether physical, virtual or in the cloud. Deliver compliance at lower cost and gain new business insights. http://p.sf.net/sfu/splunk-dev2dev
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

#2 lore raw

Hi Hannu,

Quoted 38 lines
Quoted 10 lines

I believe the __arm__ case is to ensure that we pass an aligned stack pointer to the syscall (as required by the architecture). What I don't understand, is why we pass an unaligned address in the #else case? Given that a stack push decrements the sp before writing on every architecture I know of, it seems that the __arm__ case should be used as the default rather than forcing a misaligned stack on other architectures.

Will

Hi,

have you fetched the latest from the git tree:
git://ltp.git.sourceforge.net/gitroot/ltp/ltp ?

Lines are:

int
ltp_clone(unsigned long clone_flags, int (*fn)(void *arg), void *arg,
size_t stack_size, void *stack)

{
        int ret;
#if defined(__hppa__)
        ret = clone(fn, stack, clone_flags, arg);

#elif defined(__ia64__)
ret = clone2(fn, stack, stack_size, clone_flags, arg, NULL, NULL,
NULL);
#else
/*
* For archs where stack grows downwards, stack points to the topmost
* address of the memory space set up for the child stack. */
ret = clone(fn, (stack ? stack + stack_size : NULL),
clone_flags, arg);
#endif

Quoted 2 lines
        return ret;
}

Wahey - that's much better! I was accidently looking in my checkout of the October stable release, where ARM is special-cased.

Thanks for pointing this out.

Will

------------------------------------------------------------------------------
Free Software Download: Index, Search & Analyze Logs and other IT data in Real-Time with Splunk. Collect, index and harness all the fast moving IT data generated by your applications, servers and devices whether physical, virtual or in the cloud. Deliver compliance at lower cost and gain new business insights. http://p.sf.net/sfu/splunk-dev2dev
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list