Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7bceec4e authored by Hendrik Brueckner's avatar Hendrik Brueckner Committed by Martin Schwidefsky
Browse files

s390/vdso: revise CFI annotations of vDSO functions



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: default avatarHendrik Brueckner <brueckner@linux.vnet.ibm.com>
Reviewed-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent bc3703f2
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -88,10 +88,13 @@ KBUILD_CFLAGS += -DCC_USING_HOTPATCH
endif
endif

# Test CFI features of binutils
cfi := $(call as-instr,.cfi_startproc\n.cfi_val_offset 15$(comma)-160\n.cfi_endproc,-DCONFIG_AS_CFI_VAL_OFFSET=1)

KBUILD_CFLAGS	+= -mbackchain -msoft-float $(cflags-y)
KBUILD_CFLAGS	+= -pipe -fno-strength-reduce -Wno-sign-compare
KBUILD_CFLAGS	+= -fno-asynchronous-unwind-tables
KBUILD_AFLAGS	+= $(aflags-y)
KBUILD_CFLAGS	+= -fno-asynchronous-unwind-tables $(cfi)
KBUILD_AFLAGS	+= $(aflags-y) $(cfi)

OBJCOPYFLAGS	:= -O binary

+12 −0
Original line number Diff line number Diff line
@@ -4,6 +4,18 @@

#ifdef __ASSEMBLY__

#define CFI_STARTPROC		.cfi_startproc
#define CFI_ENDPROC		.cfi_endproc
#define CFI_DEF_CFA_OFFSET	.cfi_def_cfa_offset
#define CFI_ADJUST_CFA_OFFSET	.cfi_adjust_cfa_offset
#define CFI_RESTORE		.cfi_restore

#ifdef CONFIG_AS_CFI_VAL_OFFSET
#define CFI_VAL_OFFSET		.cfi_val_offset
#else
#define CFI_VAL_OFFSET		#
#endif

#ifndef BUILD_VDSO
	/*
	 * Emit CFI data in .debug_frame sections and not in .eh_frame
+2 −2
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@
	.globl __kernel_clock_getres
	.type  __kernel_clock_getres,@function
__kernel_clock_getres:
	.cfi_startproc
	CFI_STARTPROC
	basr	%r1,0
	la	%r1,4f-.(%r1)
	chi	%r2,__CLOCK_REALTIME
@@ -38,7 +38,7 @@ __kernel_clock_getres:
3:	lhi	%r1,__NR_clock_getres		/* fallback to svc */
	svc	0
	br	%r14
	CFI_ENDPROC
4:	.long	__CLOCK_REALTIME_RES
5:	.long	__CLOCK_COARSE_RES
	.cfi_endproc
	.size	__kernel_clock_getres,.-__kernel_clock_getres
+14 −2
Original line number Diff line number Diff line
@@ -16,8 +16,10 @@
	.globl __kernel_clock_gettime
	.type  __kernel_clock_gettime,@function
__kernel_clock_gettime:
	.cfi_startproc
	CFI_STARTPROC
	ahi	%r15,-16
	CFI_DEF_CFA_OFFSET 176
	CFI_VAL_OFFSET 15, -160
	basr	%r5,0
0:	al	%r5,21f-0b(%r5)			/* get &_vdso_data */
	chi	%r2,__CLOCK_REALTIME_COARSE
@@ -70,9 +72,13 @@ __kernel_clock_gettime:
	st	%r1,4(%r3)			/* store tp->tv_nsec */
	lhi	%r2,0
	ahi	%r15,16
	CFI_DEF_CFA_OFFSET 160
	CFI_RESTORE 15
	br	%r14

	/* CLOCK_MONOTONIC_COARSE */
	CFI_DEF_CFA_OFFSET 176
	CFI_VAL_OFFSET 15, -160
9:	l	%r4,__VDSO_UPD_COUNT+4(%r5)	/* load update counter */
	tml	%r4,0x0001			/* pending update ? loop */
	jnz	9b
@@ -152,15 +158,21 @@ __kernel_clock_gettime:
	st	%r1,4(%r3)			/* store tp->tv_nsec */
	lhi	%r2,0
	ahi	%r15,16
	CFI_DEF_CFA_OFFSET 160
	CFI_RESTORE 15
	br	%r14

	/* Fallback to system call */
	CFI_DEF_CFA_OFFSET 176
	CFI_VAL_OFFSET 15, -160
19:	lhi	%r1,__NR_clock_gettime
	svc	0
	ahi	%r15,16
	CFI_DEF_CFA_OFFSET 160
	CFI_RESTORE 15
	br	%r14
	CFI_ENDPROC

20:	.long	1000000000
21:	.long	_vdso_data - 0b
	.cfi_endproc
	.size	__kernel_clock_gettime,.-__kernel_clock_gettime
+2 −2
Original line number Diff line number Diff line
@@ -15,7 +15,7 @@
	.globl __kernel_getcpu
	.type  __kernel_getcpu,@function
__kernel_getcpu:
	.cfi_startproc
	CFI_STARTPROC
	la	%r4,0
	sacf	256
	l	%r5,__VDSO_CPU_NR(%r4)
@@ -29,5 +29,5 @@ __kernel_getcpu:
	st	%r4,0(%r3)
3:	lhi	%r2,0
	br	%r14
	.cfi_endproc
	CFI_ENDPROC
	.size	__kernel_getcpu,.-__kernel_getcpu
Loading