qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] linux-user/flatload: fix initial stack pointer


From: Laurent Vivier
Subject: Re: [Qemu-devel] [PATCH] linux-user/flatload: fix initial stack pointer alignment
Date: Wed, 24 Oct 2018 12:35:42 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.7.0

On 24/10/2018 03:38, Max Filippov wrote:
> Stack pointer alignment code incorrectly adds stack_size to sp instead
> of subtracting it. It also does not take flat_argvp_envp_on_stack() into
> account when calculating stack_size. This results in initial stack
> pointer misalignment with certain set of command line arguments and
> environment variables and correct alignment for the same binary with a
> different set of arguments. This misalignment causes failures in the
> following tests in the testsuite of gcc built for xtensa uclinux:
> 
>   gcc.dg/torture/vshuf-v64qi.c
>   gcc.dg/torture/vshuf-v8sf.c
>   gcc.dg/torture/vshuf-v8si.c
> 
> Signed-off-by: Max Filippov <address@hidden>
> ---
>  linux-user/flatload.c | 8 +++++---
>  1 file changed, 5 insertions(+), 3 deletions(-)
> 
> diff --git a/linux-user/flatload.c b/linux-user/flatload.c
> index 2eefe55e5000..1893966b5b30 100644
> --- a/linux-user/flatload.c
> +++ b/linux-user/flatload.c
> @@ -771,10 +771,12 @@ int load_flt_binary(struct linux_binprm *bprm, struct 
> image_info *info)
>      /* Enforce final stack alignment of 16 bytes.  This is sufficient
>         for all current targets, and excess alignment is harmless.  */
>      stack_len = bprm->envc + bprm->argc + 2;
> -    stack_len += 3;  /* argc, arvg, argp */
> +    stack_len += flat_argvp_envp_on_stack() ? 2 : 0; /* arvg, argp */
> +    stack_len += 1; /* argc */>      stack_len *= sizeof(abi_ulong);
> -    if ((sp + stack_len) & 15)
> -        sp -= 16 - ((sp + stack_len) & 15);
> +    if ((sp - stack_len) & 15) {
> +        sp -= ((sp - stack_len) & 15);
> +    }

If I understand correctly the purpose, I think it could be clearer like:

    sp = (sp - stack_len) & ~15;

Thanks,
Laurent



reply via email to

[Prev in Thread] Current Thread [Next in Thread]