3497c0bec9
[ Upstream commit b961ec10b9f9719987470236feb50c967db5a652 ] The return-address (RA) register r14 is specified as volatile in the s390x ELF ABI [1]. Nevertheless proper CFI directives must be provided for an unwinder to restore the return address, if the RA register value is changed from its value at function entry, as it is the case. [1]: s390x ELF ABI, https://github.com/IBM/s390x-abi/releases Fixes: 4bff8cb54502 ("s390: convert to GENERIC_VDSO") Signed-off-by: Jens Remus <jremus@linux.ibm.com> Acked-by: Heiko Carstens <hca@linux.ibm.com> Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
40 lines
1.1 KiB
ArmAsm
Executable file
40 lines
1.1 KiB
ArmAsm
Executable file
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#include <asm/vdso.h>
|
|
#include <asm/unistd.h>
|
|
#include <asm/asm-offsets.h>
|
|
#include <asm/dwarf.h>
|
|
#include <asm/ptrace.h>
|
|
|
|
#define WRAPPER_FRAME_SIZE (STACK_FRAME_OVERHEAD+8)
|
|
|
|
/*
|
|
* Older glibc version called vdso without allocating a stackframe. This wrapper
|
|
* is just used to allocate a stackframe. See
|
|
* https://sourceware.org/git/?p=glibc.git;a=commit;h=478593e6374f3818da39332260dc453cb19cfa1e
|
|
* for details.
|
|
*/
|
|
.macro vdso_func func
|
|
.globl __kernel_\func
|
|
.type __kernel_\func,@function
|
|
.align 8
|
|
__kernel_\func:
|
|
CFI_STARTPROC
|
|
aghi %r15,-WRAPPER_FRAME_SIZE
|
|
CFI_DEF_CFA_OFFSET (STACK_FRAME_OVERHEAD + WRAPPER_FRAME_SIZE)
|
|
CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD
|
|
stg %r14,STACK_FRAME_OVERHEAD(%r15)
|
|
CFI_REL_OFFSET 14, STACK_FRAME_OVERHEAD
|
|
brasl %r14,__s390_vdso_\func
|
|
lg %r14,STACK_FRAME_OVERHEAD(%r15)
|
|
CFI_RESTORE 14
|
|
aghi %r15,WRAPPER_FRAME_SIZE
|
|
CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD
|
|
CFI_RESTORE 15
|
|
br %r14
|
|
CFI_ENDPROC
|
|
.size __kernel_\func,.-__kernel_\func
|
|
.endm
|
|
|
|
vdso_func gettimeofday
|
|
vdso_func clock_getres
|
|
vdso_func clock_gettime
|