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

Commit 26f4414a authored by Vasily Gorbik's avatar Vasily Gorbik Committed by Martin Schwidefsky
Browse files

s390/vdso: correct CFI annotations of vDSO functions



Correct stack frame overhead for 31-bit vdso, which should be 96 rather
then 160. This is done by reusing STACK_FRAME_OVERHEAD definition which
contains correct value based on build flags. This fixes stack unwinding
within vdso code for 31-bit processes. While at it replace all hard coded
stack frame overhead values with the same definition in vdso64 as well.

Reviewed-by: default avatarHendrik Brueckner <brueckner@linux.ibm.com>
Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent d1befa65
Loading
Loading
Loading
Loading
+10 −9
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@
#include <asm/asm-offsets.h>
#include <asm/unistd.h>
#include <asm/dwarf.h>
#include <asm/ptrace.h>

	.text
	.align 4
@@ -18,8 +19,8 @@
__kernel_clock_gettime:
	CFI_STARTPROC
	ahi	%r15,-16
	CFI_DEF_CFA_OFFSET 176
	CFI_VAL_OFFSET 15, -160
	CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD+16
	CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD
	basr	%r5,0
0:	al	%r5,21f-0b(%r5)			/* get &_vdso_data */
	chi	%r2,__CLOCK_REALTIME_COARSE
@@ -72,13 +73,13 @@ __kernel_clock_gettime:
	st	%r1,4(%r3)			/* store tp->tv_nsec */
	lhi	%r2,0
	ahi	%r15,16
	CFI_DEF_CFA_OFFSET 160
	CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD
	CFI_RESTORE 15
	br	%r14

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

	/* Fallback to system call */
	CFI_DEF_CFA_OFFSET 176
	CFI_VAL_OFFSET 15, -160
	CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD+16
	CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD
19:	lhi	%r1,__NR_clock_gettime
	svc	0
	ahi	%r15,16
	CFI_DEF_CFA_OFFSET 160
	CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD
	CFI_RESTORE 15
	br	%r14
	CFI_ENDPROC
+2 −1
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@
#include <asm/asm-offsets.h>
#include <asm/unistd.h>
#include <asm/dwarf.h>
#include <asm/ptrace.h>

	.text
	.align 4
@@ -19,7 +20,7 @@ __kernel_gettimeofday:
	CFI_STARTPROC
	ahi	%r15,-16
	CFI_ADJUST_CFA_OFFSET 16
	CFI_VAL_OFFSET 15, -160
	CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD
	basr	%r5,0
0:	al	%r5,13f-0b(%r5)			/* get &_vdso_data */
1:	ltr	%r3,%r3				/* check if tz is NULL */
+13 −12
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@
#include <asm/asm-offsets.h>
#include <asm/unistd.h>
#include <asm/dwarf.h>
#include <asm/ptrace.h>

	.text
	.align 4
@@ -18,8 +19,8 @@
__kernel_clock_gettime:
	CFI_STARTPROC
	aghi	%r15,-16
	CFI_DEF_CFA_OFFSET 176
	CFI_VAL_OFFSET 15, -160
	CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD+16
	CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD
	larl	%r5,_vdso_data
	cghi	%r2,__CLOCK_REALTIME_COARSE
	je	4f
@@ -56,13 +57,13 @@ __kernel_clock_gettime:
	stg	%r1,8(%r3)			/* store tp->tv_nsec */
	lghi	%r2,0
	aghi	%r15,16
	CFI_DEF_CFA_OFFSET 160
	CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD
	CFI_RESTORE 15
	br	%r14

	/* CLOCK_MONOTONIC_COARSE */
	CFI_DEF_CFA_OFFSET 176
	CFI_VAL_OFFSET 15, -160
	CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD+16
	CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD
3:	lg	%r4,__VDSO_UPD_COUNT(%r5)	/* load update counter */
	tmll	%r4,0x0001			/* pending update ? loop */
	jnz	3b
@@ -115,13 +116,13 @@ __kernel_clock_gettime:
	stg	%r1,8(%r3)			/* store tp->tv_nsec */
	lghi	%r2,0
	aghi	%r15,16
	CFI_DEF_CFA_OFFSET 160
	CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD
	CFI_RESTORE 15
	br	%r14

	/* CPUCLOCK_VIRT for this thread */
	CFI_DEF_CFA_OFFSET 176
	CFI_VAL_OFFSET 15, -160
	CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD+16
	CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD
9:	lghi	%r4,0
	icm	%r0,15,__VDSO_ECTG_OK(%r5)
	jz	12f
@@ -142,17 +143,17 @@ __kernel_clock_gettime:
	stg	%r4,8(%r3)
	lghi	%r2,0
	aghi	%r15,16
	CFI_DEF_CFA_OFFSET 160
	CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD
	CFI_RESTORE 15
	br	%r14

	/* Fallback to system call */
	CFI_DEF_CFA_OFFSET 176
	CFI_VAL_OFFSET 15, -160
	CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD+16
	CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD
12:	lghi	%r1,__NR_clock_gettime
	svc	0
	aghi	%r15,16
	CFI_DEF_CFA_OFFSET 160
	CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD
	CFI_RESTORE 15
	br	%r14
	CFI_ENDPROC
+2 −1
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@
#include <asm/asm-offsets.h>
#include <asm/unistd.h>
#include <asm/dwarf.h>
#include <asm/ptrace.h>

	.text
	.align 4
@@ -19,7 +20,7 @@ __kernel_gettimeofday:
	CFI_STARTPROC
	aghi	%r15,-16
	CFI_ADJUST_CFA_OFFSET 16
	CFI_VAL_OFFSET 15, -160
	CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD
	larl	%r5,_vdso_data
0:	ltgr	%r3,%r3				/* check if tz is NULL */
	je	1f