From feadd4aebbda9b86e4ce0aaf9d11f27596b42ddb Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Thu, 11 Jun 2020 15:57:04 -0700 Subject: [PATCH] kernel - Refactor sysclock_t from 32 to 64 bits (2) * Cputimer reload values can be negative, check condition and set a small positive reload value instead. * Also avoids muldivu64() overflow warnings on the console. Reported-by: kworr --- sys/dev/virtual/hyperv/vmbus/vmbus.c | 2 ++ sys/platform/pc64/apic/lapic.c | 4 ++++ sys/platform/pc64/isa/clock.c | 2 ++ sys/platform/vkernel64/platform/systimer.c | 4 +++- 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/sys/dev/virtual/hyperv/vmbus/vmbus.c b/sys/dev/virtual/hyperv/vmbus/vmbus.c index 98f07e49e4..123a1fc6fd 100644 --- a/sys/dev/virtual/hyperv/vmbus/vmbus.c +++ b/sys/dev/virtual/hyperv/vmbus/vmbus.c @@ -360,6 +360,8 @@ vmbus_timer_intr_reload(struct cputimer_intr *cti, sysclock_t reload) struct vmbus_pcpu_data *psc = VMBUS_PCPU(sc, gd->gd_cpuid); uint64_t current; + if ((ssysclock_t)reload < 0) /* neg value */ + reload = 1; reload = muldivu64(reload, cti->freq, sys_cputimer->freq); current = hyperv_tc64() + reload; diff --git a/sys/platform/pc64/apic/lapic.c b/sys/platform/pc64/apic/lapic.c index 605baced84..11a75c1610 100644 --- a/sys/platform/pc64/apic/lapic.c +++ b/sys/platform/pc64/apic/lapic.c @@ -696,6 +696,8 @@ lapic_mem_timer_intr_reload(struct cputimer_intr *cti, sysclock_t reload) { struct globaldata *gd = mycpu; + if ((ssysclock_t)reload < 0) + reload = 1; reload = muldivu64(reload, cti->freq, sys_cputimer->freq); if (reload < 2) reload = 2; @@ -716,6 +718,8 @@ lapic_msr_timer_intr_reload(struct cputimer_intr *cti, sysclock_t reload) { struct globaldata *gd = mycpu; + if ((ssysclock_t)reload < 0) + reload = 1; reload = muldivu64(reload, cti->freq, sys_cputimer->freq); if (reload < 2) reload = 2; diff --git a/sys/platform/pc64/isa/clock.c b/sys/platform/pc64/isa/clock.c index 4ec0f40155..b856ba26d0 100644 --- a/sys/platform/pc64/isa/clock.c +++ b/sys/platform/pc64/isa/clock.c @@ -341,6 +341,8 @@ i8254_intr_reload(struct cputimer_intr *cti, sysclock_t reload) { uint16_t count; + if ((ssysclock_t)reload < 0) + reload = 1; if (i8254_cputimer_div) reload /= i8254_cputimer_div; else diff --git a/sys/platform/vkernel64/platform/systimer.c b/sys/platform/vkernel64/platform/systimer.c index 4d75a30853..f84a5b1bf2 100644 --- a/sys/platform/vkernel64/platform/systimer.c +++ b/sys/platform/vkernel64/platform/systimer.c @@ -292,7 +292,9 @@ rescan: static void vktimer_intr_reload(struct cputimer_intr *cti __unused, sysclock_t reload) { - if (reload >= sys_cputimer->freq) + if ((ssysclock_t)reload < 0) /* neg value */ + reload = 1; + if (reload >= sys_cputimer->freq) /* max one second */ reload = sys_cputimer->freq; reload += sys_cputimer->count(); vktimer_reload[mycpu->gd_cpuid] = reload; -- 2.41.0