• YiFei Zhu's avatar
    um: Fix stack pointer alignment · 558f9b2f
    YiFei Zhu authored
    GCC assumes that stack is aligned to 16-byte on call sites [1].
    Since GCC 8, GCC began using 16-byte aligned SSE instructions to
    implement assignments to structs on stack. When
    CC_OPTIMIZE_FOR_PERFORMANCE is enabled, this affects
    os-Linux/sigio.c, write_sigio_thread:
    
      struct pollfds *fds, tmp;
      tmp = current_poll;
    
    Note that struct pollfds is exactly 16 bytes in size.
    GCC 8+ generates assembly similar to:
    
      movdqa (%rdi),%xmm0
      movaps %xmm0,-0x50(%rbp)
    
    This is an issue, because movaps will #GP if -0x50(%rbp) is not
    aligned to 16 bytes [2], and how rbp gets assigned to is via glibc
    clone thread_start, then function prologue, going though execution
    trace similar to (showing only relevant instructions):
    
      sub    $0x10,%rsi
      mov    %rcx,0x8(%rsi)
      mov    %rdi,(%rsi)
      syscall
      pop    %rax
      pop    %rdi
      callq  *%rax
      push   %rbp
      mov    %rsp,%rbp
    
    The stack pointer always points to the topmost element on stack,
    rather then the space right above the topmost. On push...
    558f9b2f
process.c 17.5 KB