[PATCH 1/1] x86_64: Fix stack aligment for x86-64 SysV ABI

Matheus Pecoraro matpecor at gmail.com
Sat Mar 23 02:24:03 UTC 2024


Makes the code in bsp/x86_64/amd64/start/start.S and the stack frame
setup by _CPU_Context_Initialize align the stack properly according to
what is expected by the x86-64 SysV ABI
---
 bsps/x86_64/amd64/clock/eficlock.c            | 28 ++-----------------
 bsps/x86_64/amd64/start/start.S               |  1 -
 .../cpu/x86_64/x86_64-context-initialize.c    |  4 +--
 3 files changed, 5 insertions(+), 28 deletions(-)

diff --git a/bsps/x86_64/amd64/clock/eficlock.c
b/bsps/x86_64/amd64/clock/eficlock.c
index f5ff9278f6..aece19aa35 100644
--- a/bsps/x86_64/amd64/clock/eficlock.c
+++ b/bsps/x86_64/amd64/clock/eficlock.c
@@ -41,35 +41,13 @@ Clock_isr( void* );
 #error "EFIAPI not defined!"
 #endif

-
-/* no-sse attribute helps with enforcing GCC to generate code which
does not use
-   SSE instructions requiring 16 byte alligned access on unaligned data hence
-   producing perfect GP fault. The code with SSE enabled looks:
-
-EFIAPI void
-efi_clock_tick_notify(EFI_EVENT e, VOID* ctx)
-{
-  10b2ba:       55                      push   rbp
-  10b2bb:       48 89 e5                mov    rbp,rsp
-  10b2be:       57                      push   rdi
-  10b2bf:       56                      push   rsi
-  10b2c0:       48 81 ec a0 00 00 00    sub    rsp,0xa0
-  10b2c7:       8b 02                   mov    eax,DWORD PTR [rdx]
-->10b2c9:       0f 29 b5 50 ff ff ff    movaps XMMWORD PTR [rbp-0xb0],xmm6
-  10b2d0:       0f 29 bd 60 ff ff ff    movaps XMMWORD PTR [rbp-0xa0],xmm7
-  10b2d7:       83 c0 01                add    eax,0x1
-
-and we get GP @ 10b2c9.
-
-CAVEAT: This function is to be called from the UEFI which means it
needs to callable
-by using MS ABI!
-
+/*
+ * CAVEAT: This function is to be called from the UEFI which means it
+ * needs to be callable by using MS ABI!
  */
-__attribute__((target("no-sse")))
 EFIAPI void
 efi_clock_tick_notify(EFI_EVENT e, VOID* ctx);

-__attribute__((target("no-sse")))
 EFIAPI void
 efi_clock_tick_notify(EFI_EVENT e, VOID* ctx)
 {
diff --git a/bsps/x86_64/amd64/start/start.S b/bsps/x86_64/amd64/start/start.S
index b8120473be..f1f2f059b9 100644
--- a/bsps/x86_64/amd64/start/start.S
+++ b/bsps/x86_64/amd64/start/start.S
@@ -40,7 +40,6 @@
 _start:
  .cfi_startproc
  movabsq $_ISR_Stack_area_end, %rsp
- subq $8, %rsp
  .cfi_def_cfa_offset 16
  xorl %edi, %edi
 #ifdef BSP_MULTIBOOT_SUPPORT
diff --git a/cpukit/score/cpu/x86_64/x86_64-context-initialize.c
b/cpukit/score/cpu/x86_64/x86_64-context-initialize.c
index ee25fcfa2d..0df7cff1bc 100644
--- a/cpukit/score/cpu/x86_64/x86_64-context-initialize.c
+++ b/cpukit/score/cpu/x86_64/x86_64-context-initialize.c
@@ -87,8 +87,8 @@ void _CPU_Context_Initialize(

   _stack  = ((uintptr_t) stack_area_begin) + stack_area_size;
   _stack &= ~(CPU_STACK_ALIGNMENT - 1);
-  _stack -= sizeof(uintptr_t); /* fake return address for entry_point's frame;
-                                * this allows rsp+8 to be an aligned
boundary */
+  _stack -= CPU_STACK_ALIGNMENT; /* fake return address for
entry_point's frame;
+                                  * this allows rsp+8 to be an
aligned boundary */
   *((void (**)(void)) _stack) = entry_point;

   the_context->rbp     = (void *) 0;
-- 
2.43.0


More information about the devel mailing list