aboutsummaryrefslogtreecommitdiff
path: root/hw/timer
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2024-07-10 11:56:35 +0200
committerPaolo Bonzini <pbonzini@redhat.com>2024-07-16 18:18:24 +0200
commitc9669d6d5741f7aa86e160c5e42979f90d25d168 (patch)
tree54ccd4eb88188508769dcdecf5df104ca7b340cc /hw/timer
parentde12ebfdabe224597f624827ad57348b83e7d88a (diff)
downloadqemu-c9669d6d5741f7aa86e160c5e42979f90d25d168.zip
qemu-c9669d6d5741f7aa86e160c5e42979f90d25d168.tar.gz
qemu-c9669d6d5741f7aa86e160c5e42979f90d25d168.tar.bz2
hpet: fix clamping of period
When writing a new period, the clamping should use a maximum value rather tyhan a bit mask. Also, when writing the high bits new_val is shifted right by 32, so the maximum allowed period should also be shifted right. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'hw/timer')
-rw-r--r--hw/timer/hpet.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/hw/timer/hpet.c b/hw/timer/hpet.c
index 01efe48..ad88144 100644
--- a/hw/timer/hpet.c
+++ b/hw/timer/hpet.c
@@ -548,7 +548,9 @@ static void hpet_ram_write(void *opaque, hwaddr addr,
* FIXME: Clamp period to reasonable min value?
* Clamp period to reasonable max value
*/
- new_val &= (timer->config & HPET_TN_32BIT ? ~0u : ~0ull) >> 1;
+ if (timer->config & HPET_TN_32BIT) {
+ new_val = MIN(new_val, ~0u >> 1);
+ }
timer->period =
(timer->period & 0xffffffff00000000ULL) | new_val;
}
@@ -567,7 +569,7 @@ static void hpet_ram_write(void *opaque, hwaddr addr,
* FIXME: Clamp period to reasonable min value?
* Clamp period to reasonable max value
*/
- new_val &= (timer->config & HPET_TN_32BIT ? ~0u : ~0ull) >> 1;
+ new_val = MIN(new_val, ~0u >> 1);
timer->period =
(timer->period & 0xffffffffULL) | new_val << 32;
}