linux/tools/testing/selftests/x86/thunks.S
Andy Lutomirski aeaaf005da selftests/x86: Add missing .note.GNU-stack sections
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
2020-11-24 13:55:39 +01:00

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