]> git.ipfire.org Git - thirdparty/kernel/linux.git/commit
x86/fred/signal: Prevent immediate repeat of single step trap on return from SIGTRAP...
authorXin Li (Intel) <xin@zytor.com>
Mon, 9 Jun 2025 08:40:53 +0000 (01:40 -0700)
committerDave Hansen <dave.hansen@linux.intel.com>
Mon, 9 Jun 2025 15:50:58 +0000 (08:50 -0700)
commite34dbbc85d64af59176fe59fad7b4122f4330fe2
treec0a6f80cd70968e37999c0cc10e773ed60a1e987
parent19272b37aa4f83ca52bdf9c16d5d81bdd1354494
x86/fred/signal: Prevent immediate repeat of single step trap on return from SIGTRAP handler

Clear the software event flag in the augmented SS to prevent immediate
repeat of single step trap on return from SIGTRAP handler if the trap
flag (TF) is set without an external debugger attached.

Following is a typical single-stepping flow for a user process:

1) The user process is prepared for single-stepping by setting
   RFLAGS.TF = 1.
2) When any instruction in user space completes, a #DB is triggered.
3) The kernel handles the #DB and returns to user space, invoking the
   SIGTRAP handler with RFLAGS.TF = 0.
4) After the SIGTRAP handler finishes, the user process performs a
   sigreturn syscall, restoring the original state, including
   RFLAGS.TF = 1.
5) Goto step 2.

According to the FRED specification:

A) Bit 17 in the augmented SS is designated as the software event
   flag, which is set to 1 for FRED event delivery of SYSCALL,
   SYSENTER, or INT n.
B) If bit 17 of the augmented SS is 1 and ERETU would result in
   RFLAGS.TF = 1, a single-step trap will be pending upon completion
   of ERETU.

In step 4) above, the software event flag is set upon the sigreturn
syscall, and its corresponding ERETU would restore RFLAGS.TF = 1.
This combination causes a pending single-step trap upon completion of
ERETU.  Therefore, another #DB is triggered before any user space
instruction is executed, which leads to an infinite loop in which the
SIGTRAP handler keeps being invoked on the same user space IP.

Fixes: 14619d912b65 ("x86/fred: FRED entry/exit and dispatch code")
Suggested-by: H. Peter Anvin (Intel) <hpa@zytor.com>
Signed-off-by: Xin Li (Intel) <xin@zytor.com>
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Tested-by: Sohil Mehta <sohil.mehta@intel.com>
Cc:stable@vger.kernel.org
Link: https://lore.kernel.org/all/20250609084054.2083189-2-xin%40zytor.com
arch/x86/include/asm/sighandling.h
arch/x86/kernel/signal_32.c
arch/x86/kernel/signal_64.c