| From 713b80277d3c1a496705833dacb2724d1908504c Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 14 Sep 2018 18:08:10 +0200 |
| Subject: s390/vdso: correct CFI annotations of vDSO functions |
| |
| From: Vasily Gorbik <gor@linux.ibm.com> |
| |
| [ Upstream commit 26f4414a45b808f83d42d6fd2fbf4a59ef25e84b ] |
| |
| 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> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/s390/kernel/vdso32/clock_gettime.S | 19 ++++++++++--------- |
| arch/s390/kernel/vdso32/gettimeofday.S | 3 ++- |
| arch/s390/kernel/vdso64/clock_gettime.S | 25 +++++++++++++------------ |
| arch/s390/kernel/vdso64/gettimeofday.S | 3 ++- |
| 4 files changed, 27 insertions(+), 23 deletions(-) |
| |
| diff --git a/arch/s390/kernel/vdso32/clock_gettime.S b/arch/s390/kernel/vdso32/clock_gettime.S |
| index a9418bf975db5..ada5c11a16e5a 100644 |
| --- a/arch/s390/kernel/vdso32/clock_gettime.S |
| +++ b/arch/s390/kernel/vdso32/clock_gettime.S |
| @@ -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 |
| diff --git a/arch/s390/kernel/vdso32/gettimeofday.S b/arch/s390/kernel/vdso32/gettimeofday.S |
| index 3c0db0fa6ad90..b23063fbc892c 100644 |
| --- a/arch/s390/kernel/vdso32/gettimeofday.S |
| +++ b/arch/s390/kernel/vdso32/gettimeofday.S |
| @@ -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 */ |
| diff --git a/arch/s390/kernel/vdso64/clock_gettime.S b/arch/s390/kernel/vdso64/clock_gettime.S |
| index fac3ab5ec83a9..9d2ee79b90f25 100644 |
| --- a/arch/s390/kernel/vdso64/clock_gettime.S |
| +++ b/arch/s390/kernel/vdso64/clock_gettime.S |
| @@ -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 |
| diff --git a/arch/s390/kernel/vdso64/gettimeofday.S b/arch/s390/kernel/vdso64/gettimeofday.S |
| index 6e1f0b421695a..aebe10dc7c99a 100644 |
| --- a/arch/s390/kernel/vdso64/gettimeofday.S |
| +++ b/arch/s390/kernel/vdso64/gettimeofday.S |
| @@ -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 |
| -- |
| 2.20.1 |
| |