mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-18 13:49:36 +07:00
7bceec4e58
Revise and add CFI CFA and register rule annotations to the vDSO functions for proper stack unwinding and debugging. Because glibc might call the vDSO in special ways, the vDSO code does not rely on a stack frame created by the caller. The TOD clock value can be therefore not stored in the pre-allocated stack area and additional stack space is required. To correctly annotate these situations with CFI, the .cfi_val_offset directive is required to create relative offsets on the value of the stack register %r15. Because the .cfi_val_offset directive is available with recent GNU assembler versions only, additional checks are necessary. Note that if the vDSO is assembled with an older assembler version, stack unwinding and debugging from within the vDSO code might not be possible. Signed-off-by: Hendrik Brueckner <brueckner@linux.vnet.ibm.com> Reviewed-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
51 lines
1.2 KiB
ArmAsm
51 lines
1.2 KiB
ArmAsm
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Userland implementation of clock_getres() for 64 bits processes in a
|
|
* s390 kernel for use in the vDSO
|
|
*
|
|
* Copyright IBM Corp. 2008
|
|
* Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
|
|
*/
|
|
#include <asm/vdso.h>
|
|
#include <asm/asm-offsets.h>
|
|
#include <asm/unistd.h>
|
|
#include <asm/dwarf.h>
|
|
|
|
.text
|
|
.align 4
|
|
.globl __kernel_clock_getres
|
|
.type __kernel_clock_getres,@function
|
|
__kernel_clock_getres:
|
|
CFI_STARTPROC
|
|
larl %r1,4f
|
|
cghi %r2,__CLOCK_REALTIME_COARSE
|
|
je 0f
|
|
cghi %r2,__CLOCK_MONOTONIC_COARSE
|
|
je 0f
|
|
larl %r1,3f
|
|
cghi %r2,__CLOCK_REALTIME
|
|
je 0f
|
|
cghi %r2,__CLOCK_MONOTONIC
|
|
je 0f
|
|
cghi %r2,__CLOCK_THREAD_CPUTIME_ID
|
|
je 0f
|
|
cghi %r2,-2 /* Per-thread CPUCLOCK with PID=0, VIRT=1 */
|
|
jne 2f
|
|
larl %r5,_vdso_data
|
|
icm %r0,15,__LC_ECTG_OK(%r5)
|
|
jz 2f
|
|
0: ltgr %r3,%r3
|
|
jz 1f /* res == NULL */
|
|
lg %r0,0(%r1)
|
|
xc 0(8,%r3),0(%r3) /* set tp->tv_sec to zero */
|
|
stg %r0,8(%r3) /* store tp->tv_usec */
|
|
1: lghi %r2,0
|
|
br %r14
|
|
2: lghi %r1,__NR_clock_getres /* fallback to svc */
|
|
svc 0
|
|
br %r14
|
|
CFI_ENDPROC
|
|
3: .quad __CLOCK_REALTIME_RES
|
|
4: .quad __CLOCK_COARSE_RES
|
|
.size __kernel_clock_getres,.-__kernel_clock_getres
|