mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-16 15:45:45 +00:00
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: Hendrik Brueckner <brueckner@linux.ibm.com> Signed-off-by: Vasily Gorbik <gor@linux.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
d1befa6582
commit
26f4414a45
4 changed files with 27 additions and 23 deletions
|
@ -10,6 +10,7 @@
|
||||||
#include <asm/asm-offsets.h>
|
#include <asm/asm-offsets.h>
|
||||||
#include <asm/unistd.h>
|
#include <asm/unistd.h>
|
||||||
#include <asm/dwarf.h>
|
#include <asm/dwarf.h>
|
||||||
|
#include <asm/ptrace.h>
|
||||||
|
|
||||||
.text
|
.text
|
||||||
.align 4
|
.align 4
|
||||||
|
@ -18,8 +19,8 @@
|
||||||
__kernel_clock_gettime:
|
__kernel_clock_gettime:
|
||||||
CFI_STARTPROC
|
CFI_STARTPROC
|
||||||
ahi %r15,-16
|
ahi %r15,-16
|
||||||
CFI_DEF_CFA_OFFSET 176
|
CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD+16
|
||||||
CFI_VAL_OFFSET 15, -160
|
CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD
|
||||||
basr %r5,0
|
basr %r5,0
|
||||||
0: al %r5,21f-0b(%r5) /* get &_vdso_data */
|
0: al %r5,21f-0b(%r5) /* get &_vdso_data */
|
||||||
chi %r2,__CLOCK_REALTIME_COARSE
|
chi %r2,__CLOCK_REALTIME_COARSE
|
||||||
|
@ -72,13 +73,13 @@ __kernel_clock_gettime:
|
||||||
st %r1,4(%r3) /* store tp->tv_nsec */
|
st %r1,4(%r3) /* store tp->tv_nsec */
|
||||||
lhi %r2,0
|
lhi %r2,0
|
||||||
ahi %r15,16
|
ahi %r15,16
|
||||||
CFI_DEF_CFA_OFFSET 160
|
CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD
|
||||||
CFI_RESTORE 15
|
CFI_RESTORE 15
|
||||||
br %r14
|
br %r14
|
||||||
|
|
||||||
/* CLOCK_MONOTONIC_COARSE */
|
/* CLOCK_MONOTONIC_COARSE */
|
||||||
CFI_DEF_CFA_OFFSET 176
|
CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD+16
|
||||||
CFI_VAL_OFFSET 15, -160
|
CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD
|
||||||
9: l %r4,__VDSO_UPD_COUNT+4(%r5) /* load update counter */
|
9: l %r4,__VDSO_UPD_COUNT+4(%r5) /* load update counter */
|
||||||
tml %r4,0x0001 /* pending update ? loop */
|
tml %r4,0x0001 /* pending update ? loop */
|
||||||
jnz 9b
|
jnz 9b
|
||||||
|
@ -158,17 +159,17 @@ __kernel_clock_gettime:
|
||||||
st %r1,4(%r3) /* store tp->tv_nsec */
|
st %r1,4(%r3) /* store tp->tv_nsec */
|
||||||
lhi %r2,0
|
lhi %r2,0
|
||||||
ahi %r15,16
|
ahi %r15,16
|
||||||
CFI_DEF_CFA_OFFSET 160
|
CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD
|
||||||
CFI_RESTORE 15
|
CFI_RESTORE 15
|
||||||
br %r14
|
br %r14
|
||||||
|
|
||||||
/* Fallback to system call */
|
/* Fallback to system call */
|
||||||
CFI_DEF_CFA_OFFSET 176
|
CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD+16
|
||||||
CFI_VAL_OFFSET 15, -160
|
CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD
|
||||||
19: lhi %r1,__NR_clock_gettime
|
19: lhi %r1,__NR_clock_gettime
|
||||||
svc 0
|
svc 0
|
||||||
ahi %r15,16
|
ahi %r15,16
|
||||||
CFI_DEF_CFA_OFFSET 160
|
CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD
|
||||||
CFI_RESTORE 15
|
CFI_RESTORE 15
|
||||||
br %r14
|
br %r14
|
||||||
CFI_ENDPROC
|
CFI_ENDPROC
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include <asm/asm-offsets.h>
|
#include <asm/asm-offsets.h>
|
||||||
#include <asm/unistd.h>
|
#include <asm/unistd.h>
|
||||||
#include <asm/dwarf.h>
|
#include <asm/dwarf.h>
|
||||||
|
#include <asm/ptrace.h>
|
||||||
|
|
||||||
.text
|
.text
|
||||||
.align 4
|
.align 4
|
||||||
|
@ -19,7 +20,7 @@ __kernel_gettimeofday:
|
||||||
CFI_STARTPROC
|
CFI_STARTPROC
|
||||||
ahi %r15,-16
|
ahi %r15,-16
|
||||||
CFI_ADJUST_CFA_OFFSET 16
|
CFI_ADJUST_CFA_OFFSET 16
|
||||||
CFI_VAL_OFFSET 15, -160
|
CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD
|
||||||
basr %r5,0
|
basr %r5,0
|
||||||
0: al %r5,13f-0b(%r5) /* get &_vdso_data */
|
0: al %r5,13f-0b(%r5) /* get &_vdso_data */
|
||||||
1: ltr %r3,%r3 /* check if tz is NULL */
|
1: ltr %r3,%r3 /* check if tz is NULL */
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include <asm/asm-offsets.h>
|
#include <asm/asm-offsets.h>
|
||||||
#include <asm/unistd.h>
|
#include <asm/unistd.h>
|
||||||
#include <asm/dwarf.h>
|
#include <asm/dwarf.h>
|
||||||
|
#include <asm/ptrace.h>
|
||||||
|
|
||||||
.text
|
.text
|
||||||
.align 4
|
.align 4
|
||||||
|
@ -18,8 +19,8 @@
|
||||||
__kernel_clock_gettime:
|
__kernel_clock_gettime:
|
||||||
CFI_STARTPROC
|
CFI_STARTPROC
|
||||||
aghi %r15,-16
|
aghi %r15,-16
|
||||||
CFI_DEF_CFA_OFFSET 176
|
CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD+16
|
||||||
CFI_VAL_OFFSET 15, -160
|
CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD
|
||||||
larl %r5,_vdso_data
|
larl %r5,_vdso_data
|
||||||
cghi %r2,__CLOCK_REALTIME_COARSE
|
cghi %r2,__CLOCK_REALTIME_COARSE
|
||||||
je 4f
|
je 4f
|
||||||
|
@ -56,13 +57,13 @@ __kernel_clock_gettime:
|
||||||
stg %r1,8(%r3) /* store tp->tv_nsec */
|
stg %r1,8(%r3) /* store tp->tv_nsec */
|
||||||
lghi %r2,0
|
lghi %r2,0
|
||||||
aghi %r15,16
|
aghi %r15,16
|
||||||
CFI_DEF_CFA_OFFSET 160
|
CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD
|
||||||
CFI_RESTORE 15
|
CFI_RESTORE 15
|
||||||
br %r14
|
br %r14
|
||||||
|
|
||||||
/* CLOCK_MONOTONIC_COARSE */
|
/* CLOCK_MONOTONIC_COARSE */
|
||||||
CFI_DEF_CFA_OFFSET 176
|
CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD+16
|
||||||
CFI_VAL_OFFSET 15, -160
|
CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD
|
||||||
3: lg %r4,__VDSO_UPD_COUNT(%r5) /* load update counter */
|
3: lg %r4,__VDSO_UPD_COUNT(%r5) /* load update counter */
|
||||||
tmll %r4,0x0001 /* pending update ? loop */
|
tmll %r4,0x0001 /* pending update ? loop */
|
||||||
jnz 3b
|
jnz 3b
|
||||||
|
@ -115,13 +116,13 @@ __kernel_clock_gettime:
|
||||||
stg %r1,8(%r3) /* store tp->tv_nsec */
|
stg %r1,8(%r3) /* store tp->tv_nsec */
|
||||||
lghi %r2,0
|
lghi %r2,0
|
||||||
aghi %r15,16
|
aghi %r15,16
|
||||||
CFI_DEF_CFA_OFFSET 160
|
CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD
|
||||||
CFI_RESTORE 15
|
CFI_RESTORE 15
|
||||||
br %r14
|
br %r14
|
||||||
|
|
||||||
/* CPUCLOCK_VIRT for this thread */
|
/* CPUCLOCK_VIRT for this thread */
|
||||||
CFI_DEF_CFA_OFFSET 176
|
CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD+16
|
||||||
CFI_VAL_OFFSET 15, -160
|
CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD
|
||||||
9: lghi %r4,0
|
9: lghi %r4,0
|
||||||
icm %r0,15,__VDSO_ECTG_OK(%r5)
|
icm %r0,15,__VDSO_ECTG_OK(%r5)
|
||||||
jz 12f
|
jz 12f
|
||||||
|
@ -142,17 +143,17 @@ __kernel_clock_gettime:
|
||||||
stg %r4,8(%r3)
|
stg %r4,8(%r3)
|
||||||
lghi %r2,0
|
lghi %r2,0
|
||||||
aghi %r15,16
|
aghi %r15,16
|
||||||
CFI_DEF_CFA_OFFSET 160
|
CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD
|
||||||
CFI_RESTORE 15
|
CFI_RESTORE 15
|
||||||
br %r14
|
br %r14
|
||||||
|
|
||||||
/* Fallback to system call */
|
/* Fallback to system call */
|
||||||
CFI_DEF_CFA_OFFSET 176
|
CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD+16
|
||||||
CFI_VAL_OFFSET 15, -160
|
CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD
|
||||||
12: lghi %r1,__NR_clock_gettime
|
12: lghi %r1,__NR_clock_gettime
|
||||||
svc 0
|
svc 0
|
||||||
aghi %r15,16
|
aghi %r15,16
|
||||||
CFI_DEF_CFA_OFFSET 160
|
CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD
|
||||||
CFI_RESTORE 15
|
CFI_RESTORE 15
|
||||||
br %r14
|
br %r14
|
||||||
CFI_ENDPROC
|
CFI_ENDPROC
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include <asm/asm-offsets.h>
|
#include <asm/asm-offsets.h>
|
||||||
#include <asm/unistd.h>
|
#include <asm/unistd.h>
|
||||||
#include <asm/dwarf.h>
|
#include <asm/dwarf.h>
|
||||||
|
#include <asm/ptrace.h>
|
||||||
|
|
||||||
.text
|
.text
|
||||||
.align 4
|
.align 4
|
||||||
|
@ -19,7 +20,7 @@ __kernel_gettimeofday:
|
||||||
CFI_STARTPROC
|
CFI_STARTPROC
|
||||||
aghi %r15,-16
|
aghi %r15,-16
|
||||||
CFI_ADJUST_CFA_OFFSET 16
|
CFI_ADJUST_CFA_OFFSET 16
|
||||||
CFI_VAL_OFFSET 15, -160
|
CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD
|
||||||
larl %r5,_vdso_data
|
larl %r5,_vdso_data
|
||||||
0: ltgr %r3,%r3 /* check if tz is NULL */
|
0: ltgr %r3,%r3 /* check if tz is NULL */
|
||||||
je 1f
|
je 1f
|
||||||
|
|
Loading…
Reference in a new issue