diff options
author | Vasily Gorbik <gor@linux.ibm.com> | 2018-09-14 12:08:10 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2018-09-20 07:20:29 -0400 |
commit | 26f4414a45b808f83d42d6fd2fbf4a59ef25e84b (patch) | |
tree | b0c8dc5f007a5e13ca0794252777a454980be27e | |
parent | d1befa65823e9c6d013883b8a41d081ec338c489 (diff) |
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>
-rw-r--r-- | arch/s390/kernel/vdso32/clock_gettime.S | 19 | ||||
-rw-r--r-- | arch/s390/kernel/vdso32/gettimeofday.S | 3 | ||||
-rw-r--r-- | arch/s390/kernel/vdso64/clock_gettime.S | 25 | ||||
-rw-r--r-- | 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 a9418bf975db..ada5c11a16e5 100644 --- a/arch/s390/kernel/vdso32/clock_gettime.S +++ b/arch/s390/kernel/vdso32/clock_gettime.S | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <asm/asm-offsets.h> | 10 | #include <asm/asm-offsets.h> |
11 | #include <asm/unistd.h> | 11 | #include <asm/unistd.h> |
12 | #include <asm/dwarf.h> | 12 | #include <asm/dwarf.h> |
13 | #include <asm/ptrace.h> | ||
13 | 14 | ||
14 | .text | 15 | .text |
15 | .align 4 | 16 | .align 4 |
@@ -18,8 +19,8 @@ | |||
18 | __kernel_clock_gettime: | 19 | __kernel_clock_gettime: |
19 | CFI_STARTPROC | 20 | CFI_STARTPROC |
20 | ahi %r15,-16 | 21 | ahi %r15,-16 |
21 | CFI_DEF_CFA_OFFSET 176 | 22 | CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD+16 |
22 | CFI_VAL_OFFSET 15, -160 | 23 | CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD |
23 | basr %r5,0 | 24 | basr %r5,0 |
24 | 0: al %r5,21f-0b(%r5) /* get &_vdso_data */ | 25 | 0: al %r5,21f-0b(%r5) /* get &_vdso_data */ |
25 | chi %r2,__CLOCK_REALTIME_COARSE | 26 | chi %r2,__CLOCK_REALTIME_COARSE |
@@ -72,13 +73,13 @@ __kernel_clock_gettime: | |||
72 | st %r1,4(%r3) /* store tp->tv_nsec */ | 73 | st %r1,4(%r3) /* store tp->tv_nsec */ |
73 | lhi %r2,0 | 74 | lhi %r2,0 |
74 | ahi %r15,16 | 75 | ahi %r15,16 |
75 | CFI_DEF_CFA_OFFSET 160 | 76 | CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD |
76 | CFI_RESTORE 15 | 77 | CFI_RESTORE 15 |
77 | br %r14 | 78 | br %r14 |
78 | 79 | ||
79 | /* CLOCK_MONOTONIC_COARSE */ | 80 | /* CLOCK_MONOTONIC_COARSE */ |
80 | CFI_DEF_CFA_OFFSET 176 | 81 | CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD+16 |
81 | CFI_VAL_OFFSET 15, -160 | 82 | CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD |
82 | 9: l %r4,__VDSO_UPD_COUNT+4(%r5) /* load update counter */ | 83 | 9: l %r4,__VDSO_UPD_COUNT+4(%r5) /* load update counter */ |
83 | tml %r4,0x0001 /* pending update ? loop */ | 84 | tml %r4,0x0001 /* pending update ? loop */ |
84 | jnz 9b | 85 | jnz 9b |
@@ -158,17 +159,17 @@ __kernel_clock_gettime: | |||
158 | st %r1,4(%r3) /* store tp->tv_nsec */ | 159 | st %r1,4(%r3) /* store tp->tv_nsec */ |
159 | lhi %r2,0 | 160 | lhi %r2,0 |
160 | ahi %r15,16 | 161 | ahi %r15,16 |
161 | CFI_DEF_CFA_OFFSET 160 | 162 | CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD |
162 | CFI_RESTORE 15 | 163 | CFI_RESTORE 15 |
163 | br %r14 | 164 | br %r14 |
164 | 165 | ||
165 | /* Fallback to system call */ | 166 | /* Fallback to system call */ |
166 | CFI_DEF_CFA_OFFSET 176 | 167 | CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD+16 |
167 | CFI_VAL_OFFSET 15, -160 | 168 | CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD |
168 | 19: lhi %r1,__NR_clock_gettime | 169 | 19: lhi %r1,__NR_clock_gettime |
169 | svc 0 | 170 | svc 0 |
170 | ahi %r15,16 | 171 | ahi %r15,16 |
171 | CFI_DEF_CFA_OFFSET 160 | 172 | CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD |
172 | CFI_RESTORE 15 | 173 | CFI_RESTORE 15 |
173 | br %r14 | 174 | br %r14 |
174 | CFI_ENDPROC | 175 | CFI_ENDPROC |
diff --git a/arch/s390/kernel/vdso32/gettimeofday.S b/arch/s390/kernel/vdso32/gettimeofday.S index 3c0db0fa6ad9..b23063fbc892 100644 --- a/arch/s390/kernel/vdso32/gettimeofday.S +++ b/arch/s390/kernel/vdso32/gettimeofday.S | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <asm/asm-offsets.h> | 10 | #include <asm/asm-offsets.h> |
11 | #include <asm/unistd.h> | 11 | #include <asm/unistd.h> |
12 | #include <asm/dwarf.h> | 12 | #include <asm/dwarf.h> |
13 | #include <asm/ptrace.h> | ||
13 | 14 | ||
14 | .text | 15 | .text |
15 | .align 4 | 16 | .align 4 |
@@ -19,7 +20,7 @@ __kernel_gettimeofday: | |||
19 | CFI_STARTPROC | 20 | CFI_STARTPROC |
20 | ahi %r15,-16 | 21 | ahi %r15,-16 |
21 | CFI_ADJUST_CFA_OFFSET 16 | 22 | CFI_ADJUST_CFA_OFFSET 16 |
22 | CFI_VAL_OFFSET 15, -160 | 23 | CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD |
23 | basr %r5,0 | 24 | basr %r5,0 |
24 | 0: al %r5,13f-0b(%r5) /* get &_vdso_data */ | 25 | 0: al %r5,13f-0b(%r5) /* get &_vdso_data */ |
25 | 1: ltr %r3,%r3 /* check if tz is NULL */ | 26 | 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 fac3ab5ec83a..9d2ee79b90f2 100644 --- a/arch/s390/kernel/vdso64/clock_gettime.S +++ b/arch/s390/kernel/vdso64/clock_gettime.S | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <asm/asm-offsets.h> | 10 | #include <asm/asm-offsets.h> |
11 | #include <asm/unistd.h> | 11 | #include <asm/unistd.h> |
12 | #include <asm/dwarf.h> | 12 | #include <asm/dwarf.h> |
13 | #include <asm/ptrace.h> | ||
13 | 14 | ||
14 | .text | 15 | .text |
15 | .align 4 | 16 | .align 4 |
@@ -18,8 +19,8 @@ | |||
18 | __kernel_clock_gettime: | 19 | __kernel_clock_gettime: |
19 | CFI_STARTPROC | 20 | CFI_STARTPROC |
20 | aghi %r15,-16 | 21 | aghi %r15,-16 |
21 | CFI_DEF_CFA_OFFSET 176 | 22 | CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD+16 |
22 | CFI_VAL_OFFSET 15, -160 | 23 | CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD |
23 | larl %r5,_vdso_data | 24 | larl %r5,_vdso_data |
24 | cghi %r2,__CLOCK_REALTIME_COARSE | 25 | cghi %r2,__CLOCK_REALTIME_COARSE |
25 | je 4f | 26 | je 4f |
@@ -56,13 +57,13 @@ __kernel_clock_gettime: | |||
56 | stg %r1,8(%r3) /* store tp->tv_nsec */ | 57 | stg %r1,8(%r3) /* store tp->tv_nsec */ |
57 | lghi %r2,0 | 58 | lghi %r2,0 |
58 | aghi %r15,16 | 59 | aghi %r15,16 |
59 | CFI_DEF_CFA_OFFSET 160 | 60 | CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD |
60 | CFI_RESTORE 15 | 61 | CFI_RESTORE 15 |
61 | br %r14 | 62 | br %r14 |
62 | 63 | ||
63 | /* CLOCK_MONOTONIC_COARSE */ | 64 | /* CLOCK_MONOTONIC_COARSE */ |
64 | CFI_DEF_CFA_OFFSET 176 | 65 | CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD+16 |
65 | CFI_VAL_OFFSET 15, -160 | 66 | CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD |
66 | 3: lg %r4,__VDSO_UPD_COUNT(%r5) /* load update counter */ | 67 | 3: lg %r4,__VDSO_UPD_COUNT(%r5) /* load update counter */ |
67 | tmll %r4,0x0001 /* pending update ? loop */ | 68 | tmll %r4,0x0001 /* pending update ? loop */ |
68 | jnz 3b | 69 | jnz 3b |
@@ -115,13 +116,13 @@ __kernel_clock_gettime: | |||
115 | stg %r1,8(%r3) /* store tp->tv_nsec */ | 116 | stg %r1,8(%r3) /* store tp->tv_nsec */ |
116 | lghi %r2,0 | 117 | lghi %r2,0 |
117 | aghi %r15,16 | 118 | aghi %r15,16 |
118 | CFI_DEF_CFA_OFFSET 160 | 119 | CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD |
119 | CFI_RESTORE 15 | 120 | CFI_RESTORE 15 |
120 | br %r14 | 121 | br %r14 |
121 | 122 | ||
122 | /* CPUCLOCK_VIRT for this thread */ | 123 | /* CPUCLOCK_VIRT for this thread */ |
123 | CFI_DEF_CFA_OFFSET 176 | 124 | CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD+16 |
124 | CFI_VAL_OFFSET 15, -160 | 125 | CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD |
125 | 9: lghi %r4,0 | 126 | 9: lghi %r4,0 |
126 | icm %r0,15,__VDSO_ECTG_OK(%r5) | 127 | icm %r0,15,__VDSO_ECTG_OK(%r5) |
127 | jz 12f | 128 | jz 12f |
@@ -142,17 +143,17 @@ __kernel_clock_gettime: | |||
142 | stg %r4,8(%r3) | 143 | stg %r4,8(%r3) |
143 | lghi %r2,0 | 144 | lghi %r2,0 |
144 | aghi %r15,16 | 145 | aghi %r15,16 |
145 | CFI_DEF_CFA_OFFSET 160 | 146 | CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD |
146 | CFI_RESTORE 15 | 147 | CFI_RESTORE 15 |
147 | br %r14 | 148 | br %r14 |
148 | 149 | ||
149 | /* Fallback to system call */ | 150 | /* Fallback to system call */ |
150 | CFI_DEF_CFA_OFFSET 176 | 151 | CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD+16 |
151 | CFI_VAL_OFFSET 15, -160 | 152 | CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD |
152 | 12: lghi %r1,__NR_clock_gettime | 153 | 12: lghi %r1,__NR_clock_gettime |
153 | svc 0 | 154 | svc 0 |
154 | aghi %r15,16 | 155 | aghi %r15,16 |
155 | CFI_DEF_CFA_OFFSET 160 | 156 | CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD |
156 | CFI_RESTORE 15 | 157 | CFI_RESTORE 15 |
157 | br %r14 | 158 | br %r14 |
158 | CFI_ENDPROC | 159 | CFI_ENDPROC |
diff --git a/arch/s390/kernel/vdso64/gettimeofday.S b/arch/s390/kernel/vdso64/gettimeofday.S index 6e1f0b421695..aebe10dc7c99 100644 --- a/arch/s390/kernel/vdso64/gettimeofday.S +++ b/arch/s390/kernel/vdso64/gettimeofday.S | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <asm/asm-offsets.h> | 10 | #include <asm/asm-offsets.h> |
11 | #include <asm/unistd.h> | 11 | #include <asm/unistd.h> |
12 | #include <asm/dwarf.h> | 12 | #include <asm/dwarf.h> |
13 | #include <asm/ptrace.h> | ||
13 | 14 | ||
14 | .text | 15 | .text |
15 | .align 4 | 16 | .align 4 |
@@ -19,7 +20,7 @@ __kernel_gettimeofday: | |||
19 | CFI_STARTPROC | 20 | CFI_STARTPROC |
20 | aghi %r15,-16 | 21 | aghi %r15,-16 |
21 | CFI_ADJUST_CFA_OFFSET 16 | 22 | CFI_ADJUST_CFA_OFFSET 16 |
22 | CFI_VAL_OFFSET 15, -160 | 23 | CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD |
23 | larl %r5,_vdso_data | 24 | larl %r5,_vdso_data |
24 | 0: ltgr %r3,%r3 /* check if tz is NULL */ | 25 | 0: ltgr %r3,%r3 /* check if tz is NULL */ |
25 | je 1f | 26 | je 1f |