amd64: add delay_fini()
authorcheloha <cheloha@openbsd.org>
Tue, 8 Nov 2022 14:46:51 +0000 (14:46 +0000)
committercheloha <cheloha@openbsd.org>
Tue, 8 Nov 2022 14:46:51 +0000 (14:46 +0000)
Not all of the clocks with a delay(9) implementation necessarily keep
ticking across suspend/resume.  We need a clean way to reverse
delay_init() during suspend when those clocks stop ticking.

Hence, delay_fini().  delay_fini() resets delay_func() to
i8254_delay() if the given function pointer is the active delay(9)
implementation.

ok mlarkin@

sys/arch/amd64/amd64/machdep.c
sys/arch/amd64/include/cpu.h

index b733ce6..06acb92 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: machdep.c,v 1.282 2022/10/30 17:43:39 guenther Exp $  */
+/*     $OpenBSD: machdep.c,v 1.283 2022/11/08 14:46:51 cheloha Exp $   */
 /*     $NetBSD: machdep.c,v 1.3 2003/05/07 22:58:18 fvdl Exp $ */
 
 /*-
@@ -2073,12 +2073,22 @@ check_context(const struct reg *regs, struct trapframe *tf)
        return 0;
 }
 
+int amd64_delay_quality;
+
 void
 delay_init(void(*fn)(int), int fn_quality)
 {
-       static int cur_quality = 0;
-       if (fn_quality > cur_quality) {
+       if (fn_quality > amd64_delay_quality) {
                delay_func = fn;
-               cur_quality = fn_quality;
+               amd64_delay_quality = fn_quality;
+       }
+}
+
+void
+delay_fini(void (*fn)(int))
+{
+       if (fn == delay_func) {
+               delay_func = i8254_delay;
+               amd64_delay_quality = 0;
        }
 }
index 1a8c6dd..d5ce2f5 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: cpu.h,v 1.151 2022/09/20 14:28:27 robert Exp $        */
+/*     $OpenBSD: cpu.h,v 1.152 2022/11/08 14:46:51 cheloha Exp $       */
 /*     $NetBSD: cpu.h,v 1.1 2003/04/26 18:39:39 fvdl Exp $     */
 
 /*-
@@ -360,6 +360,7 @@ void signotify(struct proc *);
  * We need a machine-independent name for this.
  */
 extern void (*delay_func)(int);
+void delay_fini(void (*)(int));
 void delay_init(void (*)(int), int);
 struct timeval;