]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
parisc: entry: set W bit for !compat tasks in syscall_restore_rfi()
authorSven Schnelle <svens@stackframe.org>
Wed, 15 Oct 2025 21:21:41 +0000 (23:21 +0200)
committerHelge Deller <deller@gmx.de>
Wed, 15 Oct 2025 23:37:39 +0000 (01:37 +0200)
When the kernel leaves to userspace via syscall_restore_rfi(), the
W bit is not set in the new PSW. This doesn't cause any problems
because there's no 64 bit userspace for parisc. Simple static binaries
are usually loaded at addresses way below the 32 bit limit so the W bit
doesn't matter.

Fix this by setting the W bit when TIF_32BIT is not set.

Signed-off-by: Sven Schnelle <svens@stackframe.org>
Cc: stable@vger.kernel.org
Signed-off-by: Helge Deller <deller@gmx.de>
arch/parisc/kernel/asm-offsets.c
arch/parisc/kernel/entry.S

index 9abfe65492c65eadbc69d7a6fa01b2fbab5ad285..3de4b5933b107962a6f40fd098f8fc359cf4b064 100644 (file)
@@ -258,6 +258,8 @@ int main(void)
        BLANK();
        DEFINE(TIF_BLOCKSTEP_PA_BIT, 31-TIF_BLOCKSTEP);
        DEFINE(TIF_SINGLESTEP_PA_BIT, 31-TIF_SINGLESTEP);
+       DEFINE(TIF_32BIT_PA_BIT, 31-TIF_32BIT);
+
        BLANK();
        DEFINE(ASM_PMD_SHIFT, PMD_SHIFT);
        DEFINE(ASM_PGDIR_SHIFT, PGDIR_SHIFT);
index f4bf61a34701e5b481bc8f5e3b8ea32d314cb957..36914138f5f88b78b104e6ab752f584533b89a26 100644 (file)
@@ -1841,6 +1841,10 @@ syscall_restore_rfi:
        extru,= %r19,TIF_BLOCKSTEP_PA_BIT,1,%r0
        depi    -1,7,1,%r20                        /* T bit */
 
+#ifdef CONFIG_64BIT
+       extru,<> %r19,TIF_32BIT_PA_BIT,1,%r0
+       depi    -1,4,1,%r20                        /* W bit */
+#endif
        STREG   %r20,TASK_PT_PSW(%r1)
 
        /* Always store space registers, since sr3 can be changed (e.g. fork) */
@@ -1854,7 +1858,6 @@ syscall_restore_rfi:
        STREG   %r25,TASK_PT_IASQ0(%r1)
        STREG   %r25,TASK_PT_IASQ1(%r1)
 
-       /* XXX W bit??? */
        /* Now if old D bit is clear, it means we didn't save all registers
         * on syscall entry, so do that now.  This only happens on TRACEME
         * calls, or if someone attached to us while we were on a syscall.