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 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel