xref: /linux/arch/s390/kernel/vdso/vdso_user_wrapper.S (revision 24f171c7e145f43b9f187578e89b0982ce87e54c)
1*c0087d80SHeiko Carstens/* SPDX-License-Identifier: GPL-2.0 */
2*c0087d80SHeiko Carstens#include <linux/linkage.h>
3*c0087d80SHeiko Carstens#include <asm/vdso.h>
4*c0087d80SHeiko Carstens#include <asm/unistd.h>
5*c0087d80SHeiko Carstens#include <asm/asm-offsets.h>
6*c0087d80SHeiko Carstens#include <asm/dwarf.h>
7*c0087d80SHeiko Carstens#include <asm/ptrace.h>
8*c0087d80SHeiko Carstens
9*c0087d80SHeiko Carstens/*
10*c0087d80SHeiko Carstens * Older glibc version called vdso without allocating a stackframe. This wrapper
11*c0087d80SHeiko Carstens * is just used to allocate a stackframe. See
12*c0087d80SHeiko Carstens * https://sourceware.org/git/?p=glibc.git;a=commit;h=478593e6374f3818da39332260dc453cb19cfa1e
13*c0087d80SHeiko Carstens * for details.
14*c0087d80SHeiko Carstens */
15*c0087d80SHeiko Carstens.macro vdso_func func
16*c0087d80SHeiko CarstensSYM_FUNC_START(__kernel_\func)
17*c0087d80SHeiko Carstens	CFI_STARTPROC
18*c0087d80SHeiko Carstens	aghi	%r15,-STACK_FRAME_VDSO_OVERHEAD
19*c0087d80SHeiko Carstens	CFI_DEF_CFA_OFFSET (STACK_FRAME_USER_OVERHEAD + STACK_FRAME_VDSO_OVERHEAD)
20*c0087d80SHeiko Carstens	CFI_VAL_OFFSET 15,-STACK_FRAME_USER_OVERHEAD
21*c0087d80SHeiko Carstens	stg	%r14,__SFVDSO_RETURN_ADDRESS(%r15)
22*c0087d80SHeiko Carstens	CFI_REL_OFFSET 14,__SFVDSO_RETURN_ADDRESS
23*c0087d80SHeiko Carstens	xc	__SFUSER_BACKCHAIN(8,%r15),__SFUSER_BACKCHAIN(%r15)
24*c0087d80SHeiko Carstens	brasl	%r14,__s390_vdso_\func
25*c0087d80SHeiko Carstens	lg	%r14,__SFVDSO_RETURN_ADDRESS(%r15)
26*c0087d80SHeiko Carstens	CFI_RESTORE 14
27*c0087d80SHeiko Carstens	aghi	%r15,STACK_FRAME_VDSO_OVERHEAD
28*c0087d80SHeiko Carstens	CFI_DEF_CFA_OFFSET STACK_FRAME_USER_OVERHEAD
29*c0087d80SHeiko Carstens	CFI_RESTORE 15
30*c0087d80SHeiko Carstens	br	%r14
31*c0087d80SHeiko Carstens	CFI_ENDPROC
32*c0087d80SHeiko CarstensSYM_FUNC_END(__kernel_\func)
33*c0087d80SHeiko Carstens.endm
34*c0087d80SHeiko Carstens
35*c0087d80SHeiko Carstensvdso_func gettimeofday
36*c0087d80SHeiko Carstensvdso_func clock_getres
37*c0087d80SHeiko Carstensvdso_func clock_gettime
38*c0087d80SHeiko Carstensvdso_func getcpu
39*c0087d80SHeiko Carstens
40*c0087d80SHeiko Carstens.macro vdso_syscall func,syscall
41*c0087d80SHeiko CarstensSYM_FUNC_START(__kernel_\func)
42*c0087d80SHeiko Carstens	CFI_STARTPROC
43*c0087d80SHeiko Carstens	svc	\syscall
44*c0087d80SHeiko Carstens	/* Make sure we notice when a syscall returns, which shouldn't happen */
45*c0087d80SHeiko Carstens	.word	0
46*c0087d80SHeiko Carstens	CFI_ENDPROC
47*c0087d80SHeiko CarstensSYM_FUNC_END(__kernel_\func)
48*c0087d80SHeiko Carstens.endm
49*c0087d80SHeiko Carstens
50*c0087d80SHeiko Carstensvdso_syscall restart_syscall,__NR_restart_syscall
51*c0087d80SHeiko Carstensvdso_syscall sigreturn,__NR_sigreturn
52*c0087d80SHeiko Carstensvdso_syscall rt_sigreturn,__NR_rt_sigreturn
53