diff options
author | Peter <peter.bindels@tomtom.com> | 2021-10-30 23:26:52 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-10-31 00:21:31 +0200 |
commit | 24fdf99d8b7850be6635654347bb9c2949eefd1b (patch) | |
tree | b2788fc05ec36212e173265c8ecb4886c51cd12c /Userland/Libraries/LibELF | |
parent | 80aa1b93d19484cc9d705f9fb5eecb31eff61b89 (diff) | |
download | serenity-24fdf99d8b7850be6635654347bb9c2949eefd1b.zip |
LibELF: Store SSE registers in x86_64 PLT Trampoline
Save and restore XMM registers so userspace programs don't
randomly lose values from calls. This fixes a crash in ScummVM.
Diffstat (limited to 'Userland/Libraries/LibELF')
-rw-r--r-- | Userland/Libraries/LibELF/Arch/x86_64/plt_trampoline.S | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/Userland/Libraries/LibELF/Arch/x86_64/plt_trampoline.S b/Userland/Libraries/LibELF/Arch/x86_64/plt_trampoline.S index 311bc8fc43..3b210d2714 100644 --- a/Userland/Libraries/LibELF/Arch/x86_64/plt_trampoline.S +++ b/Userland/Libraries/LibELF/Arch/x86_64/plt_trampoline.S @@ -10,6 +10,15 @@ .type _plt_trampoline,@function _plt_trampoline: # (object, relocation_index) # save flags/registers (https://stackoverflow.com/questions/18024672/what-registers-are-preserved-through-a-linux-x86-64-function-call) + subq $128, %rsp + movdqu %xmm0, 0x0(%rsp) + movdqu %xmm1, 0x10(%rsp) + movdqu %xmm2, 0x20(%rsp) + movdqu %xmm3, 0x30(%rsp) + movdqu %xmm4, 0x40(%rsp) + movdqu %xmm5, 0x50(%rsp) + movdqu %xmm6, 0x60(%rsp) + movdqu %xmm7, 0x70(%rsp) pushfq pushq %rax pushq %rcx @@ -21,8 +30,8 @@ _plt_trampoline: # (object, relocation_index) pushq %r10 pushq %r11 - movq 80(%rsp), %rdi # object - movq 88(%rsp), %rsi # relocation_index + movq 208(%rsp), %rdi # object + movq 216(%rsp), %rsi # relocation_index # offset = index * sizeof(Elf64_Rela) shlq $3, %rsi @@ -35,7 +44,7 @@ _plt_trampoline: # (object, relocation_index) movq %rbp, %rsp popq %rbp - movq %rax, 88(%rsp) # replace object argument with symbol address + movq %rax, 216(%rsp) # replace object argument with symbol address # restore flags/registers popq %r11 @@ -49,6 +58,15 @@ _plt_trampoline: # (object, relocation_index) popq %rax popfq + movdqu 0x0(%rsp), %xmm0 + movdqu 0x10(%rsp), %xmm1 + movdqu 0x20(%rsp), %xmm2 + movdqu 0x30(%rsp), %xmm3 + movdqu 0x40(%rsp), %xmm4 + movdqu 0x50(%rsp), %xmm5 + movdqu 0x60(%rsp), %xmm6 + movdqu 0x70(%rsp), %xmm7 + addq $128, %rsp addq $8, %rsp # remove relocation_index argument retq |