From 5eedd1fa1dbdbda9304824955582ca38464dd911 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Thu, 22 Jan 2026 14:14:02 +0100 Subject: [PATCH] x86/HPET: don't arbitrarily cap delta in reprogram_hpet_evt_channel() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There's no reason to set an arbitrary upper bound of 10 seconds. We can simply set the comparator such that it'll take a whole cycle through all 32-bit values until the next interrupt would be raised. (For an extremely fast-running HPET [400 MHz and up] 10 seconds would also be too long.) Signed-off-by: Jan Beulich Reviewed-by: Roger Pau Monné --- xen/arch/x86/hpet.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/xen/arch/x86/hpet.c b/xen/arch/x86/hpet.c index 722a69ab13..1ea8ae4574 100644 --- a/xen/arch/x86/hpet.c +++ b/xen/arch/x86/hpet.c @@ -23,7 +23,6 @@ #include #include -#define MAX_DELTA_NS MILLISECS(10*1000) #define MIN_DELTA_NS MICROSECS(20) #define HPET_EVT_USED_BIT 0 @@ -164,10 +163,15 @@ static int reprogram_hpet_evt_channel( ASSERT(expire != STIME_MAX); - delta = min_t(int64_t, delta, MAX_DELTA_NS); delta = max_t(int64_t, delta, MIN_DELTA_NS); delta = ns2ticks(delta, ch->shift, ch->mult); + if ( delta > UINT32_MAX ) + { + hpet_write32(hpet_read32(HPET_COUNTER), HPET_Tn_CMP(ch->idx)); + return 0; + } + do { ret = hpet_next_event(delta, ch->idx); delta += delta;