From df56dfc065de43134c81241805deb29868541c32 Mon Sep 17 00:00:00 2001 From: Greg Haerr Date: Mon, 28 Oct 2024 19:40:24 -0700 Subject: [PATCH] [kernel,libc] Fix precision timer get_ptime --- elks/arch/i86/lib/prectimer.c | 15 +++++++++++++-- libc/debug/prectimer.c | 15 +++++++++++++-- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/elks/arch/i86/lib/prectimer.c b/elks/arch/i86/lib/prectimer.c index 4eccaacb2..dd64dca96 100644 --- a/elks/arch/i86/lib/prectimer.c +++ b/elks/arch/i86/lib/prectimer.c @@ -2,6 +2,9 @@ * Precision timer routines for IBM PC and compatibles * 2 Aug 2024 Greg Haerr * + * This file is identical in elks/arch/i86/kernel/lib/prectimer.c (kernel) + * and libc/debug/prectimer.c (user mode). + * * Use 8254 PIT to measure elapsed time in pticks = 0.8381 usecs. */ @@ -109,14 +112,22 @@ unsigned long get_ptime(void) count = lo | hi; pticks = lastcount - count; + lastcount = count; +#if 1 + if ((int)pticks < 0) { /* wrapped, jiffies is higher */ + pticks += MAX_PTICK; /* = MAX_PTICK - count + lastcount */ + jdiff--; /* adjust jiffies for wrap, won't ever be negative */ + } + if (jdiff < 4286) /* < ~42.86s */ + return jdiff * (unsigned long)MAX_PTICK + pticks; +#else /* incorrect (old) version - to be removed */ if ((int)pticks < 0) /* wrapped */ pticks += MAX_PTICK; /* = MAX_PTICK - count + lastcount */ - lastcount = count; - if (jdiff < 2) /* < 10ms: 1..11931 */ return pticks; if (jdiff < 4286) /* < ~42.86s */ return (jdiff - 1) * (unsigned long)MAX_PTICK + pticks; +#endif return 0; /* overflow displays 0s */ } diff --git a/libc/debug/prectimer.c b/libc/debug/prectimer.c index 4eccaacb2..dd64dca96 100644 --- a/libc/debug/prectimer.c +++ b/libc/debug/prectimer.c @@ -2,6 +2,9 @@ * Precision timer routines for IBM PC and compatibles * 2 Aug 2024 Greg Haerr * + * This file is identical in elks/arch/i86/kernel/lib/prectimer.c (kernel) + * and libc/debug/prectimer.c (user mode). + * * Use 8254 PIT to measure elapsed time in pticks = 0.8381 usecs. */ @@ -109,14 +112,22 @@ unsigned long get_ptime(void) count = lo | hi; pticks = lastcount - count; + lastcount = count; +#if 1 + if ((int)pticks < 0) { /* wrapped, jiffies is higher */ + pticks += MAX_PTICK; /* = MAX_PTICK - count + lastcount */ + jdiff--; /* adjust jiffies for wrap, won't ever be negative */ + } + if (jdiff < 4286) /* < ~42.86s */ + return jdiff * (unsigned long)MAX_PTICK + pticks; +#else /* incorrect (old) version - to be removed */ if ((int)pticks < 0) /* wrapped */ pticks += MAX_PTICK; /* = MAX_PTICK - count + lastcount */ - lastcount = count; - if (jdiff < 2) /* < 10ms: 1..11931 */ return pticks; if (jdiff < 4286) /* < ~42.86s */ return (jdiff - 1) * (unsigned long)MAX_PTICK + pticks; +#endif return 0; /* overflow displays 0s */ }