]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
m68k: Fix task info flags handling for 68000
authorDaniel Palmer <daniel@0x0f.com>
Sat, 4 Apr 2026 02:31:08 +0000 (11:31 +0900)
committerGreg Ungerer <gerg@kernel.org>
Sun, 5 Apr 2026 22:46:14 +0000 (08:46 +1000)
The logic for deciding what to do after a syscall should be checking
if any of the lower byte bits are set and then checking if the reschedule
bit is set.

Currently we are loading the top word, checking if any bits are set
(which never seems to be true) and thus jumping over loading the
whole long and checking if the reschedule bit is set.

We get the thread info in two places so split that logic out in
a macro and then fix the code so that it loads the byte of the flags
we need to check, checks if anything is set and then checks if
the reschedule bit in particular is set.

Reported-by: Christoph Plattner <christoph.plattner@gmx.at>
Signed-off-by: Daniel Palmer <daniel@0x0f.com>
Signed-off-by: Greg Ungerer <gerg@kernel.org>
arch/m68k/68000/entry.S

index 72e95663b62ffd548fa088e7a8ce75b9dedbf037..c257cc415c4780b2e09a017b754468e946a50145 100644 (file)
 
 .text
 
+/* get thread_info pointer into a2 */
+ .macro getthreadinfo
+       movel   %sp,%d1
+       andl    #-THREAD_SIZE,%d1
+       movel   %d1,%a2
+ .endm
+
 .globl system_call
 .globl resume
 .globl ret_from_exception
@@ -70,9 +77,8 @@ ENTRY(system_call)
 
        movel   %sp@(PT_OFF_ORIG_D0),%d0
 
-       movel   %sp,%d1                 /* get thread_info pointer */
-       andl    #-THREAD_SIZE,%d1
-       movel   %d1,%a2
+       /* Doing a trace ? */
+       getthreadinfo
        btst    #(TIF_SYSCALL_TRACE%8),%a2@(TINFO_FLAGS+(31-TIF_SYSCALL_TRACE)/8)
        jne     do_trace
        cmpl    #NR_syscalls,%d0
@@ -96,16 +102,15 @@ Luser_return:
        /* heavy interrupt load*/
        andw    #ALLOWINT,%sr
 
-       movel   %sp,%d1                 /* get thread_info pointer */
-       andl    #-THREAD_SIZE,%d1
-       movel   %d1,%a2
+       getthreadinfo
 1:
-       move    %a2@(TINFO_FLAGS),%d1   /* thread_info->flags */
+       /* check if any of the flags are set */
+       moveb   %a2@(TINFO_FLAGS + 3),%d1       /* thread_info->flags (low 8 bits) */
        jne     Lwork_to_do
        RESTORE_ALL
 
 Lwork_to_do:
-       movel   %a2@(TINFO_FLAGS),%d1   /* thread_info->flags */
+       /* check if reschedule needs to be called */
        btst    #TIF_NEED_RESCHED,%d1
        jne     reschedule