]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
parisc: entry.S: fix space adjustment on interruption for 64-bit userspace
authorSven Schnelle <svens@stackframe.org>
Thu, 30 Oct 2025 07:56:05 +0000 (08:56 +0100)
committerHelge Deller <deller@gmx.de>
Thu, 30 Oct 2025 14:16:32 +0000 (15:16 +0100)
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>
arch/parisc/kernel/entry.S

index 36914138f5f88b78b104e6ab752f584533b89a26..e04c5d806c10517827d2d4b0ab3888f1156b6e25 100644 (file)
@@ -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