amd64: MCOUNT_EXIT: restore interrupts, don't unconditionally reenable them
authorcheloha <cheloha@openbsd.org>
Tue, 27 Jun 2023 10:11:15 +0000 (10:11 +0000)
committercheloha <cheloha@openbsd.org>
Tue, 27 Jun 2023 10:11:15 +0000 (10:11 +0000)
This bug can cause all sorts of problems, but in particular it was
most easily reproduced as a double fault in the syscall return path on
this CPU model:

Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz

Tons of help from guenther@ in narrowing down the root cause.  Fix
tweaked by guenther@.  Additional input from deraadt@ and kettenis@.

ok guenther@

sys/arch/amd64/include/profile.h

index 7f63b92..cee8838 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: profile.h,v 1.5 2021/09/04 22:15:33 bluhm Exp $       */
+/*     $OpenBSD: profile.h,v 1.6 2023/06/27 10:11:15 cheloha Exp $     */
 /*     $NetBSD: profile.h,v 1.3 2003/11/28 23:22:45 fvdl Exp $ */
 
 /*
@@ -72,6 +72,6 @@ __asm(" .globl __mcount               \n"                     \
 
 
 #ifdef _KERNEL
-#define MCOUNT_ENTER   (void)&s; __asm__("cli");
-#define MCOUNT_EXIT    __asm__("sti");
+#define MCOUNT_ENTER   s = intr_disable()
+#define MCOUNT_EXIT    intr_restore(s)
 #endif /* _KERNEL */