* aarch64 clone() man page omission
@ 2016-04-25 19:42 Colin Ian King
[not found] ` <571E731A.6050809-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org>
0 siblings, 1 reply; 13+ messages in thread
From: Colin Ian King @ 2016-04-25 19:42 UTC (permalink / raw)
To: mtk.manpages-Re5JQEeQqe8AvxtiuMwx3w; +Cc: linux-man-u79uwXL29TY76Z2rM5mHXA
Hi there,
currently, the aarch64 clone() system call requires the stack to be
aligned at a 16 byte boundary, see arch/arm64/kernel/process.c,
copy_thread():
if (stack_start) {
if (is_compat_thread(task_thread_info(p)))
childregs->compat_sp = stack_start;
/* 16-byte aligned stack mandatory on AArch64 */
else if (stack_start & 15)
return -EINVAL;
else
childregs->sp = stack_start;
}
..and returns -EINVAL if not aligned correctly. This should be added to
the manual page clone(2) as it took me a while to figure out why clone()
was failing with -EINVAL for aarch64 but not on x86.
Colin
--
To unsubscribe from this list: send the line "unsubscribe linux-man" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 13+ messages in thread[parent not found: <571E731A.6050809-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org>]
* Re: aarch64 clone() man page omission [not found] ` <571E731A.6050809-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org> @ 2016-05-09 21:01 ` Michael Kerrisk (man-pages) 2016-05-09 21:31 ` Mike Frysinger 1 sibling, 0 replies; 13+ messages in thread From: Michael Kerrisk (man-pages) @ 2016-05-09 21:01 UTC (permalink / raw) To: Colin Ian King Cc: mtk.manpages-Re5JQEeQqe8AvxtiuMwx3w, linux-man-u79uwXL29TY76Z2rM5mHXA Hi Colin, On 04/25/2016 09:42 PM, Colin Ian King wrote: > Hi there, > > currently, the aarch64 clone() system call requires the stack to be > aligned at a 16 byte boundary, see arch/arm64/kernel/process.c, > copy_thread(): > > if (stack_start) { > if (is_compat_thread(task_thread_info(p))) > childregs->compat_sp = stack_start; > /* 16-byte aligned stack mandatory on AArch64 */ > else if (stack_start & 15) > return -EINVAL; > else > childregs->sp = stack_start; > } > > > ..and returns -EINVAL if not aligned correctly. This should be added to > the manual page clone(2) as it took me a while to figure out why clone() > was failing with -EINVAL for aarch64 but not on x86. Thanks for the report!I applied the patch below. (Seem okay?) Cheers, Michael diff --git a/man2/clone.2 b/man2/clone.2 index c9ce21c..184875a 100644 --- a/man2/clone.2 +++ b/man2/clone.2 @@ -969,6 +969,13 @@ but the kernel was not configured with the .B CONFIG_UTS option. .TP +.B EINVAL +.I child_stack +is not aligned to a suitable boundary for this architecture. +For example, on aarch64, +.I child_stack +must be a multiple of 16. +.TP .B ENOMEM Cannot allocate sufficient memory to allocate a task structure for the child, or to copy those parts of the caller's context that need to be -- Michael Kerrisk Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/ Linux/UNIX System Programming Training: http://man7.org/training/ -- To unsubscribe from this list: send the line "unsubscribe linux-man" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: aarch64 clone() man page omission [not found] ` <571E731A.6050809-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org> 2016-05-09 21:01 ` Michael Kerrisk (man-pages) @ 2016-05-09 21:31 ` Mike Frysinger [not found] ` <20160509213140.GD26300-UgUKS2FnFs9+urZeOPWqwQ@public.gmane.org> 1 sibling, 1 reply; 13+ messages in thread From: Mike Frysinger @ 2016-05-09 21:31 UTC (permalink / raw) To: Colin Ian King Cc: mtk.manpages-Re5JQEeQqe8AvxtiuMwx3w, linux-man-u79uwXL29TY76Z2rM5mHXA [-- Attachment #1: Type: text/plain, Size: 1187 bytes --] On 25 Apr 2016 20:42, Colin Ian King wrote: > currently, the aarch64 clone() system call requires the stack to be > aligned at a 16 byte boundary, see arch/arm64/kernel/process.c, > copy_thread(): > > if (stack_start) { > if (is_compat_thread(task_thread_info(p))) > childregs->compat_sp = stack_start; > /* 16-byte aligned stack mandatory on AArch64 */ > else if (stack_start & 15) > return -EINVAL; > else > childregs->sp = stack_start; > } > > > ..and returns -EINVAL if not aligned correctly. This should be added to > the manual page clone(2) as it took me a while to figure out why clone() > was failing with -EINVAL for aarch64 but not on x86. seems weird for the kernel to be enforcing this. is it just because of the stated ABI ? or is there some weird requirement in the kernel itself that requires this ? it's not like other arches have this check, and there are def ABI requirements about stack alignments in C. -mike [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 819 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
[parent not found: <20160509213140.GD26300-UgUKS2FnFs9+urZeOPWqwQ@public.gmane.org>]
* Re: aarch64 clone() man page omission [not found] ` <20160509213140.GD26300-UgUKS2FnFs9+urZeOPWqwQ@public.gmane.org> @ 2016-05-09 21:40 ` Colin Ian King [not found] ` <573103C8.9050008-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org> 0 siblings, 1 reply; 13+ messages in thread From: Colin Ian King @ 2016-05-09 21:40 UTC (permalink / raw) To: mtk.manpages-Re5JQEeQqe8AvxtiuMwx3w, linux-man-u79uwXL29TY76Z2rM5mHXA [-- Attachment #1.1: Type: text/plain, Size: 1429 bytes --] On 09/05/16 22:31, Mike Frysinger wrote: > On 25 Apr 2016 20:42, Colin Ian King wrote: >> currently, the aarch64 clone() system call requires the stack to be >> aligned at a 16 byte boundary, see arch/arm64/kernel/process.c, >> copy_thread(): >> >> if (stack_start) { >> if (is_compat_thread(task_thread_info(p))) >> childregs->compat_sp = stack_start; >> /* 16-byte aligned stack mandatory on AArch64 */ >> else if (stack_start & 15) >> return -EINVAL; >> else >> childregs->sp = stack_start; >> } >> >> >> ..and returns -EINVAL if not aligned correctly. This should be added to >> the manual page clone(2) as it took me a while to figure out why clone() >> was failing with -EINVAL for aarch64 but not on x86. > > seems weird for the kernel to be enforcing this. is it just because of > the stated ABI ? or is there some weird requirement in the kernel itself > that requires this ? it's not like other arches have this check, and > there are def ABI requirements about stack alignments in C. > -mike > The article here indicates it is an aarch64 convention: https://community.arm.com/groups/processors/blog/2015/11/19/using-the-stack-in-aarch32-and-aarch64 [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 819 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
[parent not found: <573103C8.9050008-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org>]
* Re: aarch64 clone() man page omission [not found] ` <573103C8.9050008-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org> @ 2016-05-11 2:50 ` Mike Frysinger [not found] ` <20160511025040.GL26300-UgUKS2FnFs9+urZeOPWqwQ@public.gmane.org> 0 siblings, 1 reply; 13+ messages in thread From: Mike Frysinger @ 2016-05-11 2:50 UTC (permalink / raw) To: Colin Ian King Cc: mtk.manpages-Re5JQEeQqe8AvxtiuMwx3w, linux-man-u79uwXL29TY76Z2rM5mHXA, catalin.marinas-5wv7dgnIgG8 [-- Attachment #1: Type: text/plain, Size: 1871 bytes --] On 09 May 2016 22:40, Colin Ian King wrote: > On 09/05/16 22:31, Mike Frysinger wrote: > > On 25 Apr 2016 20:42, Colin Ian King wrote: > >> currently, the aarch64 clone() system call requires the stack to be > >> aligned at a 16 byte boundary, see arch/arm64/kernel/process.c, > >> copy_thread(): > >> > >> if (stack_start) { > >> if (is_compat_thread(task_thread_info(p))) > >> childregs->compat_sp = stack_start; > >> /* 16-byte aligned stack mandatory on AArch64 */ > >> else if (stack_start & 15) > >> return -EINVAL; > >> else > >> childregs->sp = stack_start; > >> } > >> > >> > >> ..and returns -EINVAL if not aligned correctly. This should be added to > >> the manual page clone(2) as it took me a while to figure out why clone() > >> was failing with -EINVAL for aarch64 but not on x86. > > > > seems weird for the kernel to be enforcing this. is it just because of > > the stated ABI ? or is there some weird requirement in the kernel itself > > that requires this ? it's not like other arches have this check, and > > there are def ABI requirements about stack alignments in C. > > The article here indicates it is an aarch64 convention: > > https://community.arm.com/groups/processors/blog/2015/11/19/using-the-stack-in-aarch32-and-aarch64 that checks my point about the ABI having alignment requirements, but that doesn't mean it needs to be checked/enforced in the kernel. all the limitations i see there can be seen in other arches, but we don't have those arches do any stack alignment checking. so should we be dropping it from aarch64 ? why does it need to be special here ? -mike [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 819 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
[parent not found: <20160511025040.GL26300-UgUKS2FnFs9+urZeOPWqwQ@public.gmane.org>]
* Re: aarch64 clone() man page omission [not found] ` <20160511025040.GL26300-UgUKS2FnFs9+urZeOPWqwQ@public.gmane.org> @ 2016-05-11 13:18 ` Catalin Marinas [not found] ` <20160511131855.GG3051-M2fw3Uu6cmfZROr8t4l/smS4ubULX0JqMm0uRHvK7Nw@public.gmane.org> 0 siblings, 1 reply; 13+ messages in thread From: Catalin Marinas @ 2016-05-11 13:18 UTC (permalink / raw) To: Colin Ian King, mtk.manpages-Re5JQEeQqe8AvxtiuMwx3w, linux-man-u79uwXL29TY76Z2rM5mHXA On Tue, May 10, 2016 at 10:50:40PM -0400, Mike Frysinger wrote: > On 09 May 2016 22:40, Colin Ian King wrote: > > On 09/05/16 22:31, Mike Frysinger wrote: > > > On 25 Apr 2016 20:42, Colin Ian King wrote: > > >> currently, the aarch64 clone() system call requires the stack to be > > >> aligned at a 16 byte boundary, see arch/arm64/kernel/process.c, > > >> copy_thread(): > > >> > > >> if (stack_start) { > > >> if (is_compat_thread(task_thread_info(p))) > > >> childregs->compat_sp = stack_start; > > >> /* 16-byte aligned stack mandatory on AArch64 */ > > >> else if (stack_start & 15) > > >> return -EINVAL; > > >> else > > >> childregs->sp = stack_start; > > >> } > > >> > > >> > > >> ..and returns -EINVAL if not aligned correctly. This should be added to > > >> the manual page clone(2) as it took me a while to figure out why clone() > > >> was failing with -EINVAL for aarch64 but not on x86. > > > > > > seems weird for the kernel to be enforcing this. is it just because of > > > the stated ABI ? or is there some weird requirement in the kernel itself > > > that requires this ? it's not like other arches have this check, and > > > there are def ABI requirements about stack alignments in C. > > > > The article here indicates it is an aarch64 convention: > > > > https://community.arm.com/groups/processors/blog/2015/11/19/using-the-stack-in-aarch32-and-aarch64 > > that checks my point about the ABI having alignment requirements, but > that doesn't mean it needs to be checked/enforced in the kernel. all > the limitations i see there can be seen in other arches, but we don't > have those arches do any stack alignment checking. so should we be > dropping it from aarch64 ? why does it need to be special here ? It is not just a software ABI requirement but a hardware one. If you try to access the stack with an unaligned SP value, you get a fault followed by a SIGBUS delivered to the user application. We decided to enforce this at the copy_thread() level, it is easier to catch such issue early than debugging SIGBUS delivered to a thread. -- Catalin -- To unsubscribe from this list: send the line "unsubscribe linux-man" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 13+ messages in thread
[parent not found: <20160511131855.GG3051-M2fw3Uu6cmfZROr8t4l/smS4ubULX0JqMm0uRHvK7Nw@public.gmane.org>]
* Re: aarch64 clone() man page omission [not found] ` <20160511131855.GG3051-M2fw3Uu6cmfZROr8t4l/smS4ubULX0JqMm0uRHvK7Nw@public.gmane.org> @ 2016-05-11 13:33 ` Colin Ian King [not found] ` <5733348D.7010301-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org> 2016-05-11 14:00 ` Mike Frysinger 1 sibling, 1 reply; 13+ messages in thread From: Colin Ian King @ 2016-05-11 13:33 UTC (permalink / raw) To: Catalin Marinas, mtk.manpages-Re5JQEeQqe8AvxtiuMwx3w, linux-man-u79uwXL29TY76Z2rM5mHXA On 11/05/16 14:18, Catalin Marinas wrote: > On Tue, May 10, 2016 at 10:50:40PM -0400, Mike Frysinger wrote: >> On 09 May 2016 22:40, Colin Ian King wrote: >>> On 09/05/16 22:31, Mike Frysinger wrote: >>>> On 25 Apr 2016 20:42, Colin Ian King wrote: >>>>> currently, the aarch64 clone() system call requires the stack to be >>>>> aligned at a 16 byte boundary, see arch/arm64/kernel/process.c, >>>>> copy_thread(): >>>>> >>>>> if (stack_start) { >>>>> if (is_compat_thread(task_thread_info(p))) >>>>> childregs->compat_sp = stack_start; >>>>> /* 16-byte aligned stack mandatory on AArch64 */ >>>>> else if (stack_start & 15) >>>>> return -EINVAL; >>>>> else >>>>> childregs->sp = stack_start; >>>>> } >>>>> >>>>> >>>>> ..and returns -EINVAL if not aligned correctly. This should be added to >>>>> the manual page clone(2) as it took me a while to figure out why clone() >>>>> was failing with -EINVAL for aarch64 but not on x86. >>>> >>>> seems weird for the kernel to be enforcing this. is it just because of >>>> the stated ABI ? or is there some weird requirement in the kernel itself >>>> that requires this ? it's not like other arches have this check, and >>>> there are def ABI requirements about stack alignments in C. >>> >>> The article here indicates it is an aarch64 convention: >>> >>> https://community.arm.com/groups/processors/blog/2015/11/19/using-the-stack-in-aarch32-and-aarch64 >> >> that checks my point about the ABI having alignment requirements, but >> that doesn't mean it needs to be checked/enforced in the kernel. all >> the limitations i see there can be seen in other arches, but we don't >> have those arches do any stack alignment checking. so should we be >> dropping it from aarch64 ? why does it need to be special here ? > > It is not just a software ABI requirement but a hardware one. If you try > to access the stack with an unaligned SP value, you get a fault followed > by a SIGBUS delivered to the user application. We decided to enforce > this at the copy_thread() level, it is easier to catch such issue early > than debugging SIGBUS delivered to a thread. > Rather than returning -EINVAL would it be more useful re-align stack_start to the 16 byte boundary in copy_thread as a silent but useful fixup? It took me a while to debug the -EINVAL on the clone() system call to figure out what was wrong because I didn't realize aarch64 has this constraint. Colin -- To unsubscribe from this list: send the line "unsubscribe linux-man" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 13+ messages in thread
[parent not found: <5733348D.7010301-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org>]
* Re: aarch64 clone() man page omission [not found] ` <5733348D.7010301-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org> @ 2016-05-11 15:22 ` Catalin Marinas [not found] ` <20160511152249.GI3051-M2fw3Uu6cmfZROr8t4l/smS4ubULX0JqMm0uRHvK7Nw@public.gmane.org> 0 siblings, 1 reply; 13+ messages in thread From: Catalin Marinas @ 2016-05-11 15:22 UTC (permalink / raw) To: Colin Ian King Cc: mtk.manpages-Re5JQEeQqe8AvxtiuMwx3w, linux-man-u79uwXL29TY76Z2rM5mHXA On Wed, May 11, 2016 at 02:33:01PM +0100, Colin Ian King wrote: > On 11/05/16 14:18, Catalin Marinas wrote: > > On Tue, May 10, 2016 at 10:50:40PM -0400, Mike Frysinger wrote: > >> On 09 May 2016 22:40, Colin Ian King wrote: > >>> On 09/05/16 22:31, Mike Frysinger wrote: > >>>> On 25 Apr 2016 20:42, Colin Ian King wrote: > >>>>> currently, the aarch64 clone() system call requires the stack to be > >>>>> aligned at a 16 byte boundary, see arch/arm64/kernel/process.c, > >>>>> copy_thread(): > >>>>> > >>>>> if (stack_start) { > >>>>> if (is_compat_thread(task_thread_info(p))) > >>>>> childregs->compat_sp = stack_start; > >>>>> /* 16-byte aligned stack mandatory on AArch64 */ > >>>>> else if (stack_start & 15) > >>>>> return -EINVAL; > >>>>> else > >>>>> childregs->sp = stack_start; > >>>>> } > >>>>> > >>>>> > >>>>> ..and returns -EINVAL if not aligned correctly. This should be added to > >>>>> the manual page clone(2) as it took me a while to figure out why clone() > >>>>> was failing with -EINVAL for aarch64 but not on x86. > >>>> > >>>> seems weird for the kernel to be enforcing this. is it just because of > >>>> the stated ABI ? or is there some weird requirement in the kernel itself > >>>> that requires this ? it's not like other arches have this check, and > >>>> there are def ABI requirements about stack alignments in C. > >>> > >>> The article here indicates it is an aarch64 convention: > >>> > >>> https://community.arm.com/groups/processors/blog/2015/11/19/using-the-stack-in-aarch32-and-aarch64 > >> > >> that checks my point about the ABI having alignment requirements, but > >> that doesn't mean it needs to be checked/enforced in the kernel. all > >> the limitations i see there can be seen in other arches, but we don't > >> have those arches do any stack alignment checking. so should we be > >> dropping it from aarch64 ? why does it need to be special here ? > > > > It is not just a software ABI requirement but a hardware one. If you try > > to access the stack with an unaligned SP value, you get a fault followed > > by a SIGBUS delivered to the user application. We decided to enforce > > this at the copy_thread() level, it is easier to catch such issue early > > than debugging SIGBUS delivered to a thread. > > Rather than returning -EINVAL would it be more useful re-align > stack_start to the 16 byte boundary in copy_thread as a silent but > useful fixup? I wouldn't silently re-align the stack, it's a significant kernel ABI change. Even dropping -EINVAL in favour of a later SIGBUS is an ABI change, though not sure if any user apps or libraries would be affected (I wouldn't expect them to rely on the -EINVAL return). It seems that musl does this alignment in its clone(2) implementation: https://git.musl-libc.org/cgit/musl/tree/src/thread/aarch64/clone.s IIUC, glibc does not. > It took me a while to debug the -EINVAL on the clone() system call to > figure out what was wrong because I didn't realize aarch64 has this > constraint. Would it have been easier to get a SIGBUS on the first stack access? It's worth posting a patch removing -EINVAL on linux-arm-kernel for wider discussion. -- Catalin -- To unsubscribe from this list: send the line "unsubscribe linux-man" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 13+ messages in thread
[parent not found: <20160511152249.GI3051-M2fw3Uu6cmfZROr8t4l/smS4ubULX0JqMm0uRHvK7Nw@public.gmane.org>]
* Re: aarch64 clone() man page omission [not found] ` <20160511152249.GI3051-M2fw3Uu6cmfZROr8t4l/smS4ubULX0JqMm0uRHvK7Nw@public.gmane.org> @ 2016-05-11 15:25 ` Colin Ian King 0 siblings, 0 replies; 13+ messages in thread From: Colin Ian King @ 2016-05-11 15:25 UTC (permalink / raw) To: Catalin Marinas Cc: mtk.manpages-Re5JQEeQqe8AvxtiuMwx3w, linux-man-u79uwXL29TY76Z2rM5mHXA On 11/05/16 16:22, Catalin Marinas wrote: > On Wed, May 11, 2016 at 02:33:01PM +0100, Colin Ian King wrote: >> On 11/05/16 14:18, Catalin Marinas wrote: >>> On Tue, May 10, 2016 at 10:50:40PM -0400, Mike Frysinger wrote: >>>> On 09 May 2016 22:40, Colin Ian King wrote: >>>>> On 09/05/16 22:31, Mike Frysinger wrote: >>>>>> On 25 Apr 2016 20:42, Colin Ian King wrote: >>>>>>> currently, the aarch64 clone() system call requires the stack to be >>>>>>> aligned at a 16 byte boundary, see arch/arm64/kernel/process.c, >>>>>>> copy_thread(): >>>>>>> >>>>>>> if (stack_start) { >>>>>>> if (is_compat_thread(task_thread_info(p))) >>>>>>> childregs->compat_sp = stack_start; >>>>>>> /* 16-byte aligned stack mandatory on AArch64 */ >>>>>>> else if (stack_start & 15) >>>>>>> return -EINVAL; >>>>>>> else >>>>>>> childregs->sp = stack_start; >>>>>>> } >>>>>>> >>>>>>> >>>>>>> ..and returns -EINVAL if not aligned correctly. This should be added to >>>>>>> the manual page clone(2) as it took me a while to figure out why clone() >>>>>>> was failing with -EINVAL for aarch64 but not on x86. >>>>>> >>>>>> seems weird for the kernel to be enforcing this. is it just because of >>>>>> the stated ABI ? or is there some weird requirement in the kernel itself >>>>>> that requires this ? it's not like other arches have this check, and >>>>>> there are def ABI requirements about stack alignments in C. >>>>> >>>>> The article here indicates it is an aarch64 convention: >>>>> >>>>> https://community.arm.com/groups/processors/blog/2015/11/19/using-the-stack-in-aarch32-and-aarch64 >>>> >>>> that checks my point about the ABI having alignment requirements, but >>>> that doesn't mean it needs to be checked/enforced in the kernel. all >>>> the limitations i see there can be seen in other arches, but we don't >>>> have those arches do any stack alignment checking. so should we be >>>> dropping it from aarch64 ? why does it need to be special here ? >>> >>> It is not just a software ABI requirement but a hardware one. If you try >>> to access the stack with an unaligned SP value, you get a fault followed >>> by a SIGBUS delivered to the user application. We decided to enforce >>> this at the copy_thread() level, it is easier to catch such issue early >>> than debugging SIGBUS delivered to a thread. >> >> Rather than returning -EINVAL would it be more useful re-align >> stack_start to the 16 byte boundary in copy_thread as a silent but >> useful fixup? > > I wouldn't silently re-align the stack, it's a significant kernel ABI > change. Even dropping -EINVAL in favour of a later SIGBUS is an ABI > change, though not sure if any user apps or libraries would be affected > (I wouldn't expect them to rely on the -EINVAL return). > > It seems that musl does this alignment in its clone(2) implementation: > > https://git.musl-libc.org/cgit/musl/tree/src/thread/aarch64/clone.s > > IIUC, glibc does not. > >> It took me a while to debug the -EINVAL on the clone() system call to >> figure out what was wrong because I didn't realize aarch64 has this >> constraint. > > Would it have been easier to get a SIGBUS on the first stack access? Not sure if that's a rhetorical question, but needless to say, a SIGBUS on the stack would be more of a hint from userspace that can be debugged without diving into the kernel than having -EINVAL IMHO. > > It's worth posting a patch removing -EINVAL on linux-arm-kernel for > wider discussion. > Yup, good idea. -- To unsubscribe from this list: send the line "unsubscribe linux-man" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: aarch64 clone() man page omission [not found] ` <20160511131855.GG3051-M2fw3Uu6cmfZROr8t4l/smS4ubULX0JqMm0uRHvK7Nw@public.gmane.org> 2016-05-11 13:33 ` Colin Ian King @ 2016-05-11 14:00 ` Mike Frysinger [not found] ` <20160511140024.GM26300-UgUKS2FnFs9+urZeOPWqwQ@public.gmane.org> 1 sibling, 1 reply; 13+ messages in thread From: Mike Frysinger @ 2016-05-11 14:00 UTC (permalink / raw) To: Catalin Marinas Cc: Colin Ian King, mtk.manpages-Re5JQEeQqe8AvxtiuMwx3w, linux-man-u79uwXL29TY76Z2rM5mHXA [-- Attachment #1: Type: text/plain, Size: 2926 bytes --] On 11 May 2016 14:18, Catalin Marinas wrote: > On Tue, May 10, 2016 at 10:50:40PM -0400, Mike Frysinger wrote: > > On 09 May 2016 22:40, Colin Ian King wrote: > > > On 09/05/16 22:31, Mike Frysinger wrote: > > > > On 25 Apr 2016 20:42, Colin Ian King wrote: > > > >> currently, the aarch64 clone() system call requires the stack to be > > > >> aligned at a 16 byte boundary, see arch/arm64/kernel/process.c, > > > >> copy_thread(): > > > >> > > > >> if (stack_start) { > > > >> if (is_compat_thread(task_thread_info(p))) > > > >> childregs->compat_sp = stack_start; > > > >> /* 16-byte aligned stack mandatory on AArch64 */ > > > >> else if (stack_start & 15) > > > >> return -EINVAL; > > > >> else > > > >> childregs->sp = stack_start; > > > >> } > > > >> > > > >> > > > >> ..and returns -EINVAL if not aligned correctly. This should be added to > > > >> the manual page clone(2) as it took me a while to figure out why clone() > > > >> was failing with -EINVAL for aarch64 but not on x86. > > > > > > > > seems weird for the kernel to be enforcing this. is it just because of > > > > the stated ABI ? or is there some weird requirement in the kernel itself > > > > that requires this ? it's not like other arches have this check, and > > > > there are def ABI requirements about stack alignments in C. > > > > > > The article here indicates it is an aarch64 convention: > > > > > > https://community.arm.com/groups/processors/blog/2015/11/19/using-the-stack-in-aarch32-and-aarch64 > > > > that checks my point about the ABI having alignment requirements, but > > that doesn't mean it needs to be checked/enforced in the kernel. all > > the limitations i see there can be seen in other arches, but we don't > > have those arches do any stack alignment checking. so should we be > > dropping it from aarch64 ? why does it need to be special here ? > > It is not just a software ABI requirement but a hardware one. If you try > to access the stack with an unaligned SP value, you get a fault followed > by a SIGBUS delivered to the user application. We decided to enforce > this at the copy_thread() level, it is easier to catch such issue early > than debugging SIGBUS delivered to a thread. as i said, that same behavior can be observed on other arches. i know of at least one for sure that if the stack is unaligned, then push/pop ops will also trigger SIGBUS. x86 tends to be more forgiving, but if it isn't 16bytes, then it is known that SSE optimized code will often fault. so the question is still: why is aarch64 enforcing in the kernel what all other arches have left alone even when they behave the same in hardware ? -mike [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 819 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
[parent not found: <20160511140024.GM26300-UgUKS2FnFs9+urZeOPWqwQ@public.gmane.org>]
* Re: aarch64 clone() man page omission [not found] ` <20160511140024.GM26300-UgUKS2FnFs9+urZeOPWqwQ@public.gmane.org> @ 2016-05-11 15:26 ` Catalin Marinas [not found] ` <20160511152622.GJ3051-M2fw3Uu6cmfZROr8t4l/smS4ubULX0JqMm0uRHvK7Nw@public.gmane.org> 0 siblings, 1 reply; 13+ messages in thread From: Catalin Marinas @ 2016-05-11 15:26 UTC (permalink / raw) To: Colin Ian King, mtk.manpages-Re5JQEeQqe8AvxtiuMwx3w, linux-man-u79uwXL29TY76Z2rM5mHXA On Wed, May 11, 2016 at 10:00:24AM -0400, Mike Frysinger wrote: > On 11 May 2016 14:18, Catalin Marinas wrote: > > On Tue, May 10, 2016 at 10:50:40PM -0400, Mike Frysinger wrote: > > > On 09 May 2016 22:40, Colin Ian King wrote: > > > > On 09/05/16 22:31, Mike Frysinger wrote: > > > > > On 25 Apr 2016 20:42, Colin Ian King wrote: > > > > >> currently, the aarch64 clone() system call requires the stack to be > > > > >> aligned at a 16 byte boundary, see arch/arm64/kernel/process.c, > > > > >> copy_thread(): > > > > >> > > > > >> if (stack_start) { > > > > >> if (is_compat_thread(task_thread_info(p))) > > > > >> childregs->compat_sp = stack_start; > > > > >> /* 16-byte aligned stack mandatory on AArch64 */ > > > > >> else if (stack_start & 15) > > > > >> return -EINVAL; > > > > >> else > > > > >> childregs->sp = stack_start; > > > > >> } > > > > >> > > > > >> > > > > >> ..and returns -EINVAL if not aligned correctly. This should be added to > > > > >> the manual page clone(2) as it took me a while to figure out why clone() > > > > >> was failing with -EINVAL for aarch64 but not on x86. > > > > > > > > > > seems weird for the kernel to be enforcing this. is it just because of > > > > > the stated ABI ? or is there some weird requirement in the kernel itself > > > > > that requires this ? it's not like other arches have this check, and > > > > > there are def ABI requirements about stack alignments in C. > > > > > > > > The article here indicates it is an aarch64 convention: > > > > > > > > https://community.arm.com/groups/processors/blog/2015/11/19/using-the-stack-in-aarch32-and-aarch64 > > > > > > that checks my point about the ABI having alignment requirements, but > > > that doesn't mean it needs to be checked/enforced in the kernel. all > > > the limitations i see there can be seen in other arches, but we don't > > > have those arches do any stack alignment checking. so should we be > > > dropping it from aarch64 ? why does it need to be special here ? > > > > It is not just a software ABI requirement but a hardware one. If you try > > to access the stack with an unaligned SP value, you get a fault followed > > by a SIGBUS delivered to the user application. We decided to enforce > > this at the copy_thread() level, it is easier to catch such issue early > > than debugging SIGBUS delivered to a thread. > > as i said, that same behavior can be observed on other arches. i know of > at least one for sure that if the stack is unaligned, then push/pop ops > will also trigger SIGBUS. x86 tends to be more forgiving, but if it isn't > 16bytes, then it is known that SSE optimized code will often fault. > > so the question is still: why is aarch64 enforcing in the kernel what all > other arches have left alone even when they behave the same in hardware ? This was an early decision before we upstreamed the AArch64 kernel patches. Whether it was right or not it doesn't matter much now; at this point it is considered kernel-user (syscall) ABI and any change would require careful review. -- Catalin -- To unsubscribe from this list: send the line "unsubscribe linux-man" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 13+ messages in thread
[parent not found: <20160511152622.GJ3051-M2fw3Uu6cmfZROr8t4l/smS4ubULX0JqMm0uRHvK7Nw@public.gmane.org>]
* Re: aarch64 clone() man page omission [not found] ` <20160511152622.GJ3051-M2fw3Uu6cmfZROr8t4l/smS4ubULX0JqMm0uRHvK7Nw@public.gmane.org> @ 2016-05-11 16:27 ` Mike Frysinger [not found] ` <20160511162751.GN26300-UgUKS2FnFs9+urZeOPWqwQ@public.gmane.org> 0 siblings, 1 reply; 13+ messages in thread From: Mike Frysinger @ 2016-05-11 16:27 UTC (permalink / raw) To: Catalin Marinas Cc: Colin Ian King, mtk.manpages-Re5JQEeQqe8AvxtiuMwx3w, linux-man-u79uwXL29TY76Z2rM5mHXA [-- Attachment #1: Type: text/plain, Size: 3802 bytes --] On 11 May 2016 16:26, Catalin Marinas wrote: > On Wed, May 11, 2016 at 10:00:24AM -0400, Mike Frysinger wrote: > > On 11 May 2016 14:18, Catalin Marinas wrote: > > > On Tue, May 10, 2016 at 10:50:40PM -0400, Mike Frysinger wrote: > > > > On 09 May 2016 22:40, Colin Ian King wrote: > > > > > On 09/05/16 22:31, Mike Frysinger wrote: > > > > > > On 25 Apr 2016 20:42, Colin Ian King wrote: > > > > > >> currently, the aarch64 clone() system call requires the stack to be > > > > > >> aligned at a 16 byte boundary, see arch/arm64/kernel/process.c, > > > > > >> copy_thread(): > > > > > >> > > > > > >> if (stack_start) { > > > > > >> if (is_compat_thread(task_thread_info(p))) > > > > > >> childregs->compat_sp = stack_start; > > > > > >> /* 16-byte aligned stack mandatory on AArch64 */ > > > > > >> else if (stack_start & 15) > > > > > >> return -EINVAL; > > > > > >> else > > > > > >> childregs->sp = stack_start; > > > > > >> } > > > > > >> > > > > > >> > > > > > >> ..and returns -EINVAL if not aligned correctly. This should be added to > > > > > >> the manual page clone(2) as it took me a while to figure out why clone() > > > > > >> was failing with -EINVAL for aarch64 but not on x86. > > > > > > > > > > > > seems weird for the kernel to be enforcing this. is it just because of > > > > > > the stated ABI ? or is there some weird requirement in the kernel itself > > > > > > that requires this ? it's not like other arches have this check, and > > > > > > there are def ABI requirements about stack alignments in C. > > > > > > > > > > The article here indicates it is an aarch64 convention: > > > > > > > > > > https://community.arm.com/groups/processors/blog/2015/11/19/using-the-stack-in-aarch32-and-aarch64 > > > > > > > > that checks my point about the ABI having alignment requirements, but > > > > that doesn't mean it needs to be checked/enforced in the kernel. all > > > > the limitations i see there can be seen in other arches, but we don't > > > > have those arches do any stack alignment checking. so should we be > > > > dropping it from aarch64 ? why does it need to be special here ? > > > > > > It is not just a software ABI requirement but a hardware one. If you try > > > to access the stack with an unaligned SP value, you get a fault followed > > > by a SIGBUS delivered to the user application. We decided to enforce > > > this at the copy_thread() level, it is easier to catch such issue early > > > than debugging SIGBUS delivered to a thread. > > > > as i said, that same behavior can be observed on other arches. i know of > > at least one for sure that if the stack is unaligned, then push/pop ops > > will also trigger SIGBUS. x86 tends to be more forgiving, but if it isn't > > 16bytes, then it is known that SSE optimized code will often fault. > > > > so the question is still: why is aarch64 enforcing in the kernel what all > > other arches have left alone even when they behave the same in hardware ? > > This was an early decision before we upstreamed the AArch64 kernel > patches. Whether it was right or not it doesn't matter much now; the logic behind it still matters. what was it ? or was it just what you outlined above ? > at this > point it is considered kernel-user (syscall) ABI and any change would > require careful review. i don't think this classifies as ABI: we're talking about relaxing a restriction, not adding a new one. if we delete this code, all valid old binaries that worked in the past will continue to work. -mike [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 819 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
[parent not found: <20160511162751.GN26300-UgUKS2FnFs9+urZeOPWqwQ@public.gmane.org>]
* Re: aarch64 clone() man page omission [not found] ` <20160511162751.GN26300-UgUKS2FnFs9+urZeOPWqwQ@public.gmane.org> @ 2016-05-11 16:36 ` Catalin Marinas 0 siblings, 0 replies; 13+ messages in thread From: Catalin Marinas @ 2016-05-11 16:36 UTC (permalink / raw) To: Colin Ian King, mtk.manpages-Re5JQEeQqe8AvxtiuMwx3w, linux-man-u79uwXL29TY76Z2rM5mHXA On Wed, May 11, 2016 at 12:27:51PM -0400, Mike Frysinger wrote: > On 11 May 2016 16:26, Catalin Marinas wrote: > > On Wed, May 11, 2016 at 10:00:24AM -0400, Mike Frysinger wrote: > > > On 11 May 2016 14:18, Catalin Marinas wrote: > > > > On Tue, May 10, 2016 at 10:50:40PM -0400, Mike Frysinger wrote: > > > > > On 09 May 2016 22:40, Colin Ian King wrote: > > > > > > On 09/05/16 22:31, Mike Frysinger wrote: > > > > > > > On 25 Apr 2016 20:42, Colin Ian King wrote: > > > > > > >> currently, the aarch64 clone() system call requires the stack to be > > > > > > >> aligned at a 16 byte boundary, see arch/arm64/kernel/process.c, > > > > > > >> copy_thread(): > > > > > > >> > > > > > > >> if (stack_start) { > > > > > > >> if (is_compat_thread(task_thread_info(p))) > > > > > > >> childregs->compat_sp = stack_start; > > > > > > >> /* 16-byte aligned stack mandatory on AArch64 */ > > > > > > >> else if (stack_start & 15) > > > > > > >> return -EINVAL; > > > > > > >> else > > > > > > >> childregs->sp = stack_start; > > > > > > >> } > > > > > > >> > > > > > > >> > > > > > > >> ..and returns -EINVAL if not aligned correctly. This should be added to > > > > > > >> the manual page clone(2) as it took me a while to figure out why clone() > > > > > > >> was failing with -EINVAL for aarch64 but not on x86. > > > > > > > > > > > > > > seems weird for the kernel to be enforcing this. is it just because of > > > > > > > the stated ABI ? or is there some weird requirement in the kernel itself > > > > > > > that requires this ? it's not like other arches have this check, and > > > > > > > there are def ABI requirements about stack alignments in C. > > > > > > > > > > > > The article here indicates it is an aarch64 convention: > > > > > > > > > > > > https://community.arm.com/groups/processors/blog/2015/11/19/using-the-stack-in-aarch32-and-aarch64 > > > > > > > > > > that checks my point about the ABI having alignment requirements, but > > > > > that doesn't mean it needs to be checked/enforced in the kernel. all > > > > > the limitations i see there can be seen in other arches, but we don't > > > > > have those arches do any stack alignment checking. so should we be > > > > > dropping it from aarch64 ? why does it need to be special here ? > > > > > > > > It is not just a software ABI requirement but a hardware one. If you try > > > > to access the stack with an unaligned SP value, you get a fault followed > > > > by a SIGBUS delivered to the user application. We decided to enforce > > > > this at the copy_thread() level, it is easier to catch such issue early > > > > than debugging SIGBUS delivered to a thread. > > > > > > as i said, that same behavior can be observed on other arches. i know of > > > at least one for sure that if the stack is unaligned, then push/pop ops > > > will also trigger SIGBUS. x86 tends to be more forgiving, but if it isn't > > > 16bytes, then it is known that SSE optimized code will often fault. > > > > > > so the question is still: why is aarch64 enforcing in the kernel what all > > > other arches have left alone even when they behave the same in hardware ? > > > > This was an early decision before we upstreamed the AArch64 kernel > > patches. Whether it was right or not it doesn't matter much now; > > the logic behind it still matters. what was it ? or was it just what > you outlined above ? I don't think there was much thought in that decisions ;). It's possible that we wanted it to match the sys_rt_sigreturn() check on SP alignment (though this one forces a SIGSEGV on a bad frame since this syscall can never return). > > at this point it is considered kernel-user (syscall) ABI and any > > change would require careful review. > > i don't think this classifies as ABI: we're talking about relaxing a > restriction, not adding a new one. if we delete this code, all valid > old binaries that worked in the past will continue to work. That's my assumption as well, I wouldn't expect any app to have relied on -EINVAL for this special case. That's why I suggested to Colin that he posted a patch on linux-arm-kernel and take it from there. -- Catalin -- To unsubscribe from this list: send the line "unsubscribe linux-man" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2016-05-11 16:36 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-04-25 19:42 aarch64 clone() man page omission Colin Ian King
[not found] ` <571E731A.6050809-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org>
2016-05-09 21:01 ` Michael Kerrisk (man-pages)
2016-05-09 21:31 ` Mike Frysinger
[not found] ` <20160509213140.GD26300-UgUKS2FnFs9+urZeOPWqwQ@public.gmane.org>
2016-05-09 21:40 ` Colin Ian King
[not found] ` <573103C8.9050008-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org>
2016-05-11 2:50 ` Mike Frysinger
[not found] ` <20160511025040.GL26300-UgUKS2FnFs9+urZeOPWqwQ@public.gmane.org>
2016-05-11 13:18 ` Catalin Marinas
[not found] ` <20160511131855.GG3051-M2fw3Uu6cmfZROr8t4l/smS4ubULX0JqMm0uRHvK7Nw@public.gmane.org>
2016-05-11 13:33 ` Colin Ian King
[not found] ` <5733348D.7010301-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org>
2016-05-11 15:22 ` Catalin Marinas
[not found] ` <20160511152249.GI3051-M2fw3Uu6cmfZROr8t4l/smS4ubULX0JqMm0uRHvK7Nw@public.gmane.org>
2016-05-11 15:25 ` Colin Ian King
2016-05-11 14:00 ` Mike Frysinger
[not found] ` <20160511140024.GM26300-UgUKS2FnFs9+urZeOPWqwQ@public.gmane.org>
2016-05-11 15:26 ` Catalin Marinas
[not found] ` <20160511152622.GJ3051-M2fw3Uu6cmfZROr8t4l/smS4ubULX0JqMm0uRHvK7Nw@public.gmane.org>
2016-05-11 16:27 ` Mike Frysinger
[not found] ` <20160511162751.GN26300-UgUKS2FnFs9+urZeOPWqwQ@public.gmane.org>
2016-05-11 16:36 ` Catalin Marinas
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox