[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