| From 891f6a726cacbb87e5b06076693ffab53bd378d7 Mon Sep 17 00:00:00 2001 |
| From: Christian Borntraeger <borntraeger@de.ibm.com> |
| Date: Thu, 21 Jun 2018 14:49:38 +0200 |
| Subject: s390: Correct register corruption in critical section cleanup |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Christian Borntraeger <borntraeger@de.ibm.com> |
| |
| commit 891f6a726cacbb87e5b06076693ffab53bd378d7 upstream. |
| |
| In the critical section cleanup we must not mess with r1. For march=z9 |
| or older, larl + ex (instead of exrl) are used with r1 as a temporary |
| register. This can clobber r1 in several interrupt handlers. Fix this by |
| using r11 as a temp register. r11 is being saved by all callers of |
| cleanup_critical. |
| |
| Fixes: 6dd85fbb87 ("s390: move expoline assembler macros to a header") |
| Cc: stable@vger.kernel.org #v4.16 |
| Reported-by: Oliver Kurz <okurz@suse.com> |
| Reported-by: Petr Tesařík <ptesarik@suse.com> |
| Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> |
| Reviewed-by: Hendrik Brueckner <brueckner@linux.ibm.com> |
| Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/s390/kernel/entry.S | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/arch/s390/kernel/entry.S |
| +++ b/arch/s390/kernel/entry.S |
| @@ -1170,7 +1170,7 @@ cleanup_critical: |
| jl 0f |
| clg %r9,BASED(.Lcleanup_table+104) # .Lload_fpu_regs_end |
| jl .Lcleanup_load_fpu_regs |
| -0: BR_EX %r14 |
| +0: BR_EX %r14,%r11 |
| |
| .align 8 |
| .Lcleanup_table: |
| @@ -1200,7 +1200,7 @@ cleanup_critical: |
| ni __SIE_PROG0C+3(%r9),0xfe # no longer in SIE |
| lctlg %c1,%c1,__LC_USER_ASCE # load primary asce |
| larl %r9,sie_exit # skip forward to sie_exit |
| - BR_EX %r14 |
| + BR_EX %r14,%r11 |
| #endif |
| |
| .Lcleanup_system_call: |