NetBSD/src VTAMXypsys/arch/amd64/amd64 machdep.c, sys/compat/linux/arch/amd64 linux_machdep.c

   Fix a tiny race in setregs and linux_setregs. Between the moment we set
   pcb_flags to zero, and the moment cpu_segregs64_zero resets pcb_gs, we may
   be preempted.

   If this happens, and if the calling LWP was a 32bit thread, when switching
   back to that LWP, the context switcher sees that PCB_COMPAT32 is not set in
   pcb_flags and tries to perform a 64bit context switch; but pcb_gs contains
   a 32bit GDT descriptor, and not a 64bit GS.base value. The wrmsr therefore
   faults because the value is non-canonical, and this fault is fatal.

   Rearrange the code so that the update of pcb_flags and pcb_gs/pcb_fs is non
   interruptible. This fixes the problem, tested with a reproducer (which
   therefore doesn't work anymore).

   Likely fixes PR/53993.
VersionDeltaFile
1.328+7-7sys/arch/amd64/amd64/machdep.c
1.57+6-5sys/compat/linux/arch/amd64/linux_machdep.c
+13-122 files

UnifiedSplitRaw