| /* 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> |
| |
| #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 |
| __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) |
| brasl %r14,__s390_vdso_\func |
| lg %r14,STACK_FRAME_OVERHEAD(%r15) |
| 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 |
| vdso_func getcpu |
| |
| .macro vdso_syscall func,syscall |
| .globl __kernel_\func |
| .type __kernel_\func,@function |
| __ALIGN |
| __kernel_\func: |
| CFI_STARTPROC |
| svc \syscall |
| /* Make sure we notice when a syscall returns, which shouldn't happen */ |
| .word 0 |
| CFI_ENDPROC |
| .size __kernel_\func,.-__kernel_\func |
| .endm |
| |
| vdso_syscall restart_syscall,__NR_restart_syscall |
| vdso_syscall sigreturn,__NR_sigreturn |
| vdso_syscall rt_sigreturn,__NR_rt_sigreturn |