| /* SPDX-License-Identifier: GPL-2.0 */ |
| #include <linux/linkage.h> |
| #include <asm/vdso.h> |
| #include <asm/unistd.h> |
| #include <asm/asm-offsets.h> |
| #include <asm/dwarf.h> |
| #include <asm/ptrace.h> |
| |
| /* |
| * 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 |
| SYM_FUNC_START(__kernel_\func) |
| CFI_STARTPROC |
| aghi %r15,-STACK_FRAME_VDSO_OVERHEAD |
| CFI_DEF_CFA_OFFSET (STACK_FRAME_USER_OVERHEAD + STACK_FRAME_VDSO_OVERHEAD) |
| CFI_VAL_OFFSET 15,-STACK_FRAME_USER_OVERHEAD |
| stg %r14,__SFVDSO_RETURN_ADDRESS(%r15) |
| CFI_REL_OFFSET 14,__SFVDSO_RETURN_ADDRESS |
| xc __SFUSER_BACKCHAIN(8,%r15),__SFUSER_BACKCHAIN(%r15) |
| brasl %r14,__s390_vdso_\func |
| lg %r14,__SFVDSO_RETURN_ADDRESS(%r15) |
| CFI_RESTORE 14 |
| aghi %r15,STACK_FRAME_VDSO_OVERHEAD |
| CFI_DEF_CFA_OFFSET STACK_FRAME_USER_OVERHEAD |
| CFI_RESTORE 15 |
| br %r14 |
| CFI_ENDPROC |
| SYM_FUNC_END(__kernel_\func) |
| .endm |
| |
| vdso_func gettimeofday |
| vdso_func clock_getres |
| vdso_func clock_gettime |
| vdso_func getcpu |
| |
| .macro vdso_syscall func,syscall |
| SYM_FUNC_START(__kernel_\func) |
| CFI_STARTPROC |
| svc \syscall |
| /* Make sure we notice when a syscall returns, which shouldn't happen */ |
| .word 0 |
| CFI_ENDPROC |
| SYM_FUNC_END(__kernel_\func) |
| .endm |
| |
| vdso_syscall restart_syscall,__NR_restart_syscall |
| vdso_syscall sigreturn,__NR_sigreturn |
| vdso_syscall rt_sigreturn,__NR_rt_sigreturn |