mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
6392b4ebdc
arch/x86/tests/regs_load.S is missing the linker note about the stack
requirements, therefore making the linker fall back to an executable
stack. As this object gets linked against the final perf binary, it'll
needlessly end up with an executable stack. Fix this by adding the
appropriate linker note.
Also add a global linker flag to prevent future regressions, as
suggested by Jiri. This way perf won't get an executable stack even if
we fail to add the .GNU-stack linker note to future assembler files.
Though, doing so might create regressions the other way around, when
(statically) linking against libraries needing an executable stack.
But, apparently, regressing in that direction is wanted as it is an
indicator of poor code quality -- or just missing linker notes.
Fixes: 3c8b06f981
("perf tests x86: Introduce perf_regs_load function")
Signed-off-by: Mathias Krause <minipli@googlemail.com>
Acked-by: Ingo Molnar <mingo@kernel.org>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1398617466-22749-1-git-send-email-minipli@googlemail.com
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
99 lines
1.8 KiB
ArmAsm
99 lines
1.8 KiB
ArmAsm
#include <linux/linkage.h>
|
|
|
|
#define AX 0
|
|
#define BX 1 * 8
|
|
#define CX 2 * 8
|
|
#define DX 3 * 8
|
|
#define SI 4 * 8
|
|
#define DI 5 * 8
|
|
#define BP 6 * 8
|
|
#define SP 7 * 8
|
|
#define IP 8 * 8
|
|
#define FLAGS 9 * 8
|
|
#define CS 10 * 8
|
|
#define SS 11 * 8
|
|
#define DS 12 * 8
|
|
#define ES 13 * 8
|
|
#define FS 14 * 8
|
|
#define GS 15 * 8
|
|
#define R8 16 * 8
|
|
#define R9 17 * 8
|
|
#define R10 18 * 8
|
|
#define R11 19 * 8
|
|
#define R12 20 * 8
|
|
#define R13 21 * 8
|
|
#define R14 22 * 8
|
|
#define R15 23 * 8
|
|
|
|
.text
|
|
#ifdef HAVE_ARCH_X86_64_SUPPORT
|
|
ENTRY(perf_regs_load)
|
|
movq %rax, AX(%rdi)
|
|
movq %rbx, BX(%rdi)
|
|
movq %rcx, CX(%rdi)
|
|
movq %rdx, DX(%rdi)
|
|
movq %rsi, SI(%rdi)
|
|
movq %rdi, DI(%rdi)
|
|
movq %rbp, BP(%rdi)
|
|
|
|
leaq 8(%rsp), %rax /* exclude this call. */
|
|
movq %rax, SP(%rdi)
|
|
|
|
movq 0(%rsp), %rax
|
|
movq %rax, IP(%rdi)
|
|
|
|
movq $0, FLAGS(%rdi)
|
|
movq $0, CS(%rdi)
|
|
movq $0, SS(%rdi)
|
|
movq $0, DS(%rdi)
|
|
movq $0, ES(%rdi)
|
|
movq $0, FS(%rdi)
|
|
movq $0, GS(%rdi)
|
|
|
|
movq %r8, R8(%rdi)
|
|
movq %r9, R9(%rdi)
|
|
movq %r10, R10(%rdi)
|
|
movq %r11, R11(%rdi)
|
|
movq %r12, R12(%rdi)
|
|
movq %r13, R13(%rdi)
|
|
movq %r14, R14(%rdi)
|
|
movq %r15, R15(%rdi)
|
|
ret
|
|
ENDPROC(perf_regs_load)
|
|
#else
|
|
ENTRY(perf_regs_load)
|
|
push %edi
|
|
movl 8(%esp), %edi
|
|
movl %eax, AX(%edi)
|
|
movl %ebx, BX(%edi)
|
|
movl %ecx, CX(%edi)
|
|
movl %edx, DX(%edi)
|
|
movl %esi, SI(%edi)
|
|
pop %eax
|
|
movl %eax, DI(%edi)
|
|
movl %ebp, BP(%edi)
|
|
|
|
leal 4(%esp), %eax /* exclude this call. */
|
|
movl %eax, SP(%edi)
|
|
|
|
movl 0(%esp), %eax
|
|
movl %eax, IP(%edi)
|
|
|
|
movl $0, FLAGS(%edi)
|
|
movl $0, CS(%edi)
|
|
movl $0, SS(%edi)
|
|
movl $0, DS(%edi)
|
|
movl $0, ES(%edi)
|
|
movl $0, FS(%edi)
|
|
movl $0, GS(%edi)
|
|
ret
|
|
ENDPROC(perf_regs_load)
|
|
#endif
|
|
|
|
/*
|
|
* We need to provide note.GNU-stack section, saying that we want
|
|
* NOT executable stack. Otherwise the final linking will assume that
|
|
* the ELF stack should not be restricted at all and set it RWX.
|
|
*/
|
|
.section .note.GNU-stack,"",@progbits
|