aeaaf005da
Several of the x86 selftests end up with executable stacks because the asm was missing the annotation that says that they are modern and don't need executable stacks. Add the annotations. Signed-off-by: Andy Lutomirski <luto@kernel.org> Signed-off-by: Borislav Petkov <bp@suse.de> Link: https://lkml.kernel.org/r/6f043c03e9e0e4557e1e975a63b07a4d18965a68.1604346596.git.luto@kernel.org
62 lines
916 B
ArmAsm
62 lines
916 B
ArmAsm
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* thunks.S - assembly helpers for mixed-bitness code
|
|
* Copyright (c) 2015 Andrew Lutomirski
|
|
*
|
|
* These are little helpers that make it easier to switch bitness on
|
|
* the fly.
|
|
*/
|
|
|
|
.text
|
|
|
|
.global call32_from_64
|
|
.type call32_from_64, @function
|
|
call32_from_64:
|
|
// rdi: stack to use
|
|
// esi: function to call
|
|
|
|
// Save registers
|
|
pushq %rbx
|
|
pushq %rbp
|
|
pushq %r12
|
|
pushq %r13
|
|
pushq %r14
|
|
pushq %r15
|
|
pushfq
|
|
|
|
// Switch stacks
|
|
mov %rsp,(%rdi)
|
|
mov %rdi,%rsp
|
|
|
|
// Switch to compatibility mode
|
|
pushq $0x23 /* USER32_CS */
|
|
pushq $1f
|
|
lretq
|
|
|
|
1:
|
|
.code32
|
|
// Call the function
|
|
call *%esi
|
|
// Switch back to long mode
|
|
jmp $0x33,$1f
|
|
.code64
|
|
|
|
1:
|
|
// Restore the stack
|
|
mov (%rsp),%rsp
|
|
|
|
// Restore registers
|
|
popfq
|
|
popq %r15
|
|
popq %r14
|
|
popq %r13
|
|
popq %r12
|
|
popq %rbp
|
|
popq %rbx
|
|
|
|
ret
|
|
|
|
.size call32_from_64, .-call32_from_64
|
|
|
|
.section .note.GNU-stack,"",%progbits
|