From c7d9df6350b610bb1fbed77e337f0beda0e823e0 Mon Sep 17 00:00:00 2001 From: Christian Prochaska Date: Mon, 15 Apr 2019 14:15:52 +0200 Subject: [PATCH] lx_kit: update 'arch_execute()' functions based on libc This ensures proper stack alignment for FPU instructions on x86_64. Fixes #3356 --- .../spec/arm/lx_kit/internal/arch_execute.h | 1 + .../spec/x86_32/lx_kit/internal/arch_execute.h | 1 + .../spec/x86_64/lx_kit/internal/arch_execute.h | 14 +++++++++----- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/repos/dde_linux/src/include/spec/arm/lx_kit/internal/arch_execute.h b/repos/dde_linux/src/include/spec/arm/lx_kit/internal/arch_execute.h index 45d22167cc..d4e86e4af5 100644 --- a/repos/dde_linux/src/include/spec/arm/lx_kit/internal/arch_execute.h +++ b/repos/dde_linux/src/include/spec/arm/lx_kit/internal/arch_execute.h @@ -34,6 +34,7 @@ void arch_execute(void *sp, void *func, void *arg) { asm volatile ("mov r0, %2;" /* set arg */ "mov sp, %0;" /* set stack */ + "mov fp, #0;" /* clear frame pointer */ "mov pc, %1;" /* call func */ "" : : "r"(sp), "r"(func), "r"(arg) : "r0"); diff --git a/repos/dde_linux/src/include/spec/x86_32/lx_kit/internal/arch_execute.h b/repos/dde_linux/src/include/spec/x86_32/lx_kit/internal/arch_execute.h index 09cbd72130..176572a18a 100644 --- a/repos/dde_linux/src/include/spec/x86_32/lx_kit/internal/arch_execute.h +++ b/repos/dde_linux/src/include/spec/x86_32/lx_kit/internal/arch_execute.h @@ -35,6 +35,7 @@ void arch_execute(void *sp, void *func, void *arg) asm volatile ("movl %2, 0(%0);" "movl %1, -0x4(%0);" "movl %0, %%esp;" + "xorl %%ebp, %%ebp;" /* clear frame pointer */ "call *-4(%%esp);" : : "r" (sp), "r" (func), "r" (arg)); } diff --git a/repos/dde_linux/src/include/spec/x86_64/lx_kit/internal/arch_execute.h b/repos/dde_linux/src/include/spec/x86_64/lx_kit/internal/arch_execute.h index 0367439a41..18f2116fb6 100644 --- a/repos/dde_linux/src/include/spec/x86_64/lx_kit/internal/arch_execute.h +++ b/repos/dde_linux/src/include/spec/x86_64/lx_kit/internal/arch_execute.h @@ -33,11 +33,15 @@ extern "C" { static inline void arch_execute(void *sp, void *func, void *arg) { - asm volatile ("movq %2, %%rdi;" - "movq %1, 0(%0);" - "movq %0, %%rsp;" - "call *0(%%rsp);" - : "+r" (sp), "+r" (func), "+r" (arg) : : "memory"); + asm volatile ("movq %0, %%rsp;" /* load stack pointer */ + "movq %%rsp, %%rbp;" /* caller stack frame (for GDB debugging) */ + "movq %0, -8(%%rbp);" + "movq %1, -16(%%rbp);" + "movq %2, -24(%%rbp);" + "sub $24, %%rsp;" /* adjust to next stack frame */ + "movq %2, %%rdi;" /* 1st argument */ + "call *-16(%%rbp);" /* call func */ + : : "r" (sp), "r" (func), "r" (arg)); } #endif /* _ARCH_EXECUTE_H_ */