[PATCH] winecrt0: Do not expect jmp_buf to be aligned in __wine_longjmp on x86_64.

Chip Davis cdavis at codeweavers.com
Mon Jul 13 15:08:57 CDT 2020


July 13, 2020 2:43 PM, "Paul Gofman" <pgofman at codeweavers.com> wrote:

> There is no guarantee that jmp_buf is 16 bytes aligned.
> 
> Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
> ---
> dlls/winecrt0/exception.c | 40 +++++++++++++++++++--------------------
> 1 file changed, 20 insertions(+), 20 deletions(-)
> 
> diff --git a/dlls/winecrt0/exception.c b/dlls/winecrt0/exception.c
> index 137ee2d6ee3..d3ce8d1aebb 100644
> --- a/dlls/winecrt0/exception.c
> +++ b/dlls/winecrt0/exception.c
> @@ -80,16 +80,16 @@ __ASM_GLOBAL_FUNC( __wine_setjmpex,
>                     "movq %r15,0x48(%rcx)\n\t"      /* jmp_buf->R15 */
>                     "movq (%rsp),%rax\n\t"
>                     "movq %rax,0x50(%rcx)\n\t"      /* jmp_buf->Rip */
> -                   "movdqa %xmm6,0x60(%rcx)\n\t"   /* jmp_buf->Xmm6 */
> -                   "movdqa %xmm7,0x70(%rcx)\n\t"   /* jmp_buf->Xmm7 */
> -                   "movdqa %xmm8,0x80(%rcx)\n\t"   /* jmp_buf->Xmm8 */
> -                   "movdqa %xmm9,0x90(%rcx)\n\t"   /* jmp_buf->Xmm9 */
> -                   "movdqa %xmm10,0xa0(%rcx)\n\t"  /* jmp_buf->Xmm10 */
> -                   "movdqa %xmm11,0xb0(%rcx)\n\t"  /* jmp_buf->Xmm11 */
> -                   "movdqa %xmm12,0xc0(%rcx)\n\t"  /* jmp_buf->Xmm12 */
> -                   "movdqa %xmm13,0xd0(%rcx)\n\t"  /* jmp_buf->Xmm13 */
> -                   "movdqa %xmm14,0xe0(%rcx)\n\t"  /* jmp_buf->Xmm14 */
> -                   "movdqa %xmm15,0xf0(%rcx)\n\t"  /* jmp_buf->Xmm15 */
> +                   "movq %xmm6,0x60(%rcx)\n\t"   /* jmp_buf->Xmm6 */
> +                   "movq %xmm7,0x70(%rcx)\n\t"   /* jmp_buf->Xmm7 */
> +                   "movq %xmm8,0x80(%rcx)\n\t"   /* jmp_buf->Xmm8 */
> +                   "movq %xmm9,0x90(%rcx)\n\t"   /* jmp_buf->Xmm9 */
> +                   "movq %xmm10,0xa0(%rcx)\n\t"  /* jmp_buf->Xmm10 */
> +                   "movq %xmm11,0xb0(%rcx)\n\t"  /* jmp_buf->Xmm11 */
> +                   "movq %xmm12,0xc0(%rcx)\n\t"  /* jmp_buf->Xmm12 */
> +                   "movq %xmm13,0xd0(%rcx)\n\t"  /* jmp_buf->Xmm13 */
> +                   "movq %xmm14,0xe0(%rcx)\n\t"  /* jmp_buf->Xmm14 */
> +                   "movq %xmm15,0xf0(%rcx)\n\t"  /* jmp_buf->Xmm15 */

Won't this only save the lower 8 bytes?

> @@ -103,16 +103,16 @@ __ASM_GLOBAL_FUNC( __wine_longjmp,
>                     "movq 0x38(%rcx),%r13\n\t"      /* jmp_buf->R13 */
>                     "movq 0x40(%rcx),%r14\n\t"      /* jmp_buf->R14 */
>                     "movq 0x48(%rcx),%r15\n\t"      /* jmp_buf->R15 */
> -                   "movdqa 0x60(%rcx),%xmm6\n\t"   /* jmp_buf->Xmm6 */
> -                   "movdqa 0x70(%rcx),%xmm7\n\t"   /* jmp_buf->Xmm7 */
> -                   "movdqa 0x80(%rcx),%xmm8\n\t"   /* jmp_buf->Xmm8 */
> -                   "movdqa 0x90(%rcx),%xmm9\n\t"   /* jmp_buf->Xmm9 */
> -                   "movdqa 0xa0(%rcx),%xmm10\n\t"  /* jmp_buf->Xmm10 */
> -                   "movdqa 0xb0(%rcx),%xmm11\n\t"  /* jmp_buf->Xmm11 */
> -                   "movdqa 0xc0(%rcx),%xmm12\n\t"  /* jmp_buf->Xmm12 */
> -                   "movdqa 0xd0(%rcx),%xmm13\n\t"  /* jmp_buf->Xmm13 */
> -                   "movdqa 0xe0(%rcx),%xmm14\n\t"  /* jmp_buf->Xmm14 */
> -                   "movdqa 0xf0(%rcx),%xmm15\n\t"  /* jmp_buf->Xmm15 */
> +                   "movq 0x60(%rcx),%xmm6\n\t"   /* jmp_buf->Xmm6 */
> +                   "movq 0x70(%rcx),%xmm7\n\t"   /* jmp_buf->Xmm7 */
> +                   "movq 0x80(%rcx),%xmm8\n\t"   /* jmp_buf->Xmm8 */
> +                   "movq 0x90(%rcx),%xmm9\n\t"   /* jmp_buf->Xmm9 */
> +                   "movq 0xa0(%rcx),%xmm10\n\t"  /* jmp_buf->Xmm10 */
> +                   "movq 0xb0(%rcx),%xmm11\n\t"  /* jmp_buf->Xmm11 */
> +                   "movq 0xc0(%rcx),%xmm12\n\t"  /* jmp_buf->Xmm12 */
> +                   "movq 0xd0(%rcx),%xmm13\n\t"  /* jmp_buf->Xmm13 */
> +                   "movq 0xe0(%rcx),%xmm14\n\t"  /* jmp_buf->Xmm14 */
> +                   "movq 0xf0(%rcx),%xmm15\n\t"  /* jmp_buf->Xmm15 */

And this only restores the lower 8 bytes.

Chip



More information about the wine-devel mailing list