mirror of
https://github.com/hardkernel/linux.git
synced 2026-03-25 03:50:24 +09:00
parisc: entry.S: fix space adjustment on interruption for 64-bit userspace
commit 1aa4524c0c1b54842c4c0a370171d11b12d0709b upstream. In wide mode, the IASQ contain the upper part of the GVA during interruption. This needs to be reversed before the space is used - otherwise it contains parts of IAOQ. See Page 2-13 "Processing Resources / Interruption Instruction Address Queues" in the Parisc 2.0 Architecture Manual page 2-13 for an explanation. The IAOQ/IASQ space_adjust was skipped for other interruptions than itlb misses. However, the code in handle_interruption() checks whether iasq[0] contains a valid space. Due to the not masked out bits this match failed and the process was killed. Also add space_adjust for IAOQ1/IASQ1 so ptregs contains sane values. Signed-off-by: Sven Schnelle <svens@stackframe.org> Cc: stable@vger.kernel.org # v6.0+ Signed-off-by: Helge Deller <deller@gmx.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
13cf5cd4d5
commit
d3842cbf13
@@ -1059,8 +1059,6 @@ ENTRY_CFI(intr_save) /* for os_hpmc */
|
||||
STREG %r17, PT_IOR(%r29)
|
||||
|
||||
#if defined(CONFIG_64BIT)
|
||||
b,n intr_save2
|
||||
|
||||
skip_save_ior:
|
||||
/* We have a itlb miss, and when executing code above 4 Gb on ILP64, we
|
||||
* need to adjust iasq/iaoq here in the same way we adjusted isr/ior
|
||||
@@ -1069,10 +1067,17 @@ skip_save_ior:
|
||||
bb,COND(>=),n %r8,PSW_W_BIT,intr_save2
|
||||
LDREG PT_IASQ0(%r29), %r16
|
||||
LDREG PT_IAOQ0(%r29), %r17
|
||||
/* adjust iasq/iaoq */
|
||||
/* adjust iasq0/iaoq0 */
|
||||
space_adjust %r16,%r17,%r1
|
||||
STREG %r16, PT_IASQ0(%r29)
|
||||
STREG %r17, PT_IAOQ0(%r29)
|
||||
|
||||
LDREG PT_IASQ1(%r29), %r16
|
||||
LDREG PT_IAOQ1(%r29), %r17
|
||||
/* adjust iasq1/iaoq1 */
|
||||
space_adjust %r16,%r17,%r1
|
||||
STREG %r16, PT_IASQ1(%r29)
|
||||
STREG %r17, PT_IAOQ1(%r29)
|
||||
#else
|
||||
skip_save_ior:
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user